在nginx location中用alias代理文件

介紹nginx中location塊的匹配符(~, ~*, ^~, [space]等)與alias文件代理的關係nginx

實驗環境

靜態資源目錄

E: /static瀏覽器

  • a.js
  • b.js
  • /case/spa

    • c.js
    • d.js
    • e.js
nginx server塊
server {
    listen       80;
    server_name  127.0.0.1;
}

alias代理特定文件

僅僅代理一個特定的文件,基本上不多會出錯,
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;
    }

alias代理某目錄下的各個文件

但當須要代理一個目錄下的各個文件時,會因location塊是前綴匹配和正則匹配的不一樣,致使代理的結果不一樣。
尤爲是location是正則匹配時,較爲特殊,容易出錯。code

location是前綴匹配^~或者[space]時

這種狀況若是出錯,通常就是因爲對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是正則匹配~, ~*時
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;
    }
相關文章
相關標籤/搜索