Bird
Raised Fist0
Nginxdevops~3 mins

Why Regex match (~, ~*) in Nginx? - Purpose & Use Cases

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
The Big Idea

What if one simple pattern could replace dozens of confusing rules in your server config?

The Scenario

Imagine you have a website with many pages, and you want to control access or behavior based on URL patterns. Without regex, you try to write many separate rules for each URL, like checking if the URL contains certain words or ends with specific extensions.

The Problem

Manually writing many rules for each URL pattern is slow and confusing. It's easy to make mistakes, miss some URLs, or create overlapping rules that cause unexpected behavior. Updating these rules takes a lot of time and can break your site.

The Solution

Using regex match operators (~ for case-sensitive, ~* for case-insensitive) in nginx lets you write one clear rule that matches many URL patterns at once. This makes your configuration simpler, faster, and easier to maintain.

Before vs After
Before
location /images/ {
  # separate rules for jpg, png, gif
}
location /images/jpg/ {
  # rule for jpg
}
location /images/png/ {
  # rule for png
}
After
location ~* "/images/.*\.(jpg|png|gif)$" {
  # one rule for all image types
}
What It Enables

You can easily match complex URL patterns with one simple rule, saving time and reducing errors in your server configuration.

Real Life Example

For example, a website serving images can use regex to allow caching for all image files regardless of their folder or case, instead of writing many separate rules for each image type and folder.

Key Takeaways

Manual URL matching is slow and error-prone.

Regex match (~, ~*) simplifies pattern matching in nginx.

One regex rule can replace many manual rules, making configs cleaner and easier to update.

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