nginx で
location /foo/ {
set $backend "backend";
proxy_pass http://$backend:12345/;
}
のように traliling slash を付けているはずなのに、 /foo/bar へのリクエストが backend:12345/bar でなく backend:12345/ に飛んでしまう。何故だ……
proxy_pass で変数使うのやめて http://backend:12345/ とダイレクトに書いたらちゃんとパス含めてリダイレクトされるようになった……何だこれ
/good/foo にアクセスするとバックエンドの /foo にアクセスが飛ぶが、 /bad/foo にアクセスすると何故かバックエンドの / にアクセスが飛ぶ。 nginx 1.21.3。
nginx 意味わかんねえ、なんだこれ!
https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass
> When variables are used in proxy_pass:
>
> location /name/ {
> proxy_pass http://127.0.0.1$request_uri;
> }
>
> In this case, if URI is specified in the directive, it is passed to the server as is, replacing the original request URI.
これか!
本来は末尾で path 系の変数を使ったとき重複させないためのルールっぽいけど、ドメイン部分の置き換えのみを意図して使った場合にも同ルールが適用されていると……完全に理解したわ
@orumin 私もその仕様を期待していたんですが、ホスト名に変数 ($backend 等) を使うとそもそも trailing slash の有無に関係なくリクエストのパス部が全て捨てられるという最悪仕様に遭遇したという話です……
@orumin proxy_pass で :9100/ しているので /good/foo や /bad/foo は :9100/foo にアクセスが飛んでほしかったんですが、 $backend:9100/ していると絶対に $backend:9100/ 自体にしかリクエストが飛ばないみたいで……