nginxで変なポートでもSSL強制したい

400 Bad Request

The plain HTTP request was sent to HTTPS port

とか出るとき。
ブラウザで毎回https://って打ち直すのが面倒。

server{
port 8888;
if ($scheme = http) {
return 301 https://$server_name$request_uri;
}
ssl on;

とかしたいところだけれど動かない。
*ポート80がHTTPでポート443がHTTPSなど分けてるときは使える。

結局は

add_header Strict-Transport-Security 'max-age=31536000';

を追加して一回でもhttpsにアクセスすればhttpでもブラウザ側で何とかしてくれるようにした。

ちなみに

error_page 400 https://$server_name:$server_port$request_uri;

とか

if ($scheme = https) {
ssl on;
}

もだめ。

 

設定終わったら

HSTS Preload List Submission

でテストして、ついでに送信しておくとよい。(Chromeとかであらかじめhttpでアクセスしてもhttpsになるようブラウザに組み込んでくれるようになる)

載ったかどうかは

https://cs.chromium.org/codesearch/f/chromium/src/net/http/transport_security_state_static.json

このあたりで確認できるはず。