Nginx用变量配置dynamic proxy_pass后接口路径跳转异常如何修复?
问题1:最初非动态代理配置正常运行的原因
原来的配置中proxy_pass使用的是不带变量的静态目标地址,且地址末尾带斜杠/,Nginx遇到这种写法会自动执行前缀替换逻辑:
- 当请求匹配到
location /proxy/时,Nginx会自动把请求路径中匹配到的前缀/proxy/去掉,再将剩余路径拼接在proxy_pass的目标地址之后 - 比如重写后的内部请求路径是
/proxy/api/something,去掉前缀后剩余api/something,拼接后最终代理地址就是https://proxieddomain.com/api/something,符合预期。
另外你的重写规则没有加flag默认是last,会触发重写后重新匹配location,刚好能命中/proxy/的规则,整个流程是通顺的。
问题2:动态代理配置修改方案
当proxy_pass的值包含变量时,Nginx会禁用自动前缀替换逻辑,完全按照你拼接的字符串作为最终代理地址,这是你现在路径出错的核心原因。你需要手动处理路径裁剪,修改/proxy/ location的配置如下:
location /proxy/ { resolver 127.0.0.11; set $proxy "to_be_replaced"; proxy_set_header X-SSL-CERT $ssl_client_escaped_cert; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; set_by_lua_block $proxy { -- 这里可以保留你根据Cookie判断目标地址的逻辑 return "https://proxieddomain.com" } # 新增:手动裁剪掉/proxy/前缀,break表示在当前location处理不重新匹配 rewrite ^/proxy/(.*)$ /$1 break; # 拼接裁剪后的路径和参数,不需要再用$request_uri($request_uri是原始请求路径不会随重写更新) proxy_pass $proxy$uri$is_args$args; proxy_ssl_server_name on; proxy_set_header host $proxy_host; }
关键改动说明:
- 把
set_by_lua_block返回的目标地址末尾的斜杠去掉,避免拼接路径时出现双斜杠 - 新增
rewrite ^/proxy/(.*)$ /$1 break;手动移除/proxy/前缀,和原来的自动替换逻辑对齐 - 把
proxy_pass $proxy$request_uri;改为proxy_pass $proxy$uri$is_args$args;,$uri是经过重写处理后的路径,$is_args$args会自动携带原始请求的查询参数
修改后动态代理的逻辑就和原来的静态配置完全一致了。
内容的提问来源于stack exchange,提问作者Akiz
相关产品推荐
相关产品推荐

