nginx alias 和 root

   上周四,有用户反映线上app中的的某个网页打不开,返回404,地址类似:http://xxx.xxx.com/projectContext/appWeb/page/device/deviceList.html

            背景:由于之前后端项目的重构,所有的请求路径,后端服务器已经不支持/projectContext前缀了,但是为了能兼容老版本的接口,故在nginx中做了路径匹配转发

           原有的nginx配置:

#对所有静态资源做了分离 规则A
location ~ .*.(gif|jpg|jpeg|png|bmp|swf|css|js|html)$ {
root /opt/www/wx_app_static_page/;
expires 30d;
}
#兼容老版/projectContext的请求路径 规则B
location /projectContext {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://app.com/;
}

#所有动态请求动态转发给后端服务器列表 规则C
location /{
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://app.com/;
}

     乍一看,没什么问题,html请求确实被匹配到 规则A,但是仔细看,会发现/opt/www/wx_app_static_page/并没有  /projectContext/appWeb/page/device/deviceList.html这个路径,而真正的文件是在/opt/www/wx_app_static_page/appWeb/page/device/deviceList.html下,所以才会404
     找到问题了,开始着手解决;于是想当然的加上下面的配置:

#匹配/projectContext/appWeb的请求
location ^~ /projectContext/appWeb/{
root /opt/www/wx_app_static_page/appWeb/;
}
     重新加载nginx配置后,再访问上面那个路径,发现还是404,于是开启nginx日志,发现请求的html被定位到/opt/www/wx_app_static_page/appWeb/ projectContext/appWeb/page/device/deviceList.html;  会比正确的路径(/opt/www/wx_app_static_page/appWeb/page/device/deviceList.html) 多上匹配规则的前缀;于是乎,想起nginx还支持alias, alias会把location后面配置的路径丢弃掉,把当前匹配到的目录指向到指定的目录,正合我意
   于是nginx配置改为:


location ^~ /projectContext/appWeb/{
alias /opt/www/wx_app_static_page/appWeb/$1;
}
  重新加载配置,访问之前的url,发现一切正常。
总结:

1:root不会丢弃location后面配置的路径,而alias会丢弃,把当前匹配到的目录指向到指定的目录

2:使用alias时,目录名后面一定要加"/"

3:alias只能位于location块中
————————————————
版权声明:本文为CSDN博主「t594362122」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/t594362122/article/details/78328769

posted on 2021-06-09 10:43  正义的伙伴!  阅读(222)  评论(0编辑  收藏  举报

导航

//增加一段JS脚本,为目录生成使用