0
0
Nginxdevops~10 mins

Regex match (~, ~*) in Nginx - Step-by-Step Execution

Choose your learning style9 modes available
Process Flow - Regex match (~, ~*)
Request URL Received
Check location blocks
Is location regex?
Match with ~ or ~*
If match found
Use this location
Process request
If no match
Try next location or default
Nginx checks request URLs against location blocks. If a location uses ~ or ~*, it tests the URL with regex (case-sensitive or insensitive). If matched, it uses that location.
Execution Sample
Nginx
location ~ ".*\.php$" {
    fastcgi_pass 127.0.0.1:9000;
}

location ~* ".*\.jpg$" {
    expires 30d;
}
Two location blocks: one matches URLs ending with .php (case-sensitive), the other matches URLs ending with .jpg (case-insensitive).
Process Table
StepRequest URLLocation TestedRegex TypeMatch ResultAction Taken
1/index.phplocation ~ ".*\.php$"Case-sensitive (~)MatchesUse this location, pass to fastcgi
2/image.JPGlocation ~ ".*\.php$"Case-sensitive (~)No matchCheck next location
3/image.JPGlocation ~* ".*\.jpg$"Case-insensitive (~*)MatchesUse this location, set expires
4/about.htmllocation ~ ".*\.php$"Case-sensitive (~)No matchCheck next location
5/about.htmllocation ~* ".*\.jpg$"Case-insensitive (~*)No matchNo regex location matched, try other locations or default
💡 Request URL matched or no regex location matched, nginx proceeds accordingly.
Status Tracker
VariableStartAfter Step 1After Step 2After Step 3After Step 4After Step 5
Request URL/index.php/image.JPG/image.JPG/about.html/about.html
Current Location Testedlocation ~ ".*\.php$"location ~ ".*\.php$"location ~* ".*\.jpg$"location ~ ".*\.php$"location ~* ".*\.jpg$"
Match ResultMatchesNo matchMatchesNo matchNo match
Action TakenUse this locationCheck next locationUse this locationCheck next locationNo regex location matched
Key Moments - 2 Insights
Why does location ~* ".*\.jpg$" match /image.JPG but location ~ ".*\.php$" does not match /image.JPG?
Because ~* means case-insensitive regex match, so .JPG matches .jpg ignoring case. The ~ operator is case-sensitive, so it does not match uppercase .JPG.
What happens if no regex location matches the request URL?
Nginx continues checking other non-regex locations or the default location block to handle the request, as shown in step 5 of the execution table.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the match result for /index.php against location ~ ".*\.php$"?
AMatches
BNo match
CError
DPartial match
💡 Hint
Check Step 1 in the execution_table under 'Match Result' column.
At which step does nginx use a case-insensitive regex match?
AStep 1
BStep 3
CStep 2
DStep 4
💡 Hint
Look at the 'Regex Type' column in the execution_table for step 3.
If the request URL was /photo.JPG, which location block would match it?
Alocation ~ ".*\.php$"
Blocation ~* ".*\.jpg$"
CNo location matches
DBoth locations match
💡 Hint
Refer to how ~* matches case-insensitively in the variable_tracker and execution_table.
Concept Snapshot
Nginx regex match uses ~ for case-sensitive and ~* for case-insensitive matching.
Syntax: location ~ /pattern/ { ... } or location ~* /pattern/ { ... }
Nginx tests request URLs against these regex locations in order.
If matched, nginx uses that location block to process the request.
If no regex matches, nginx tries other locations or defaults.
Full Transcript
When nginx receives a request URL, it checks location blocks to find a match. Locations using ~ perform case-sensitive regex matching, while ~* performs case-insensitive matching. For example, location ~ ".*\.php$" matches URLs ending with .php exactly, while location ~* ".*\.jpg$" matches .jpg endings ignoring case. Nginx tests each regex location in order. If a match is found, it uses that location block to handle the request. If no regex location matches, nginx tries other locations or the default. This process ensures flexible URL matching based on regex patterns.