{{tag>manimani.cc nginx}} # http アクセスを https にリダイレクトする いまどき tcp:80 なんか開けなくていいよ。tcp:443 だけ開いていれば十分でしょう……という思いが強くてずっと tcp:80 はファイアウォールで叩き落としていたんですが、どうも Bing のサイト所有者確認は http 開けていないと通らないみたいですね。google は https だけ開けていれば通ったんですけど。 ## nginx の設定 しょうがないですね、tcp:80 も開けましょう。でも基本的には tcp:443 しか受け付けませんよ。という設定を nginx.conf に追加します。 ### tcp:80 のバーチャルサーバーを定義する ということで、tcp:80 へのアクセスは tcp:443 に `301 moved permanently.` でリダイレクトします。 ``` server { listen 203.143.127.234:80; server_name www.manimani.cc; return 301 https://manimani.cc$request_uri; access_log /var/log/nginx/redirect_access_log main; error_log /var/log/nginx/redirect_error_log info; } server { listen 203.143.127.234:80; server_name manimani.cc; return 301 https://manimani.cc$request_uri; access_log /var/log/nginx/access_log main; error_log /var/log/nginx/error_log info; } ``` サブドメイン `www` 付きのバーチャルサーバーを定義しているのは、[サブドメイン "www" へのアクセスをリダイレクトする](/wiki/manimani.cc/redirect_subdomain_www) に書いた理由によります。 ### ログにサーバー側のポート番号を記録する ついでに、nginx のアクセスログにポート番号と、あとバーチャルサーバー名を記録するようにします。 ``` http { log_format main '$remote_addr - $remote_user [$time_local] ' '$server_name:$server_port ' # 追加 '"$request" $status $bytes_sent ' '"$http_referer" "$http_user_agent" ' '"$gzip_ratio"'; : : ``` `$server_name` を使用すると、どのバーチャルサーバー……要は `www.manimani.cc` にアクセスしたのか `manimani.cc` にアクセスしたのかが記録されます。`$server_port` はそのままですね。'80' とか '443' とかが記録されます。 ``` ip.addr.cli.ent - - [16/Apr/2017:13:26:52 +0900] www.manimani.cc:80 "GET /robots.txt HTTP/1.1" 301 400 "-" "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)" "-" ``` こんな感じで。 ## 余談 nginx のサイト、色々なところからリンク張られてる wiki.nginx.org とか、大抵ページがなくなってるんですよね。ドキュメントがものすごく探しづらくて……というかリソースとしては残っているけどどこからもリンク張られていなくて、検索エンジンで引っかけるしかないような状態になっている気がします。 今回はログに出力する `$server_name` `$server_port` っていう変数を調べたかったので、参考にしたのは[このページ](http://nginx.org/en/docs/http/ngx_http_core_module.html?&_ga=1.260963722.603606394.1491711315#variables)ですが、正攻法で nginx のトップページからここにたどり着く方法は不明です。