Nginx:複数のパスの場所の正規表現


30

私は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 ~ ...は走る機会がありませんでした。


正規表現のプロキシパスが機能しない理由はわかりません。試してみるとどうなりますか?
気難しい

試してみると、フロントエンドのnginxは404エラーを投げます。
Vlad T.

locationステートメントの最後の)は質問のエラーですか、それとも構成ファイルにもありますか?
グイドヴァッカレラ

構成の残りの部分についてエラーを再確認してください。さらに、どこを見ているのか、何が欠けているのかを確認することで、404をスローする理由を調査することもできます。また、エラードキュメントが見つからない場合に404​​をスローする可能性もあるため、スローされた以前のエラーを調べる必要があります。
気難しい

エラーログからエラーを提供してください
Mohammad AbuShady

回答:


30

nginxのドキュメントによると:

次に、構成ファイルでの出現順に正規表現がチェックされます。正規表現の検索は最初の一致で終了し、対応する構成が使用されます。

設定では、proxy_passのある場所の前に次の場所が定義されており、staticの下のjsおよびcssファイルの要求に一致します

  location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    expires max;
    log_not_found off;
  }

残念ながら、「log_not_found off」句は、この場所に関連するfile-not-foundエラーのロギングを無効にします。そのため、error_logは空です。

この場所をコメントアウトするか、proxy_passを使用して場所の後に移動することができます(static / mediaにない他のファイルに必要な場合)。


13
location ~ ^/(static|media)/ {
  proxy_pass http://backend.example.com;
)     <-----------

あるべき...

location ~ ^/(static|media)/ {
  proxy_pass http://backend.example.com;
}     <-----------

終了は、括弧括弧()ではなく、中括弧{}である必要があります。

それを見るのにどれくらい時間がかかったのか信じられません。Guidoはコメントから正しかった。


ああ、誤解して申し訳ありません|media)が、文字列の「メディア」が「場所」で始まった後の括弧を意味すると思いました。しかし、ここでの間違った波括弧は単なる誤植です(問題は修正されています)。そうしないと、このnginxの設定が読み込まれずunexpected ")"...、申し訳ありませんが再びエラーが発生します。
Vlad T. 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.