Bird
Raised Fist0
Nginxdevops~5 mins

Trailing slash normalization in Nginx - Commands & Configuration

Choose your learning style10 modes available
Introduction
Web servers often receive URLs with or without a slash at the end. Trailing slash normalization makes sure users always get the same URL style, avoiding duplicate content and broken links.
When you want all URLs to end with a slash for consistency.
When you want to remove trailing slashes to keep URLs clean.
When search engines should see only one version of each page URL.
When your application expects URLs in a specific format with or without trailing slash.
When you want to avoid 404 errors caused by inconsistent URL slashes.
Config File - nginx.conf
nginx.conf
server {
    listen 80;
    server_name example.com;

    # Redirect URLs with trailing slash to without trailing slash
    location / {
        if ($request_uri ~ ".+/$") {
            return 301 $scheme://$host$uri;
        }

        # Your usual processing here
        try_files $uri $uri/ =404;
    }
}

This configuration listens on port 80 for example.com.

The if block checks if the URL ends with a slash and redirects to the same URL without the slash using a 301 permanent redirect.

The try_files directive tries to serve the file or directory or returns 404 if not found.

Commands
Check the nginx configuration file syntax to make sure there are no errors before reloading.
Terminal
sudo nginx -t
Expected OutputExpected
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
Reload nginx to apply the new configuration without stopping the server.
Terminal
sudo systemctl reload nginx
Expected OutputExpected
No output (command runs silently)
Test the redirect by requesting a URL with a trailing slash and checking the HTTP headers.
Terminal
curl -I http://example.com/path/
Expected OutputExpected
HTTP/1.1 301 Moved Permanently Server: nginx Date: Wed, 01 Jan 2025 12:00:00 GMT Content-Type: text/html Content-Length: 178 Location: http://example.com/path Connection: keep-alive
Request the URL without trailing slash to confirm it loads normally without redirect.
Terminal
curl -I http://example.com/path
Expected OutputExpected
HTTP/1.1 200 OK Server: nginx Date: Wed, 01 Jan 2025 12:00:01 GMT Content-Type: text/html Content-Length: 1234 Connection: keep-alive
Key Concept

If you remember nothing else from this pattern, remember: use nginx redirects to enforce a consistent trailing slash style to avoid duplicate URLs and broken links.

Common Mistakes
Using 'if' inside 'location' without proper conditions causing unexpected behavior.
Improper 'if' usage can cause nginx to behave unpredictably or ignore the redirect.
Use simple regex in 'if' to detect trailing slash and return 301 redirect carefully, or use 'rewrite' directives outside 'location' blocks.
Not testing nginx config syntax before reload.
Reloading with syntax errors can cause nginx to fail and downtime.
Always run 'nginx -t' to verify config before reloading.
Redirecting all URLs blindly without preserving query strings.
Query parameters get lost, breaking user requests or tracking.
Use variables like $request_uri or $args to preserve query strings in redirects.
Summary
Configure nginx to detect URLs with trailing slashes and redirect them to the version without trailing slash.
Test the configuration syntax with 'nginx -t' before reloading nginx to apply changes.
Use curl commands to verify that URLs with trailing slashes redirect properly and URLs without trailing slashes load normally.

Practice

(1/5)
1. What is the main purpose of trailing slash normalization in nginx?
easy
A. To disable URL rewriting completely
B. To block all URLs that end with a slash
C. To serve different content based on trailing slash presence
D. To ensure URLs are consistent by adding or removing trailing slashes

Solution

  1. Step 1: Understand URL consistency

    Trailing slash normalization makes URLs uniform by either adding or removing the slash at the end.
  2. Step 2: Identify nginx role

    nginx uses redirects to enforce this consistency, improving user experience and SEO.
  3. Final Answer:

    To ensure URLs are consistent by adding or removing trailing slashes -> Option D
  4. Quick Check:

    Trailing slash normalization = URL consistency [OK]
