Bird
Raised Fist0
Nginxdevops~20 mins

Preferential prefix match (^~) in Nginx - Practice Problems & Coding Challenges

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
Challenge - 5 Problems
🎖️
Nginx Location Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
💻 Command Output
intermediate
2:00remaining
What is the effect of the ^~ prefix in this nginx location block?
Consider this nginx configuration snippet:
location ^~ /images/ {
    root /data;
}

What does the ^~ prefix do when a request URL starts with /images/?
AIt matches /images/ only if no exact match is found.
BIt matches the prefix /images/ preferentially and stops searching further regex locations.
CIt treats /images/ as a regex pattern and matches accordingly.
DIt matches /images/ only if the request method is POST.
Attempts:
2 left
💡 Hint
Think about how nginx chooses location blocks when multiple matches exist.
🧠 Conceptual
intermediate
2:00remaining
How does nginx prioritize location blocks with ^~, =, and regex?
Given these location blocks:
location = /exact {
    ...
}
location ^~ /prefix/ {
    ...
}
location ~* \.php$ {
    ...
}

Which order does nginx use to select the matching location for a request?
AExact match (=) first, then ^~ prefix match, then regex (~ or ~*), then normal prefix matches.
BRegex (~ or ~*) first, then exact (=), then ^~ prefix, then normal prefix matches.
CExact (=) and regex (~ or ~*) have equal priority, ^~ prefix is last.
DNormal prefix matches first, then exact (=), then regex (~ or ~*), then ^~ prefix.
Attempts:
2 left
💡 Hint
Remember nginx tries exact matches before anything else.
Troubleshoot
advanced
2:00remaining
Why is the regex location block ignored despite matching the request?
Given this nginx config:
location ^~ /api/ {
    proxy_pass http://backend;
}
location ~ /api/v[0-9]+/ {
    proxy_pass http://versioned-backend;
}

Requests to /api/v2/users are always handled by http://backend. Why?
ABecause ^~ prefix match stops regex location checks once matched.
BBecause regex locations have higher priority than ^~ prefix matches.
CBecause proxy_pass directives cannot be used in regex locations.
DBecause the regex location pattern is invalid and ignored.
Attempts:
2 left
💡 Hint
Think about how ^~ affects regex location evaluation.
🔀 Workflow
advanced
2:00remaining
Order the steps nginx follows to select a location block with ^~ and regex
Arrange the steps nginx takes to select a location block when both ^~ and regex locations exist.
A2,1,3,4
B1,3,2,4
C1,2,3,4
D3,1,2,4
Attempts:
2 left
💡 Hint
Exact matches are checked first, then ^~, then regex.
Best Practice
expert
2:00remaining
Which configuration ensures static files under /static/ are served directly, bypassing regex locations?
You want nginx to serve static files under /static/ directly and not check regex locations. Which location block achieves this?
A
location ~ ^/static/ {
    root /var/www/static;
}
B
location = /static/ {
    root /var/www/static;
}
C
location /static/ {
    root /var/www/static;
}
D
location ^~ /static/ {
    root /var/www/static;
}
Attempts:
2 left
💡 Hint
Use the prefix match that stops regex evaluation.

Practice

(1/5)
1. What does the ^~ prefix in an nginx location block do?
easy
A. It tells nginx to prefer this prefix match and skip regex checks.
B. It makes nginx perform a case-insensitive match.
C. It enables regex matching for the location.
D. It disables all other location matches.

Solution

  1. Step 1: Understand nginx location matching

    nginx checks location blocks in order: exact, prefix, regex. The ^~ prefix tells nginx to prefer this prefix match and stop searching further.
  2. Step 2: Effect of ^~ prefix

    This means nginx will not check regex locations if this prefix matches, improving performance for static or specific URL prefixes.
  3. Final Answer:

    It tells nginx to prefer this prefix match and skip regex checks. -> Option A
  4. Quick Check:

    ^~ means prefer prefix and skip regex [OK]
Hint: Remember ^~ means prefer prefix, skip regex checks [OK]
Common Mistakes:
  • Confusing ^~ with regex (~ or ~*)
  • Thinking ^~ makes match case-insensitive
  • Assuming ^~ disables all other matches
2. Which of the following is the correct syntax to define a location block with preferential prefix match in nginx?
easy
A. location ~ /images/ { }
B. location ^~ /images/ { }
C. location ^ /images/ { }
D. location ~^ /images/ { }

