Nginx:多個路徑的位置正規表示式

Nginx:多個路徑的位置正規表示式

我在 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 的評論是正確的。

相關內容