介绍nginx中location块的匹配符(~, ~*, ^~, [space]等)与alias文件代理的关系nginx
E: /static浏览器
/case/spa
server { listen 80; server_name 127.0.0.1; }
仅仅代理一个特定的文件,基本上不多会出错,
location块是前缀匹配和正则匹配都可。
以下,浏览器访问http://127.0.0.1/static/case/... 都返回c.js的内容。代理
location /static/case/c.js { alias E:/static/case/c.js; }
location ~ /static/case/c.js { alias E:/static/case/c.js; }
但当须要代理一个目录下的各个文件时,会因location块是前缀匹配和正则匹配的不一样,致使代理的结果不一样。
尤为是location是正则匹配时,较为特殊,容易出错。code
这种状况若是出错,通常就是因为对location URI部分和alias部分最后加不加“/”犯糊涂致使的,
或者说是不清楚这种状况下最终代理到什么path致使的。server
// case1 location /static/case/ { alias E:/static/case/; autoindex on; }
// case2 location /static/case { alias E:/static/case/; autoindex on; }
case3 location /static/case/ { alias E:/static/case; autoindex on; }
case4 location /static/case { alias E:/static/case; autoindex on; }
以上四种状况,浏览器输入:http://127.0.0.1/static/case/... 只有第三种失败。
若是在这四种状况的location前面都加上 ^~ 结果也是同样的,由于 ^~ 和[space]都是前缀匹配。资源
**最终代理路径是: alias路径 + location部分URI和浏览器输入的URL未匹配到的部分。
这个路径下有文件,就200,没有文件,就404。**
因此分析一下为何第三种写法不能正确代理呢,
浏览器URL: http://127.0.0.1/static/case/...,
location:/static/case/,
所以两个URL匹配部分是/static/case/,
未匹配部分是c.js。
所以它最终代理的path是:E:/static/case + c.js = E:/static/casec.js,至关于找static目录下有没有casec.js文件,由于没这个文件,因此404。get
location ~ /static/case/ { alias E:/static/case/; autoindex on; }
浏览器URL1:http://127.0.0.1/static/case/...
浏览器URL2:http://127.0.0.1/static/case/...
浏览器URL3:http://127.0.0.1/static/case/...
浏览器URL4:http://127.0.0.1/static/case/,
结果都是同样的,返回/static/case目录。
其中只有URL4,直接200返回。URL1-3都是301->200。it
重定向不是无限的,当浏览器URL case后的层级大于10时,就再也不301->200,而是直接200返回。
即,浏览器URL5,直接200返回。代理到/static/case目录。
浏览器URL5:http://127.0.0.1/static/case/...io
所以,代理目录时,location仍是正则匹配的话,是没法访问到这个目录下的各个文件的。
解决办法有两个。
关于既想用~又想能代理到某目录下各个文件的解决办法: //方案1 location ~ ^/(.+)/(.+)/(.+\.js)$ { alias E:/static/case/$3; } //方案二、用root结合rewrite代替 location ~ ^/.+/.+/.+\.js$ { root E:/; rewrite ^/(.*) /$1 break; }