現象
SSLを導入したリバースプロキシ―(apache mod_proxy)
バックエンドのwsgiサーバー(apache mod_wsgi+flask)
リバースプロキシ―がhttpsでリクエストを受け、httpでバックエンドのwsgiサーバーにプロキシーする構成。
この時、flaskでリダイレクトするとクライアントブラウザでのリダイレクト先のurlがhttpになってしまった。
リバースプロキシ―の設定
<VirtualHost *:443>
...
ProxyPass / http://my.wsgi.server/
ProxyPassReverse / http://my.wsgi.server/
...
</VirtualHost>
mod_proxyはドキュメントに従って設定しているはず。
Location
curl -v http://my.wsgi.server/
するとLocationにhttp://付きの絶対パスが指定されていた。
どうやらこれが問題らしい。絶対パスを指定すると、ProxyPassReverseは正常に動作しない(スキームが書き換わらない)ようだ。
flaskでは...
url_for(..., _scheme="https") を使用すれば、スキームをhttpsにできそう。
しかし、変更箇所が大きいのと、バックエンドのwsgiサーバー単独で動かなくなるので見送り。
RFCでは?
RFC7321では相対パスが認められている模様。
https://triple-underscore.github.io/RFC7231-ja.html#section-7.1.2
Locationヘッダを書き換えることにする。
wsgiサーバー側でLocationを書き換える
<VirtualHost *:80>
...
Header edit Location ^http:// //
...
</VirtualHost>
curl -v http://my.wsgi.server/
Locationからスキームが消え、リバースプロキシー経由でのリダイレクトが正常に動作するようになった。