コンテンツにスキップ

HTTP・HTTPS・リダイレクト

nginx では、HTTP 用の server と HTTPS 用の server を分け、HTTP 側で return を使って HTTPS へリダイレクトする構成がよく使われる。


HTTP は、暗号化されていないアプリケーション層の通信である。HTTPS は、HTTP を TLS の上で流す通信である。

HTTP
client -> nginx
HTTPS
client -> TLS -> nginx -> HTTP処理

HTTPS では、nginx が TLS サーバー証明書と秘密鍵を使って TLS 接続を受ける。nginx が TLS を終端すると、その後の処理は通常の HTTP リクエストとして server や location に渡される。


HTTPS を受ける nginx には、少なくとも次が必要になる。

要素 例
待ち受け設定 listen 443 ssl;
サーバー証明書 ssl_certificate /etc/nginx/tls/www.example.com/fullchain.pem;
サーバー秘密鍵 ssl_certificate_key /etc/nginx/tls/www.example.com/privkey.pem;
対象ホスト名 server_name www.example.com;

証明書の SAN には、実際にブラウザーや curl で接続する DNS 名を入れる。証明書の作成は Server Certificateの作成 を参照する。


HTTP で来たアクセスを HTTPS に寄せるには、HTTP 用 server で return を使う。

server {
listen 80;
listen [::]:80;
server_name www.example.com;
return 301 https://$host$request_uri;
}

return 301 は、リクエスト処理をそこで止め、クライアントに恒久的なリダイレクトを返す。$host$request_uri を使うと、元の Host と URI を保ったまま scheme だけを HTTPS に変えられる。


リダイレクトでよく使うステータスは次のとおり。

ステータス 意味 備考
301 恒久的リダイレクト 多くの HTTP -> HTTPS リダイレクトで使われる
302 一時的リダイレクト 一時的な移動向け
308 恒久的リダイレクト メソッドを維持したい場合に使う

学習用の基本構成では 301 でよい。POST などのメソッド維持を厳密に考える API では 308 も検討する。


HTTP Basic 認証は、ユーザー名とパスワードをリクエストに載せる。TLS なしの HTTP で使うと認証情報が保護されない。

そのため、PAM 経由の LDAP 認証を nginx で使う場合も、外部からの入口は HTTPS にする。

client
-> HTTPS
-> nginx
-> auth_pam
-> PAM
-> LDAP