Nginx Proxy Redirectについて調べる

proxy_redirect を使おうとしたけど Nginx 初心者すぎていろいろ挙動を理解してなかったので整理

使ったリポジトリ (9 割ぐらいは Copilot が書いたやつ)

proxy_redirectってなに?

  • Location または Refresh ヘッダーを置き換えるもの
  • 詳しいことはここに

下のような設定があるとする

    listen 9003;

    location /default/ {
        proxy_pass http://api:5001/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_redirect default;
    }

この場合は default なので、proxy_passで設定した URL が Location にあると置き換えてリダイレクトされる。

Location: http://api:5001/

なら

Location: http://127.0.0.1:9003/default/

になる。

直接指定して置き換えることもできる。 こんな感じのはず

proxy_redirect {元のURI} {置き換えるURI}

いろんな例

相対パスにしてみる

例えば以下の設定をする

    location /related/ {
        proxy_pass http://api:5001/;

        proxy_redirect / /related/;
    }

こうなる

Location: / -> Location: http://127.0.0.1:9003/related/

置き換え先を絶対 URI にする

全く別のリソースを見に行ったってもいい

    location /rewrite/ {
        proxy_pass http://api:5001/;

        proxy_redirect / http://127.0.0.1:8080/rewrite/;
    }
Location: /redirect -> Location: http://127.0.0.1:8080/rewrite/redirect

多段プロキシを考えてみる

sample_nginx_secondary(:81) -> sample_nginx(9003) -> App で考える

server {
    listen 81;

    location /test/ {
        proxy_pass http://sample_nginx:9003/;

    }

    location /test-pr/ {
        proxy_pass http://sample_nginx:9003/;

        proxy_redirect / /test-pr/;
    }

    location /test-default/ {
        proxy_pass http://sample_nginx:9003/;

        proxy_redirect default;
    }
}

http://127.0.0.1:81/test-pr/related/配下でリダイレクトが起きても Location は"/“ではないのでさらに書き換えは行われない

Location: http://127.0.0.1:9003/related/ -> Location: http://127.0.0.1:9003/related/

sample_nginx 配下のパスを secondary が知っている必要がある

所感

  • 多段プロキシはトリッキーなことになりそうなので使わんほうがよさそう