Nginx HTTPSリダイレクト設定

Nginxで301永久リダイレクトを使用してすべてのHTTPトラフィックをHTTPSにリダイレクトする方法を解説。wwwから非wwwへの正規URL処理とHSTSプリロード設定も網羅。

Routing

詳細な説明

HTTPからHTTPSへのリダイレクトにより、すべての訪問者が暗号化された接続を使用することが保証されます。301永久リダイレクトはブラウザと検索エンジンにHTTPS版が正規URLであることを通知し、SEOにとって重要です。

シンプルなHTTPからHTTPSへのリダイレクト

最もクリーンなアプローチは、ポート80でリッスンする専用のserverブロックですべてのリクエストに301リダイレクトを返す方法です。

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

正規URL(www vs 非www)

SEOの観点から、一つの正規形式を選び、もう一方をリダイレクトすべきです。以下はHTTPとwwwの両方を非wwwのHTTPS版にリダイレクトし、単一のURLにリンク評価を集約する例です:

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

server {
    listen 443 ssl;
    server_name www.example.com;
    return 301 https://example.com$request_uri;
}

rewrite ではなく return を使う理由

return 301 ディレクティブは単純なリダイレクトにおいて rewrite より効率的です。正規表現の評価が不要で、追加のlocationブロックを走査せず即座に処理するため、リクエストあたりのCPUオーバーヘッドが少なくなります。

クエリ文字列の保持

$request_uri 変数は元のパスとクエリ文字列をそのまま含みます。http://example.com/page?id=5 へのリクエストが正しく https://example.com/page?id=5 にリダイレクトされ、パラメータが失われることはありません。

HSTSヘッダー

HTTPS設定が正常に動作することを確認した後、Strict-Transport-Securityヘッダーを追加して、ブラウザに常にHTTPSを使用するよう指示します。これによりリピーターのリダイレクトラウンドトリップが不要になり、SSLストリッピング攻撃から保護されます。

add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;

リダイレクトのテスト

本番デプロイ前に curl -I http://example.com でリダイレクトをテストし、301ステータスコードと Location ヘッダーの値を確認してください。誤ったリダイレクト設定はリダイレクトループを引き起こし、サイト全体がアクセス不能になる可能性があります。

ユースケース

WebサイトをHTTPからHTTPSに移行し、既存のリンク、ブックマーク、検索エンジンのインデックスがシームレスにセキュア版にリダイレクトされるようにします。

Try It — Nginx Config Generator

フルツールを開く