nginx反向代理配置proxy_pass时,注意URI替换的坑

前提(事实):如果指定了带有 URIproxy_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_passURI会超出他自己的的context,同根locationURI,也就是/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;
}
相关推荐
Arya_aa16 小时前
四:部署前端和后端
nginx
Java面试题总结17 小时前
一文搞定 Linux Nginx 从安装、启动到 nginx.conf 全配置详解(新手也能看懂)
linux·运维·nginx
MiNG MENS1 天前
nginx 代理 redis
运维·redis·nginx
珊瑚怪人1 天前
一个域名问题
nginx
dxdz1 天前
一文搞定 Linux Nginx 从安装、启动到 nginx.conf 全配置详解(新手也能看懂)
nginx
遇见火星1 天前
Nginx 负载均衡配置模板:轮询、权重、IP哈希、最少连接
tcp/ip·nginx·负载均衡
untE EADO2 天前
Nginx代理到https地址忽略证书验证配置
运维·nginx·https
Treh UNFO2 天前
nginx的重定向
大数据·数据库·nginx
理人综艺好会2 天前
nginx了解
运维·nginx
likeGhee2 天前
docker创建nginx+keepalived+nacos集群(仅测试环境)
nginx·docker