介紹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; }