你了解nginx location 的root和alice吗

来源:互联网 发布:css编程 编辑:程序博客网 时间:2024/06/05 16:27

           上周四,有用户反映线上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的请求路径 规则Blocation /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/;}
#所有动态请求动态转发给后端服务器列表 规则Clocation /{ 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块中