You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx正则location配置Proxy Pass的问题求助

Nginx配置问题分析与修复

原配置问题说明

第一个配置异常原因

location ~ ^/(900[0-9]|90[1-9][0-9]|9100) {
    rewrite ^/(?:(900[0-9]|90[1-9][0-9]|9100))/(.*)$ /$1 break;
    proxy_pass http://192.168.2.5:$1;
}

这个配置的rewrite规则仅匹配带后续路径的请求(如/9100/xxx),但直接访问/9100时,rewrite不会触发,此时请求路径仍为/9100,被代理到后端192.168.2.5:9100/9100,若后端未配置对应路径的路由,就会出现访问异常。

第二个配置静态资源加载失败原因

location ~ ^/(900[0-9]|90[1-9][0-9]|9100) {
    proxy_pass http://192.168.2.5:$1;
}

该配置未修改请求路径,访问/9100时会被代理到192.168.2.5:9100/9100,后端若能处理这个路径则返回页面,但页面内的静态资源使用相对路径(如asset/vendor.css)时,浏览器会基于当前URL(http://192.168.2.5:9180/9100)拼接成http://192.168.2.5:9180/asset/vendor.css——这个请求路径以/asset开头,无法被当前的location规则匹配,导致静态资源无法被代理到后端,加载失败。

正确配置方案

使用以下配置,既能处理根路径请求(如/9100),也能正确代理所有子路径请求,同时保证浏览器请求的静态资源路径会被Nginx拦截并代理:

location ~ ^/(900[0-9]|90[1-9][0-9]|9100)(/.*)?$ {
    # 将请求路径中的端口前缀去掉,仅保留后续路径(无后续路径则为空)
    rewrite ^/(900[0-9]|90[1-9][0-9]|9100)(/.*)?$ $2 break;
    proxy_pass http://192.168.2.5:$1;
}

配置原理

  1. location规则匹配所有以目标端口(如9100)开头的请求,包括根路径(/9100)和子路径(/9100/asset/vendor.css)。
  2. rewrite规则将请求路径中的端口前缀移除:
    • 访问/9100时,$2为空,最终代理到http://192.168.2.5:9100/(后端根路径)。
    • 访问/9100/asset/vendor.css时,$2为/asset/vendor.css,最终代理到http://192.168.2.5:9100/asset/vendor.css。
  3. 浏览器请求静态资源时,会基于当前URL(http://192.168.2.5:9180/9100)拼接出/9100/asset/vendor.css,这个路径会被location规则匹配,进而被正确代理到后端。

替代方案(无需rewrite)

也可以直接通过proxy_pass的变量拼接实现,效果一致:

location ~ ^/(900[0-9]|90[1-9][0-9]|9100)(/.*)?$ {
    proxy_pass http://192.168.2.5:$1$2;
}

内容的提问来源于stack exchange,提问作者Nope

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 15:46:20