Nginx配置实现两个嵌套独立站点托管及API反向代理
原配置故障原因
你的配置出现路由混淆、所有请求返回首页的核心问题有3个:
- 正则匹配顺序错误:Nginx同优先级正则location按书写顺序生效,你把匹配
^/Site/(.*)的正式站规则写在Dev站点规则前面,所有/Site/dev/开头的请求会先被正式站规则拦截,根本不会走到Dev站点的配置逻辑。 - 代理路径错误:
proxy_pass后未追加路径后缀时,Nginx会把原始完整URI(包含/Site//Site/dev前缀)直接转发给上游服务,不符合接口路径要求。 - 资源映射逻辑错误:跨站点请求被正式站规则拦截后,
try_files会在正式站根目录查找资源,找不到就统一回退到正式站的index.html,导致Dev站点资源无法正常返回。
正确可运行配置
Windows环境下Nginx路径建议统一使用正斜杠,避免反斜杠转义导致的路径识别错误,配置如下:
server { listen 19001; # 正式站默认根目录 root C:/Site; index index.html; include mime.types; # 正式站API转发:匹配/Site/api/开头请求 location ^~ /Site/api/ { # 转发时自动剥离/Site前缀,上游仅收到/api/xxx路径 proxy_pass http://otherserver/api/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # Dev站点全路径匹配,^~前缀优先级高于普通正则,避免被正式站规则拦截 location ^~ /Site/dev/ { # Dev站点独立根目录 root C:/Site-Dev; index index.html; # Dev站API转发 location ^~ /Site/dev/api/ { # 转发时自动剥离/Site/dev前缀,上游仅收到/api/xxx路径 proxy_pass http://otherserverdev/api/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # 精确匹配Dev站根路径 location = /Site/dev/ { try_files /index.html =404; } # Dev站静态资源匹配,不存在则回退到Dev站首页 location ~ ^/Site/dev/(.*)$ { try_files /$1 /$1/ /index.html =404; } } # 精确匹配正式站根路径 location = /Site/ { try_files /index.html =404; } # 正式站静态资源匹配(已被前面规则拦截的API、Dev路径不会走到这里) location ~ ^/Site/(.*)$ { try_files /$1 /$1/ /index.html =404; } }
配置逻辑说明
- 匹配顺序严格遵循Nginx优先级规则:精确匹配(
=) > 前缀匹配(^~) > 正则匹配(~),高优先级规则放在最前,从根源避免路由冲突 - Dev站点所有规则收敛在同一个
^~前缀块内,和正式站配置完全隔离,不会出现跨站资源混淆 - 两个站点的
try_files回退逻辑分别在自身根目录查找index.html,不会出现跨站返回首页的问题 - 代理规则通过
proxy_pass后缀自动剥离多余前缀,保证上游服务收到的请求路径完全符合要求 - 静态资源映射时自动剥离
/Site、/Site/dev前缀,直接映射到对应站点根目录下的文件,路径拼接逻辑和Windows文件系统完全对应。
内容的提问来源于stack exchange,提问作者edoedoedo
相关产品推荐
相关产品推荐

