You need to enable JavaScript to run this app. Nginx配置/CMS子路径静态站点时访问/CMS返回404 路径指向错误
优惠活动
大模型
产品
解决方案
定价
更多

Nginx配置/CMS子路径静态站点时访问/CMS返回404 路径指向错误

报错根因

配置存在两处核心偏差,直接触发日志中的路径查找错误,404的生成流程完全可对应Nginx的运行逻辑还原:

  • root路径继承逻辑错位
    全局配置的root /var/www/mainSite会被所有未单独声明资源路径的location块继承。你在location /CMS/中的rewrite规则写为rewrite ^(.*)$ /subSite/index.html break,流程走到这一步时:Nginx先计算出请求/CMS/对应的本地文件路径为/var/www/mainSite/CMS/index.html,发现文件不存在就触发rewrite分支,带着继承的全局root前缀拼接跳转目标URI,最终生成的文件查找路径为/var/www/mainSite + /subSite/index.html,和日志中记录的不存在路径完全匹配——整个跳转逻辑完全没有关联到实际存放子站点资源的/var/www/subSite目录。
  • 子站点路径映射规则缺失
    子站点静态资源实际存放在/var/www/subSite目录,但你没有为/CMS/路径单独配置资源映射规则,也没有做URL前缀的剥离处理。用户访问https://test.somesite.com/CMS/时,Nginx默认会先到全局root下找对应路径的文件,找不到就触发错误的rewrite分支,全程无法匹配到/var/www/subSite下的实际资源。
修正后可运行的配置
# 主站点全局资源路径
root /var/www/mainSite;

# 主站点路由规则
location / {
    if (!-e $request_filename) {
        rewrite ^(.*)$ /index.html break;
    }
}

# /CMS/子站点路由配置
location /CMS/ {
    # 单独指定子站点资源路径,使用alias剥离URL中的/CMS/前缀
    alias /var/www/subSite/;
    # 不存在的静态资源请求回退到子站点入口文件
    if (!-e $request_filename) {
        rewrite ^(.*)$ /CMS/index.html break;
    }
}

关键配置说明:

  • 此处使用alias而非root的原因:如果在该location块中写root /var/www/subSite,Nginx会将完整请求路径拼接在root后面,访问/CMS/时会去查找/var/www/subSite/CMS/目录下的文件,依然会触发404;只有通过alias做路径替换,才能把对外的/CMS/路径映射到本地/var/www/subSite/目录下的实际资源。
  • 回退rewrite的目标路径必须写对外暴露的站点路径(即/CMS/index.html),不能直接写服务器本地的文件路径,避免再次出现路径拼接错位。
同类问题避坑指南
  • Nginx的root配置具有全局继承性,凡是挂载在子路径下的独立站点,必须在对应location块中单独声明自身的资源路径,不要依赖全局root的默认继承规则。
  • 跨目录的子路径站点优先使用alias做路径映射,不要仅靠rewrite硬跳转,否则极易出现本地文件路径拼接错位的问题。
  • 遇到open() "xxx" failed (2: No such file or directory)类报错时,优先核对两个核心点:该查找路径是由哪个配置块的root拼接生成的、请求URL的路径前缀有没有被正确替换或剥离。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 18:36:04