Nginx 配置子路径访问静态文件时如何避免根目录自动拼接子路径
[更新/注意:以下描述中的“subdomain”实际指代URL中的subpath(子路径),给您造成混淆十分抱歉,我已修改标题但保留了原有描述内容。]
问题原因
该现象是Nginx的root指令的路径拼接逻辑导致的:root会将完整的请求路径拼接到指定的根目录之后,所以你请求/subdomain/index.html时,Nginx会自动拼接为/www/mydirectory/subdomain/index.html,和你的预期不符。
解决方案
方案1:使用alias指令(推荐常规场景使用)
alias指令会直接替换location匹配的路径部分,不会拼接多余的子路径层级,配置如下:
location /subdomain/ { alias /www/mydirectory/; index index.html; client_max_body_size 10g; }
注意:alias指定的目录末尾必须加斜杠,否则会出现路径解析错误。配置生效后,访问https://mydomain/subdomain/xxx.html会直接返回/www/mydirectory/xxx.html的内容。
方案2:使用rewrite规则(适合存在嵌套location等特殊场景)
如果你有特殊场景无法使用alias,可以通过rewrite重写请求路径实现同等效果:
location /subdomain/ { root /www/mydirectory; rewrite ^/subdomain/(.*)$ /$1 break; index index.html; client_max_body_size 10g; }
该规则会将/subdomain/开头的请求路径中的子路径前缀去掉,再用root规则解析,同样能直接读取/www/mydirectory下的文件。
内容的提问来源于stack exchange,提问作者Stefan Springer
相关产品推荐
相关产品推荐

