前提(事实):如果指定了带有 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;
}