Bird
Raised Fist0
Nginxdevops~5 mins

Regex match (~, ~*) in Nginx - Commands & Configuration

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction
Sometimes you want to control how web requests are handled based on patterns in the URL. Nginx lets you use regular expressions to match these patterns and decide what to do with the request.
When you want to serve different content based on parts of the URL that follow a pattern.
When you need to block or allow requests matching certain URL patterns.
When you want to rewrite URLs that match specific patterns.
When you want to route requests to different backend servers based on URL patterns.
When you want to add security rules that apply only to URLs matching certain patterns.
Config File - nginx.conf
nginx.conf
events {}
http {
    server {
        listen 8080;

        # Case-sensitive regex match (~)
        location ~ ^/images/.*\.jpg$ {
            root /var/www/images;
            # This matches URLs starting with /images/ and ending with .jpg exactly
        }

        # Case-insensitive regex match (~*)
        location ~* ^/videos/.*\.mp4$ {
            root /var/www/videos;
            # This matches URLs starting with /videos/ and ending with .mp4 ignoring case
        }

        # Default location
        location / {
            root /var/www/html;
        }
    }
}

This nginx.conf file sets up a server listening on port 8080.

The location ~ block uses a case-sensitive regular expression to match URLs starting with /images/ and ending with .jpg. Requests matching this pattern serve files from /var/www/images.

The location ~* block uses a case-insensitive regular expression to match URLs starting with /videos/ and ending with .mp4. Requests matching this pattern serve files from /var/www/videos.

The default location / block serves all other requests from /var/www/html.

Commands
Check the nginx configuration file for syntax errors before applying it.
Terminal
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
systemctl reload nginx
Expected OutputExpected
No output (command runs silently)
Send a request to test the case-sensitive regex location matching .jpg images under /images.
Terminal
curl -I http://localhost:8080/images/sample.jpg
Expected OutputExpected
HTTP/1.1 200 OK Server: nginx Date: Thu, 01 Jun 2024 12:00:00 GMT Content-Type: image/jpeg Content-Length: 12345 Connection: keep-alive
Send a request to test the case-insensitive regex location matching .mp4 videos under /videos.
Terminal
curl -I http://localhost:8080/videos/Sample.MP4
Expected OutputExpected
HTTP/1.1 200 OK Server: nginx Date: Thu, 01 Jun 2024 12:00:05 GMT Content-Type: video/mp4 Content-Length: 67890 Connection: keep-alive
Key Concept

If you remember nothing else from this pattern, remember: the tilde (~) means case-sensitive regex match and tilde-star (~*) means case-insensitive regex match in nginx location blocks.

Common Mistakes
Using ~ instead of ~* when you want case-insensitive matching.
The regex will only match URLs with exact letter case, causing some requests to fail matching.
Use ~* for case-insensitive regex matching when URL letter case can vary.
Placing regex location blocks after prefix location blocks expecting them to match first.
Nginx matches regex locations after prefix locations, so order matters for matching priority.
Place regex location blocks before prefix ones or understand nginx matching order to ensure correct matching.
Not escaping special characters like dot (.) in regex patterns.
Dot means any character in regex, so not escaping it causes unintended matches.
Escape dots with backslash (\.) to match literal dots in URLs.
Summary
Use ~ in nginx location blocks for case-sensitive regex URL matching.
Use ~* in nginx location blocks for case-insensitive regex URL matching.
Always test nginx config with 'nginx -t' before reloading to avoid errors.
Regex location blocks help serve or route requests based on URL patterns.

Practice

(1/5)
1. What does the ~ operator mean in an nginx location block?
easy
A. It matches any request regardless of URL.
B. It performs a case-insensitive regular expression match.
C. It performs a case-sensitive regular expression match.
D. It matches the exact string only.

Solution

  1. Step 1: Understand nginx regex operators

    The ~ operator in nginx is used for regex matching that is case-sensitive.
  2. Step 2: Differentiate from ~*

    The ~* operator is for case-insensitive regex matching, so it is different from ~.
  3. Final Answer:

    It performs a case-sensitive regular expression match. -> Option C
  4. Quick Check:

    ~ = case-sensitive regex match [OK]
