Nginx转发请求至新URL及Docker站点URL修改配置问题求助
这问题我之前调试Nginx的时候也踩过坑!核心原因是当你把location从根路径/改成/newurl/后,Nginx转发请求的URL路径处理逻辑发生了变化,导致后端收到的请求路径和它预期的不匹配,才出现了脚本、CSS这些静态资源404的情况。
问题根源
当location是/时,Nginx会把客户端请求的完整URI直接拼到proxy_pass的地址后面,比如客户端请求/js/app.js,后端收到的就是http://127.0.0.1:3333/js/app.js,和后端的资源路径匹配,所以正常。
但当location改成/newurl/后,如果proxy_pass末尾没有加斜杠/,Nginx会把/newurl/和后续的URI一起传给后端。比如客户端请求/newurl/js/app.js,后端收到的是http://127.0.0.1:3333/newurl/js/app.js——可后端的资源根本不在/newurl/路径下,自然就返回404了。
两种可行的解决方案
方案一:给proxy_pass末尾添加斜杠
这是最简洁的方法,只要在proxy_pass的地址末尾加上/,Nginx就会自动把location匹配到的/newurl/替换掉,只把后面的部分转发给后端。
修改后的完整配置:
location /newurl/ { proxy_pass http://127.0.0.1:3333/; # 关键:这里末尾加了斜杠 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
方案二:用rewrite指令重写请求路径
如果不想依赖proxy_pass的斜杠逻辑,也可以用rewrite手动去掉/newurl/前缀,再转发给后端:
location /newurl/ { rewrite ^/newurl/(.*)$ /$1 break; # 重写URI,去掉/newurl/前缀 proxy_pass http://127.0.0.1:3333; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
额外说明
如果你的后端应用本身是部署在子路径下的,那可能还需要修改后端的配置(比如设置应用的根路径为/newurl/),但从你的描述来看,后端原本是在根路径运行的,所以上面两种方法应该就能解决静态资源404的问题了。
内容的提问来源于stack exchange,提问作者Tsunani

