SSL証明書をインストールしたら、すべてのHTTPトラフィックをHTTPSにリダイレクトする必要があります。リダイレクトがないと、http://yourdomain.comにアクセスする訪問者は、HTTPSが利用可能であっても暗号化された接続を使用しません。
検索エンジンがすべてのランキングシグナルをHTTPS URLに転送するよう、301(パーマネント)リダイレクトを使用してください。
Nginx
ポート80ですべてをリダイレクトする別のserverブロックを追加します:
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
これにより完全なURLパスが保持されます:http://example.com/page?q=1 → https://example.com/page?q=1。
編集後、テストしてリロードします:
sudo nginx -t && sudo systemctl reload nginx
Apache
オプション1: VirtualHostリダイレクト(推奨)
Apache設定に以下を追加します:
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
Redirect permanent / https://example.com/
</VirtualHost>
オプション2: .htaccess(共有ホスティング)
VirtualHost設定にアクセスできない場合(共有ホスティング)、サイトの.htaccessに追加します:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
mod_rewriteが有効になっている必要があります。
変更後:
sudo apachectl configtest && sudo systemctl reload apache2
リダイレクトの確認
# 301とLocation: https://...が返されるはず
curl -I http://yourdomain.com
期待される出力:
HTTP/1.1 301 Moved Permanently
Location: https://yourdomain.com/
HSTS: 二重のロック
リダイレクトが動作することを確認したら、HSTS(HTTP Strict Transport Security)を追加します。これにより、ユーザーがhttp://と入力しても、ブラウザに常にHTTPSを使用するよう指示します:
Nginx:
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
Apache:
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"
テスト用に短いmax-age(例:300秒)から始め、すべてが正常に動作することを確認してから2年(63072000)に増やしてください。
注意: 長い
max-ageでHSTSを有効にすると、HTTPSを削除してもブラウザはHTTP接続を拒否します。長い期間を設定する前に、HTTPSのセットアップが安定していることを確認してください。
よくあるリダイレクトパターン
wwwを非wwwにリダイレクト + HTTPS
# Nginx: www → 非www, HTTP + HTTPS → HTTPS
server {
listen 80;
listen 443 ssl;
server_name www.example.com;
ssl_certificate /etc/ssl/fullchain.pem;
ssl_certificate_key /etc/ssl/privkey.pem;
return 301 https://example.com$request_uri;
}
非wwwをwwwにリダイレクト + HTTPS
server {
listen 80;
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/ssl/fullchain.pem;
ssl_certificate_key /etc/ssl/privkey.pem;
return 301 https://www.example.com$request_uri;
}
古いドメイン全体をリダイレクト
server {
listen 80;
listen 443 ssl;
server_name olddomain.com www.olddomain.com;
ssl_certificate /etc/ssl/old-fullchain.pem;
ssl_certificate_key /etc/ssl/old-privkey.pem;
return 301 https://newdomain.com$request_uri;
}
古いドメインにも有効なSSL証明書が必要です。ブラウザはリダイレクトを受け取る前にHTTPSを確立する必要があるためです。両方のドメインをカバーするSAN証明書を使用するか、古いドメイン用に別の証明書を使用してください。
トラブルシューティング
リダイレクトループ(ERR_TOO_MANY_REDIRECTS)
これは通常、HTTPSサーバーブロックもHTTPSへリダイレクトしていることを意味します。ポート80のブロックのみがリダイレクトし、ポート443のブロックは通常通りコンテンツを配信するようにしてください。
もう1つの原因:ロードバランサーまたはプロキシ(Cloudflare、AWS ALB)がSSLを終端し、サーバーにHTTPを転送しています。サーバーはHTTPを検知してリダイレクトします。X-Forwarded-Protoヘッダーを確認して修正してください:
# プロキシ/ロードバランサーの背後
if ($http_x_forwarded_proto = "http") {
return 301 https://$host$request_uri;
}
検索エンジンにキャッシュされた古いHTTP URL
リダイレクトを設定したら、Googleに変更を通知してください:
<link rel="canonical">をhttps://に更新する- サイトマップのURLを
https://に更新する - Google Search ConsoleでHTTPSプロパティを追加する
Googleは301リダイレクトをたどりながら、インデックスされたURLを徐々に更新します。
よくある質問
wwwから非www(またはその逆)へのリダイレクトも同時に行うべきですか?
はい。1つの正規形式を選び、もう1つをリダイレクトしてください。これにより検索エンジンでの重複コンテンツを避けられます:
# wwwを非wwwにリダイレクト(Nginx)
server {
listen 80;
listen 443 ssl;
server_name www.example.com;
return 301 https://example.com$request_uri;
}
リダイレクトはSEOに影響しますか?
301リダイレクトはランキングシグナルを宛先URLに転送します。GoogleはHTTPからHTTPSへの移行に301リダイレクトを推奨しています。小さな一時的な変動はあるかもしれませんが、HTTPSのランキングシグナルにより長期的なSEOは向上します。
リダイレクト後の混合コンテンツはどうなりますか?
リダイレクトはページURLを処理しますが、HTMLがリソース(画像、スクリプト、CSS)をhttp:// URLで参照していると、ブラウザがそれらをブロックしたり警告を表示したりします。混合コンテンツ修正ガイドをご覧ください。
リダイレクトが正しく動作しているかテストするにはどうすればいいですか?
# リダイレクトチェーンを確認
curl -ILs http://yourdomain.com | grep -E '^HTTP|^Location'
期待される出力:
HTTP/1.1 301 Moved Permanently
Location: https://yourdomain.com/
HTTP/2 200
最初のレスポンスはHTTPSのLocationを含む301で、最終レスポンスは200であるべきです。
DNSレベルとサーバーレベル、どちらでリダイレクトすべきですか?
サーバーレベル(Nginx/Apache設定または.htaccess)です。DNSレベルのリダイレクト(CloudflareのPage Rulesなど)は動作しますが、ネットワークホップが追加され、リダイレクト動作の制御が少なくなります。サーバーレベルのリダイレクトの方が高速で信頼性が高いです。