Nginx匹配Location后如何重写URL?内部服务器配置求助
解决Nginx转发时路径前缀去除的问题
我完全懂你遇到的困扰——现在你的Nginx把/api/app/admin完整转发到了http://app/api/app/admin,但你的应用只认/admin对吧?这其实是Nginx代理路径匹配的小细节没处理好,给你两个简单靠谱的解决方案:
方法1:利用proxy_pass末尾的斜杠自动替换路径
这是最简洁的方式,只需要调整proxy_pass的地址,加上末尾的斜杠就行:
upstream app{ server app:8000; } server { listen 80; location /api/app/ { proxy_pass http://app/; # 重点:这里末尾加了斜杠! proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_redirect off; } }
原理很直白:当proxy_pass末尾带有斜杠时,Nginx会自动把location匹配到的前缀(也就是/api/app/)替换成这个斜杠,所以/api/app/admin就会被转发成http://app/admin,正好契合你的应用需求。
方法2:用rewrite指令手动重写路径
如果你更倾向于显式控制路径逻辑,可以在location里添加rewrite规则:
upstream app{ server app:8000; } server { listen 80; location /api/app/ { rewrite ^/api/app/(.*)$ /$1 break; # 捕获/api/app/后的所有内容,重写到根路径 proxy_pass http://app; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_redirect off; } }
这个规则的作用是:匹配所有以/api/app/开头的请求,把/api/app/后面的部分(用(.*)捕获)重写成/$1,比如/api/app/admin会被转成/admin,再转发给http://app,最终就是http://app/admin。
两种方法都能解决问题,个人更推荐第一种,因为更简洁且是Nginx原生的路径处理逻辑。记得修改配置后重启Nginx生效哦!
内容的提问来源于stack exchange,提问作者Ayush Pallav
相关产品推荐
相关产品推荐

