回答:
proxy_passドキュメントから:
特別なケースは、proxy_passステートメントで変数を使用することです。要求されたURLは使用されず、自分でターゲットURLを作成するのはユーザーの責任です。
ターゲットで$ 1を使用しているので、nginxは渡すものを正確に指示するためにあなたに依存します。これは2つの方法で修正できます。まず、proxy_passを使用してURIの先頭を削除するのは簡単です。
location /service/ {
# Note the trailing slash on the proxy_pass.
# It tells nginx to replace /service/ with / when passing the request.
proxy_pass http://apache/;
}
または、正規表現の場所を使用する場合は、argsを含めます。
location ~* ^/service/(.*) {
proxy_pass http://apache/$1$is_args$args;
}
location /service/ { rewrite ^\/service\/(.*) /$1 break; proxy_pass http://apache; }
の~
代わりに、少し変更したバージョンのkolbyjackの2番目のアプローチを使用してい~*
ます。
location ~ ^/service/ {
proxy_pass http://apache/$uri$is_args$args;
}
私はそれが動作するように@kolbyjackコードを変更しました
http://website1/service
http://website1/service/
パラメータ付き
location ~ ^/service/?(.*) {
return 301 http://service_url/$1$is_args$args;
}
proxy_pass
ディレクティブは、サーバー側でリダイレクトを行います。
ここでは、rewriteを使用して、proxy_passを使用してパラメータを渡す必要があります。
S3静的Webサイトホスティングは、Index.htmlへのすべてのパスをルーティングします
あなたのニーズに合わせて
location /service/ {
rewrite ^\/service\/(.*) /$1 break;
proxy_pass http://apache;
}
最終的にhttp://127.0.0.1:8080/query/params/にしたい場合
最終的にhttp://127.0.0.1:8080/service/query/params/にし たい場合は、次のようなものが必要になります
location /service/ {
rewrite ^\/(.*) /$1 break;
proxy_pass http://apache;
}
/path/params
)をうまく処理しますが、クエリparams(?query=params
)は処理しないようですか?
github gist https://gist.github.com/anjia0532/da4a17f848468de5a374c860b17607e7
#set $token "?"; # deprecated
set $token ""; # declar token is ""(empty str) for original request without args,because $is_args concat any var will be `?`
if ($is_args) { # if the request has args update token to "&"
set $token "&";
}
location /test {
set $args "${args}${token}k1=v1&k2=v2"; # update original append custom params with $token
# if no args $is_args is empty str,else it's "?"
# http is scheme
# service is upstream server
#proxy_pass http://service/$uri$is_args$args; # deprecated remove `/`
proxy_pass http://service$uri$is_args$args; # proxy pass
}
#http://localhost/test?foo=bar ==> http://service/test?foo=bar&k1=v1&k2=v2
#http://localhost/test/ ==> http://service/test?k1=v1&k2=v2
クエリ文字列なしでリダイレクトするには、以下の行をリッスンポート行の下のサーバーブロックに追加します。
if ($uri ~ .*.containingString$) {
return 301 https://$host/$uri/;
}
クエリ文字列あり:
if ($uri ~ .*.containingString$) {
return 301 https://$host/$uri/?$query_string;
}
if
、可能な限り使用しないように明示されています。この場合、location
別の回答に示されているように、ソリューションは適切に使用できます。
$ request_uri proxy_pass http:// apache / $ request_uriの追加に対応しました。