Hint: Remember: ~ is case-sensitive, ~* is case-insensitive [OK]
Common Mistakes:
  • Confusing ~ with ~* for case sensitivity
  • Thinking ~ matches exact strings only
  • Assuming ~ matches all requests
2. Which of the following is the correct syntax to match URLs case-insensitively using regex in nginx?
easy
A. location ~* /images/ { }
B. location = /images/ { }
C. location ~ /images/ { }
D. location /images/ { }

Solution

  1. Step 1: Identify case-insensitive regex syntax

    In nginx, ~* is used for case-insensitive regex matching.
  2. Step 2: Check other options

    ~ is case-sensitive, = is exact match, and no operator means prefix match.
  3. Final Answer:

    location ~* /images/ { } -> Option A
  4. Quick Check:

    Case-insensitive regex = ~* [OK]
Hint: Use ~* for case-insensitive regex in nginx location [OK]
Common Mistakes:
  • Using ~ instead of ~* for case-insensitive matching
  • Confusing exact match (=) with regex
  • Omitting regex operator for regex matching
3. Given this nginx config snippet:
location ~* \.jpg$ {
  return 200 'Image file matched';
}

What will be the response for a request to /photos/Sunset.JPG?
medium
A. 404 Not Found
B. 500 Internal Server Error
C. 200 with empty body
D. 200 with 'Image file matched'

Solution

  1. Step 1: Analyze the regex and operator

    The ~* operator means case-insensitive regex match. The regex \.jpg$ matches strings ending with '.jpg' ignoring case.
  2. Step 2: Check the request URL

    The request is /photos/Sunset.JPG, which ends with '.JPG' (uppercase). Case-insensitive match succeeds.
  3. Final Answer:

    200 with 'Image file matched' -> Option D
  4. Quick Check:

    Case-insensitive regex matches .JPG [OK]
Hint: ~* ignores case, so .JPG matches \.jpg$ regex [OK]
Common Mistakes:
  • Assuming regex is case-sensitive with ~*
  • Ignoring the $ end anchor in regex
  • Confusing response codes returned
4. Identify the error in this nginx location block:
location ~* /images/(.*\.png$ {
  proxy_pass http://backend;
}
medium
A. Missing closing parenthesis in regex
B. Using ~* instead of ~ for case-sensitive match
C. proxy_pass URL is invalid
D. location block missing curly braces

Solution

  1. Step 1: Check regex syntax

    The regex /images/(.*\.png$ has an opening parenthesis but no closing parenthesis.
  2. Step 2: Validate other parts

    The ~* operator is valid for case-insensitive match, proxy_pass URL looks valid, and curly braces are present.
  3. Final Answer:

    Missing closing parenthesis in regex -> Option A
  4. Quick Check:

    Regex parentheses must be balanced [OK]
Hint: Count parentheses in regex to avoid syntax errors [OK]
Common Mistakes:
  • Forgetting to close parentheses in regex
  • Confusing ~ and ~* usage
  • Ignoring syntax errors in regex patterns
5. You want to serve all URLs ending with .css or .CSS using a regex match in nginx. Which location block correctly matches both cases efficiently?
hard
A. location ~ \.css$ { }
B. location ~* \.css$ { }
C. location ~ \.css$|\.CSS$ { }
D. location ~* \.css$|\.CSS$ { }

Solution

  1. Step 1: Understand case-insensitive matching

    Using ~* makes the regex case-insensitive, so it matches both '.css' and '.CSS'.
  2. Step 2: Evaluate other options

    location ~ \.css$ { } uses case-sensitive ~, so it misses '.CSS'. Options C and D have incorrect regex syntax with unescaped pipes and redundant patterns.
  3. Final Answer:

    location ~* \.css$ { } -> Option B
  4. Quick Check:

    Use ~* for simple case-insensitive regex [OK]
Hint: Use ~* with simple regex to match case-insensitive extensions [OK]
Common Mistakes:
  • Using ~ and missing uppercase matches
  • Trying to match cases with complex regex instead of ~*
  • Incorrect escaping of regex special characters