Hint: Normalization means making URLs uniform with or without slash [OK]
Common Mistakes:
  • Thinking it blocks URLs ending with slash
  • Confusing normalization with disabling rewriting
  • Assuming different content is served based on slash
2. Which nginx directive is used to redirect URLs for trailing slash normalization?
easy
A. proxy_pass
B. return 301
C. listen
D. root

Solution

  1. Step 1: Identify redirect directive

    nginx uses return 301 to send permanent redirects for URL changes.
  2. Step 2: Confirm other directives' roles

    proxy_pass forwards requests, listen sets ports, root sets file paths, none redirect URLs.
  3. Final Answer:

    return 301 -> Option B
  4. Quick Check:

    Redirect = return 301 [OK]
Hint: Redirects use 'return 301' in nginx config [OK]
Common Mistakes:
  • Using proxy_pass for redirects
  • Confusing listen with redirect
  • Using root directive incorrectly
3. Given this nginx snippet, what happens when a user visits /example/?
location /example {
  if ($request_uri ~ ".+/$") {
    return 301 $scheme://$host$uri;
  }
}
medium
A. The URL is redirected to /example without trailing slash
B. The URL stays as /example/ with trailing slash
C. The server returns a 404 error
D. The URL is redirected to /example// with double slash

Solution

  1. Step 1: Analyze the if condition

    The condition checks if the URL ends with a slash using regex ".+/$".
  2. Step 2: Understand the redirect

    If true, it returns a 301 redirect to the same URL but without the trailing slash (because $uri excludes query string and trailing slash).
  3. Final Answer:

    The URL is redirected to /example without trailing slash -> Option A
  4. Quick Check:

    Trailing slash removed by redirect = The URL is redirected to /example without trailing slash [OK]
Hint: If URL ends with slash, return 301 redirects to no slash [OK]
Common Mistakes:
  • Assuming URL stays unchanged
  • Thinking server returns 404
  • Expecting double slashes in redirect
4. Identify the error in this nginx config for adding trailing slashes:
location / {
  if ($request_uri !~ "/$") {
    return 301 $scheme://$host$uri/;
  }
}
medium
A. Using $request_uri instead of $uri causes double query strings
B. Missing semicolon after return statement
C. The regex should check for trailing slash presence, not absence
D. Using if inside location is not allowed

Solution

  1. Step 1: Understand variables used

    $request_uri includes query string, $uri does not. Adding slash to $uri is safer.
  2. Step 2: Identify problem with $request_uri

    Appending slash to $request_uri can cause double query strings or malformed URLs.
  3. Final Answer:

    Using $request_uri instead of $uri causes double query strings -> Option A
  4. Quick Check:

    Use $uri for clean URL redirects [OK]
Hint: Use $uri, not $request_uri, to avoid query duplication [OK]
Common Mistakes:
  • Thinking if inside location is forbidden
  • Ignoring query string issues
  • Misreading regex logic
5. How would you configure nginx to always add a trailing slash to URLs except for requests to files (like .html or .jpg)?
hard
A. Use proxy_pass to add trailing slash
B. Always append slash to all URLs unconditionally
C. Use an if condition to check if URI lacks slash and does not end with a file extension, then return 301 with slash
D. Disable trailing slash normalization for all URLs

Solution

  1. Step 1: Define condition for adding slash

    Check if URL does not end with slash and does not match file extensions like .html, .jpg.
  2. Step 2: Use if and return 301 for redirect

    Use nginx if directive with regex to exclude files, then redirect to URL with trailing slash.
  3. Final Answer:

    Use an if condition to check if URI lacks slash and does not end with a file extension, then return 301 with slash -> Option C
  4. Quick Check:

    Conditional redirect excluding files = Use an if condition to check if URI lacks slash and does not end with a file extension, then return 301 with slash [OK]
Hint: Exclude files by regex, redirect others with slash [OK]
Common Mistakes:
  • Appending slash to all URLs including files
  • Using proxy_pass for redirects
  • Disabling normalization entirely
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard