如果在 proxy_pass 指令里使用了变量,那么 Nginx 代理的时候就不会传递原请求的 uri 和 args。
之前有人问过相似的问题:https://groups.google.com/forum/#!topic/openresty/5j2cxTl_Cj0
建议统一用 Lua 代码来改写路由,这样就不需要记住各种边边角角的规则。
在 2017年2月23日星期四 UTC+8上午11:22:35,xiaooloong写道:
proxy_pass 指令中,如果 服务器/upstream名 后面带有 uri,则会将 uri 中当前 location 匹配的部分替换成指令中书写的部分,例如:
[root@localhost vhosts]# cat default.conf
server {
listen 8081 default;
server_name lcoalhost;
location / {
echo $uri;
}
}
upstream backend {
}
server {
listen 80 default;
server_name localhost;
location ^~ /foo/ {
}
}
[root@localhost vhosts]# curl localhost/foo/bar
/bar/bar
请求 uri /foo/bar 匹配到了 location ^~ /foo/ ,因此 uri 被重写为了 /bar/bar。
但是如果在 proxy_pass 指令中使用了变量,这种替换就会发生异常,配置如下:
set $test '';
location ^~ /foo/ {
}
此时所有的 uri 都被重写成了 /bar/:
[root@localhost vhosts]# curl localhost/foo/xiaooloong
/bar/
只能通过用 rewrite 指令手动重写 uri ,放弃在 proxy_pass 指令中定义 uri:
set $test '';
location ^~ /foo/ {
rewrite ^/foo(.*) /bar$1 break;
}
结果符合预期:
[root@localhost vhosts]# curl localhost/foo/xiaooloong
/bar/xiaooloong
在 proxy_pass 中同时使用 变量 而导致 重写uri 功能异常,不知道这算不算 bug ?