URI matching in Nginx
As a proxy server, URI matching is one of the most common problems in Nginx. Here are some cases that can be error-prone.
1. Automatic 301 redirect with a trailing slash
When URI points to a directory without a trailing slash, Nginx will stop processing and send a 301 redirect to the client. Also add a trailing slash on original URI.
location /help {
root /var/www/html;
} |
If help is directory under /var/www/html on local filesystem,
a 301 redirect response with a trailing slash on original URI will be sent.
The request /help will be redirected to /help/.
2. Regular expression not checked
The ^~ modifier is used to specify prefix matching with regular expression.
If the longest matching prefix location has the ^~ modifier
then regular expressions are not checked.
location ^~ /images/ {
[ configuration A ]
}
location ~* \.(gif|jpg|jpeg)$ {
[ configuration B ]
} |
The request /images/abc.jpg will match configuration A,
the request /documents/abc.jpg will match configuration B.
3. Matching prefix replaced
When request is passed to proxied server using proxy_pass directive,
in cases to change URI, rewrite is not the only option. Without rewrite, a URI specified
in proxy_pass directive can have the same effect.
From Nginx docs on
proxy_pass:
If the proxy_pass directive is specified with a URI, then when a request is passed to the server, the part of a normalized request URI matching the location is replaced by a URI specified in the directive.
location /name/ {
proxy_pass http://127.0.0.1:2082/remote/;
} |
Using the above configuration, the request /name/abc will be sent to proxied server
and URI is changed to /remote/abc.
As proxy server as Nginx is, this is preferable and intuitive to rewrite.