web-dev-qa-db-ja.com

Nginxの場所の正規表現がプロキシパスで機能しない

これら2つの場所ディレクティブをNginxで機能させようとしていますが、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

それはだれにもおなじみのように聞こえますか?ここで何が欠けていますか?

44
Niels

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です。

51
mark

プロキシパスディレクティブのthe 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パターンに一致するようにリダイレクトを書き換えることはできません。処理中の現在のURIが書き換えられ、初期リクエストに基づいてLocationヘッダーを変更できないためです書き換える前。

24
Xavier Lucas