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
相关产品推荐
相关产品推荐

