![Nginx:多個路徑的位置正規表示式](https://rvso.com/image/623655/Nginx%EF%BC%9A%E5%A4%9A%E5%80%8B%E8%B7%AF%E5%BE%91%E7%9A%84%E4%BD%8D%E7%BD%AE%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%A4%BA%E5%BC%8F.png)
我在 nginx 配置中有兩個位置可以工作:
location ^~ /media/ {
proxy_pass http://backend.example.com;
}
location ^~ /static/ {
proxy_pass http://backend.example.com;
}
如何將這兩個位置合併到一個位置?
我已經做了什麼:
我試過這個建議
location ~ ^/(static|media)/ {
proxy_pass http://backend.example.com;
}
但這對我不起作用。
另外,當我不使用後端時,以下配置可以正常運作:
location ~ ^/(static|media)/ {
root /home/project_root;
}
更新(日誌中的一些字串)
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /content/11160/ HTTP/1.1" 200 5310 "-" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36 OPR/18.0.1284.68"
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/font-awesome/css/font-awesome.min.css HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/bootstrap/css/bootstrap.min.css HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/css/custom.css HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/53$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/colorbox/colorbox.css HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Sa$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/colorbox/jquery.colorbox-min.js HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/js/scripts.js HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537$
解決方案
實際上我的解決方案工作得很好:
location ~ ^/(static|media)/ {
root /home/project_root;
}
而且這個問題與後端無關。正如 Guido Vaccarella 正確地註意到的那樣,它只是跟著另一個location ~ ...
匹配的,所以我location ~ ...
沒有機會運行。
答案1
根據Nginx 文檔:
然後按照正規表示式在設定檔中出現的順序進行檢查。正規表示式的搜尋在第一個符合處終止,並使用對應的配置。
在您的設定中,以下位置定義在具有 proxy_pass 的位置之前,它與下面的 js 和 css 檔案的請求相符靜止的:
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}
不幸的是,「log_not_found off」子句禁用了與此位置相關的任何檔案未找到錯誤的日誌記錄,這就是您的 error_log 為空的原因!
您可以嘗試註解掉此位置或將其移至具有 proxy_pass 的位置之後(如果您需要它來處理不在其中的其他檔案)靜止的/媒體)。
答案2
location ~ ^/(static|media)/ {
proxy_pass http://backend.example.com;
) <-----------
應該...
location ~ ^/(static|media)/ {
proxy_pass http://backend.example.com;
} <-----------
結束必須是大括號 {},而不是圓括號 ()。
不敢相信花了多久才看到這一幕。 Guido 的評論是正確的。