Rails の force_ssl を有効にしたまま Nginx から Strict-Transport-Security ヘッダーを追加する
force_ssl: true の際に ActionDispatch::SSL
は必ず Strict-Transport-Security を付与する。
ssl_options の hsts に false
を設定した場合にも max-age=0
でつけてくる。
Nginx のみで Strict-Transport-Security をつけるようにしたかった。
以下の issue で ssl_options の設定で HSTS ヘッダーを無効にする提案があった。 https://github.com/rails/rails/issues/48609
結果としては、Rails では HSTS ヘッダーを必ずつけるようにして安全側に倒す。 リーバスプロキシで HSTS ヘッダーを設定したい場合はリバースプロキシで Rails がつけた HSTS ヘッダーを削除せよとのこと。
削除コマンドも提示されていた。
https://github.com/rails/rails/issues/48609#issuecomment-1662511786
location @app {
# ...
proxy_hide_header Strict-Transport-Security;
add_header Strict-Transport-Security "max-age=31536000;";
# ...
}
http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_hide_header
ちなみに同じ値であっても重複してつけた場合は https://hstspreload.org/ で以下のようにエラーが出る
Error: Multiple HSTS headersResponse error: Multiple HSTS headers (number of HSTS headers: 2).
Read other posts