如何配置Nginx规则?现有location=/admin返回404,需实现指定转发
解决Nginx admin路径转发的404问题
你遇到的问题核心是精确匹配规则和URI传递逻辑的冲突,原来的配置只能命中单一的/admin请求,还没法正确传递后续子路径,自然会导致子路径请求返回404。下面给你两种靠谱的配置方案,都能实现你想要的转发效果:
方案一:前缀匹配 + URI重写
location /admin { rewrite ^/admin(.*)$ $1 break; proxy_pass http://127.0.0.1:8090; }
location /admin是前缀匹配规则,会命中所有以/admin开头的请求(包括/admin、/admin/test、/admin/one)rewrite指令会把请求URI里的/admin前缀剥离,剩下的部分(比如/test、/one)作为新的URI转发到后端服务
方案二:利用proxy_pass的URI替换特性
# 处理带斜杠的子路径请求 location /admin/ { proxy_pass http://127.0.0.1:8090/; } # 处理不带斜杠的/admin请求,自动跳转带斜杠版本 location = /admin { return 301 /admin/; }
这里要特别注意两边的斜杠都不能省略:
location /admin/会匹配所有以/admin/开头的请求,proxy_pass末尾的/会告诉Nginx,把请求里的/admin/替换成/,这样/admin/test就会转发到http://127.0.0.1:8090/test- 额外加的
location = /admin是为了处理用户直接访问example.com/admin的场景,自动跳转到带斜杠的版本,避免出现404
为什么原来的配置失效?
location = /admin是精确匹配,只有当请求URI完全等于/admin时才会命中,/admin/test这类子路径根本不会触发这个规则,Nginx会用默认规则处理,返回404- 就算命中了
/admin请求,原来的proxy_pass http://127.0.0.1:8090没有末尾斜杠,Nginx会把/admin原样转发到后端,也就是http://127.0.0.1:8090/admin,如果后端没有对应路径,同样会返回404
配置完成后,记得执行sudo nginx -t检查配置语法是否合法,没问题的话再执行sudo nginx -s reload让配置生效。
内容的提问来源于stack exchange,提问作者zch




