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;
}
相关推荐
Coisinier2 小时前
RHCE中shell脚本基础(磁盘剩余空间监控,Web 服务状态检查,curl 访问 Web 服务并返回状态)
linux·运维·服务器·前端·nginx·操作系统
GlobalSign数字证书5 小时前
Nginx配置SSL证书教程:从零到HTTPS的完整部署指南
nginx·https·ssl
難釋懷1 天前
Nginx对客户端的限制
运维·nginx
楠目1 天前
CVE-2017-7529 Nginx Range头整数溢出漏洞利用总结
运维·nginx
難釋懷1 天前
Nginx缓冲区
前端·javascript·nginx
ElevenS_it1882 天前
Nginx日志监控告警实战:access_log解析+5xx突增+慢请求+异常IP自动告警完整方案(Filebeat+Zabbix)
运维·网络·tcp/ip·nginx·zabbix
半夜燃烧的香烟2 天前
docker 安装minio nginx,配置nginx根据文根路由minio展示图片
java·nginx·docker
火山上的企鹅2 天前
Codex实战:APP远程升级服务搭建(二)阿里云ECS部署Node升级服务_Ubuntu_systemd_Nginx
nginx·ubuntu·阿里云·qgc
難釋懷2 天前
Nginx-UpStream工作流程
运维·nginx
難釋懷2 天前
Nginx-AB安装
运维·nginx