![Nginx: 複数のパスの場所の正規表現](https://rvso.com/image/623655/Nginx%3A%20%E8%A4%87%E6%95%B0%E3%81%AE%E3%83%91%E3%82%B9%E3%81%AE%E5%A0%B4%E6%89%80%E3%81%AE%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE.png)
nginx 設定には機能する場所が 2 つあります。
location ^~ /media/ {
proxy_pass http://backend.example.com;
}
location ^~ /static/ {
proxy_pass http://backend.example.com;
}
これら 2 つを 1 つの場所に結合するにはどうすればよいですか?
私がすでにやったこと:
私は試したこの提案
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のある場所の後に移動することができます(proxy_passに含まれていない他のファイルに必要な場合)。静的/メディア)。
答え2
location ~ ^/(static|media)/ {
proxy_pass http://backend.example.com;
) <-----------
そうなるはず...
location ~ ^/(static|media)/ {
proxy_pass http://backend.example.com;
} <-----------
閉じ括弧は括弧 () ではなく中括弧 {} にする必要があります。
それを理解するのにどれだけ時間がかかったか信じられません。コメントから、Guido の言う通りでした。