前提(事实):如果指定了带有 URI 的 proxy_pass 指令,则当请求被传递给服务器时,与location匹配的标准化请求 URI 的部分将被指令中指定的 URI 替换。
bash
location /name/ {
proxy_pass http://127.0.0.1/remote/;
}
在上面的例子中,如果请求URI为/name/test/,则会被替换为/remote/test/
不过在某些情况下,要替换的请求 URI 的部分无法确定:
当location使用正则时,或者在named location内部
一般来说,named location通常用于内部重定向,而不需要暴露给外部,他不带有自己的URI。
sh
server {
location /root_uri {
# Named location
location @proxy {
# Here, the URI is relative to the root location, not the current location
proxy_pass http://example.com/uri;
}
# Invoking the named location
try_files $uri @proxy;
}
}
例子中,named location没有自己的URI,所以他内部proxy_pass的URI会超出他自己的的context,同根location的URI,也就是/root_uri产生联系。
这会导致不可预料的行为或者错误。
此时,不推荐named location内部的proxy_pass 写上URI
当location使用rewrite改变了URI时
下面的location使用了rewrite,所以它内部的proxy_pass不应该带有URI
sh
location /name/ {
rewrite /name/([^/]+) /users?name=$1 break;
proxy_pass http://127.0.0.1;
}
此时,要替换的请求 URI 的部分可能无法确定。
proxy_pass内部使用了变量时
sh
location /name/ {
proxy_pass http://127.0.0.1$request_uri;
}