Solution

  1. Step 1: Identify correct prefix syntax

    The preferential prefix match uses ^~ immediately after the word location.
  2. Step 2: Check each option

    location ^~ /images/ { } uses location ^~ /images/ { } which is correct. location ~^ /images/ { } mixes regex and prefix incorrectly. location ^ /images/ { } uses invalid ^ alone. location ~ /images/ { } uses regex ~ which is not preferential prefix.
  3. Final Answer:

    location ^~ /images/ { } -> Option B
  4. Quick Check:

    Correct syntax for preferential prefix = location ^~ [OK]
Hint: Look for 'location ^~' to define preferential prefix [OK]
Common Mistakes:
  • Using ~ or ~* instead of ^~ for prefix match
  • Placing ^~ after the path instead of after location
  • Omitting the space between ^~ and path
3. Given this nginx config snippet, which location block will handle the request for URL /static/css/style.css?
location /static/ {
  root /var/www/html;
}
location ^~ /static/css/ {
  root /var/www/css_files;
}
location ~* \.css$ {
  root /var/www/css_regex;
}
medium
A. The block with location /static/
B. The block with location ~* \.css$
C. No block matches; default server root is used
D. The block with location ^~ /static/css/

Solution

  1. Step 1: Identify matching locations for URL

    The URL /static/css/style.css matches all three locations: prefix /static/, preferential prefix ^~ /static/css/, and regex ~* \.css$.
  2. Step 2: Apply nginx matching order with ^~

    nginx prefers exact match first, then ^~ prefix matches, then regex. Since ^~ /static/css/ matches, nginx stops searching and uses this block.
  3. Final Answer:

    The block with location ^~ /static/css/ -> Option D
  4. Quick Check:

    ^~ prefix match stops regex checks [OK]
Hint: ^~ prefix match beats regex for matching URLs [OK]
Common Mistakes:
  • Choosing regex block because of file extension
  • Ignoring ^~ priority over regex
  • Assuming longest prefix always wins without ^~
4. You have this nginx config:
location ^~ /app/ {
  proxy_pass http://backend;
}
location ~ /app/secure/ {
  proxy_pass http://secure_backend;
}
But requests to /app/secure/login are handled by http://backend. What is the problem?
medium
A. The regex location syntax is incorrect and ignored.
B. The proxy_pass directive is missing a trailing slash.
C. The ^~ prefix match prevents regex location from being used.
D. nginx does not support mixing ^~ and regex locations.

Solution

  1. Step 1: Understand nginx location matching with ^~

    The ^~ prefix tells nginx to prefer this prefix match and skip regex checks if matched.
  2. Step 2: Analyze why regex location is ignored

    Since /app/secure/login matches ^~ /app/, nginx stops searching and uses that block, ignoring the regex location.
  3. Final Answer:

    The ^~ prefix match prevents regex location from being used. -> Option C
  4. Quick Check:

    ^~ stops regex location checks [OK]
Hint: ^~ disables regex locations if prefix matches [OK]
Common Mistakes:
  • Thinking regex overrides ^~ prefix
  • Believing proxy_pass syntax causes this issue
  • Assuming nginx can't mix ^~ and regex locations
5. You want nginx to serve static files from /var/www/static for URLs starting with /static/, and use regex locations for other patterns. Which config correctly uses ^~ to optimize performance?
hard
A. location ^~ /static/ { root /var/www/static; } location ~ \.php$ { fastcgi_pass unix:/run/php.sock; }
B. location /static/ { root /var/www/static; } location ^~ ~ \.php$ { fastcgi_pass unix:/run/php.sock; }
C. location ~ ^/static/ { root /var/www/static; } location ~ \.php$ { fastcgi_pass unix:/run/php.sock; }
D. location ~* /static/ { root /var/www/static; } location ^~ \.php$ { fastcgi_pass unix:/run/php.sock; }

Solution

  1. Step 1: Use ^~ for static file prefix

    To prioritize static files under /static/ and skip regex checks, use location ^~ /static/ { root /var/www/static; }.
  2. Step 2: Define regex location for PHP files

    Regex location for PHP files is defined with location ~ \.php$ { ... }. This will be checked only if ^~ prefix does not match.
  3. Step 3: Validate options

    location ^~ /static/ { root /var/www/static; } location ~ \.php$ { fastcgi_pass unix:/run/php.sock; } correctly uses ^~ prefix for static and regex for PHP. Other options misuse syntax or combine prefixes incorrectly.
  4. Final Answer:

    location ^~ /static/ { root /var/www/static; } with regex location for PHP -> Option A
  5. Quick Check:

    Use ^~ for static prefix, regex for others [OK]
Hint: Use ^~ for static prefixes, regex for patterns [OK]
Common Mistakes:
  • Mixing ^~ with regex in one location
  • Using regex (~) for static prefix
  • Incorrect syntax combining ^~ and regex