Nginxの場所の正規表現はプロキシパスでは機能しません


43

Nginxでこれら2つのロケーションディレクティブを機能させようとしていますが、Nginxの起動時にエラーが返されます。

   location ~ ^/smx/(test|production) {
        proxy_pass   http://localhost:8181/cxf;
    }

    location ~ ^/es/(test|production) {
        proxy_pass   http://localhost:9200/;
    }

これは私が受け取っているエラーです:

nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block

誰にも馴染みのある音ですか?私はここで何が欠けていますか?

回答:


48

Xaviarからのすばらしい答えへの小さな追加:

nginxに精通していない場合は、proxy_passディレクティブの最後にスラッシュを追加することとの間で重要な違いがあります。

以下は機能しません

location ~* ^/dir/ {
  rewrite ^/dir/(.*) /$1 break;
  proxy_pass http://backend/;

しかし、これは:

location ~* ^/dir/ {
  rewrite ^/dir/(.*) /$1 break;
  proxy_pass http://backend;

違い/は、proxy_passディレクティブの最後にあります。


1
その末尾は/私の構成の問題を修正しました。
ヨーチ

それを指摘してくれてありがとう。
cyrrill

21

これは、ことを示していますURIプロキシパスディレクティブでは、正規表現の場所で使用することはできません。これは、nginxが、locationブロック内の正規表現に一致するURIの部分を、proxy_passディレクティブで一般的な方法で渡された部分で置き換えることができないためです。

単にあなたの場所の正規表現がある想像し/foo/(.*)/bar、あなたが指定しproxy_pass http://server/test、nginxのあなたがで終わらせたくないので、上位レベルで別のものにあなたの場所の正規表現をマッピングする必要があります/foo/test/bar/somethingが、と/test/something。したがって、それはネイティブでは不可能です。

したがって、この部分では次を使用して動作するはずです:

server {

   [ ... ]

    location ~ ^/smx/(test|production) {
        rewrite ^/smx/(?:test|production)/(.*)$ /cxf/$1 break;
        proxy_pass http://localhost:8181;
    }

    location ~ ^/es/(test|production) {
        rewrite ^/es/(?:test|production)/(.*)$ /$1 break;
        proxy_pass http://localhost:9200;
    }

}

ただし、処理中の現在のURIを書き換えて、書き換える前Location最初の要求に基づいてヘッダーを変更することができないため、ロケーションブロックURIパターンに一致するリダイレクトを書き換えることはできません。


2
書き換えルールにパスを移動すると、私にとってはうまくいきました。ありがとう。
-sonjz
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.