http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass
- proxy_pass に URI が含まれる場合
- proxy_pass に URI が含まれない場合
- proxy_pass で変数を利用している場合
location /name/ {上記の NGINX ドキュメントページにおける「URI」という用語はどうも NGINX における $uri と同じで、ホスト名より後ろの文字列のようだ。上記例だと /remote/ という部分と思われる。
proxy_pass http://127.0.0.1/remote/;
}
この場合は、normalized URI (URI のデコード後: // を / にしたり %xx をデコードしたり)の location に定義した部分に一致する箇所を、proxy_pass て定義した URI 部分に置き換えて後ろのサーバに渡す模様。上記設定例の場合は例えば以下のようになる。
http://www.example.com/name/foo?bar=baz(/name/ を /remote/ に置き換えて GET リクエストはそのまま)
↓
http://127.0.0.1/remote/foo?bar=baz
location /some/path/ {上記 NGINX ドキュメントには、proxy_pass に定義された値がホスト名部分で終わっちゃう場合は request uri ($request_uri)をそのまんま後ろのサーバに渡すって書いてある(または完全な normalized URI = $uri)。
proxy_pass http://127.0.0.1;
}
つまり上記設定例の場合は以下のような感じ。
http://www.example.com/some/path/foo?bar=baz(ホスト名の後ろからはそのまま)
↓
http://127.0.0.1/some/path/foo?bar=baz
location /name/ {この例のように proxy_pass 内で変数を利用してしまうと proxy_pass に指定した値のまま後ろのサーバに渡してしまう。つまり:
set myhost myhost.example.com;
proxy_pass http://$myhost/;
}
http://www.example.com/name/foo?bar=baz(とにかく proxy_pass で指定したものしか渡さない)
↓
http://myhost.example.com/
もしリクエストを渡したい場合、proxy_pass は以下のようにすれば良いだろう。
proxy_pass http://$myhost$request_uri;