これら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
それはだれにもおなじみのように聞こえますか?ここで何が欠けていますか?
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
です。
プロキシパスディレクティブの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
ヘッダーを変更できないためです書き換える前。