What if you could instantly direct thousands of web visitors with just a simple rule?
Why Prefix match in Nginx? - Purpose & Use Cases
Start learning this pattern below
Jump into concepts and practice - no test required
Imagine you have a busy website with many pages, and you want to send all requests starting with /blog/ to a special server. Doing this by checking each URL manually would be like sorting thousands of letters by hand every day.
Manually checking each URL prefix is slow and easy to mess up. You might forget some paths or write complicated rules that break often. This causes delays and errors, frustrating visitors and admins alike.
Using prefix match in nginx lets you quickly and reliably catch all URLs that start with a certain string. It's like having a smart mail sorter that instantly knows where to send every letter based on the first few words.
if ($request_uri ~ ^/blog/) { proxy_pass http://blogserver; }location /blog/ { proxy_pass http://blogserver; }It enables fast, clear, and error-free routing of web requests based on URL beginnings, making your site more efficient and easier to manage.
A news website routes all /sports/ pages to a dedicated sports server using prefix match, ensuring fans get their updates quickly without delays.
Manual URL checks are slow and error-prone.
Prefix match simplifies routing by matching URL starts.
This makes web traffic management faster and more reliable.
Practice
Solution
Step 1: Understand prefix match concept
Prefix match means nginx checks if the URL path starts with a specific string.Step 2: Compare with other matching types
Exact match requires full URL match, file extension match is unrelated, random match is invalid.Final Answer:
It matches requests based on the start of the URL path. -> Option AQuick Check:
Prefix match = start of URL path [OK]
- Confusing prefix match with exact match
- Thinking prefix match checks file extensions
- Assuming prefix match is random
Solution
Step 1: Identify prefix match syntax
Prefix match uses plainlocation /prefix/ { }without modifiers.Step 2: Understand other modifiers
=is exact match,^~is prefix but with higher priority,~is regex match.Final Answer:
location /images/ { } -> Option CQuick Check:
Plain location = prefix match [OK]
- Using = or ^~ modifiers for simple prefix match
- Confusing regex (~) with prefix match
- Missing trailing slash in prefix
location /app/ {
proxy_pass http://backend1;
}
location /app/api/ {
proxy_pass http://backend2;
}Which backend will handle a request to
/app/api/users?Solution
Step 1: Understand prefix match selection
nginx selects the location with the longest matching prefix for plain prefix locations (no modifiers).Step 2: Compare prefixes
Both/app/(length 5) and/app/api/(length 9) match/app/api/users, but/app/api/is longer, so it wins.Final Answer:
http://backend2 -> Option BQuick Check:
Longest prefix wins [OK]
- Thinking config order (first match) wins instead of longest prefix
- Thinking regex or exact match applies here
- Believing nginx load balances both backends
location /static {
root /var/www/html;
}Requests to
/static/css/style.css return 404. What is the likely error?Solution
Step 1: Understand root directive behavior
rootappends the full request URI (/static/css/style.css) to/var/www/html, looking for/var/www/html/static/css/style.css.Step 2: Identify likely cause
If static files are at/var/www/html/css/style.css(withoutstatic/), root path doesn't strip prefix, causing 404. (Usealias /var/www/html;to strip.)Final Answer:
root directive path is incorrect -> Option AQuick Check:
root + full URI (no prefix strip) [OK]
- Confusing root (full URI) with alias (strips prefix)
- Thinking trailing slash strips prefix for root
- Adding unnecessary modifiers like =
/api/ to http://backend_api and all others to http://backend_web, ensuring the /api/ prefix has priority even if regex locations follow. Which config correctly uses prefix match for this?Solution
Step 1: Use ^~ for prefix priority
The^~modifier tells nginx to stop searching if prefix matches, ensuring /api/ routes to backend_api even over later regex.Step 2: Default location for others
The plainlocation / { }catches all other requests to backend_web.Final Answer:
location ^~ /api/ { proxy_pass http://backend_api; } location / { proxy_pass http://backend_web; } -> Option DQuick Check:
^~ prefix match for priority routing [OK]
- Not using ^~ causes regex or exact match to override
- Using = modifier limits to exact /api/ only
- Using ~ makes it regex, not prefix match
