Rails 以外でも、当てはまるケースはあるかもしれません。
問題
Nginx などの Web サーバを Reverse Proxy として、バックエンドで Rails アプリケーションを動かしているとします。
Reverse Proxy では http://example.com:8000 などポート番号付きでリクエストを受け付けています。
Nginx の設定は例えば次のような感じ:
http {
server {
listen 8000;
server_name example.com:8000;
proxy_set_header X-Forwarded-Host $host;
location / {
proxy_pass http://localhost:3000; # rails-app
}
}
}
Rails アプリケーションでリダイレクトが発生した場合には http://example.com:8000 にリダイレクトしてほしいのですが、この設定ではポート番号なしの http://example.com にリダイレクトされてしまい、以降のリクエストで Rails にプロキシされなくなってしまいます。
解決方法
上の設定ファイルで proxy_set_header X-Forwarded-Host
の値を $host:$server_port
とポート番号付きにすれば OK です。(X-Forwarded-Host
でなくて Host
でも可)
+ proxy_set_header X-Forwarded-Host $host:$server_port;
- proxy_set_header X-Forwarded-Host $host;
これで http://example.com:8000 にリダイレクトされるようにできました。