リダイレクト追跡

サイトには4つの玄関があります。httpとhttpsで、それぞれwwwありとなし。この追跡は4つすべてをたどり、各ホップを記録し、すべてが同じHTTPSアドレスにたどり着くかを確かめます。

例: github.com, bbc.co.uk

1つのサイト、4つのアドレス

人間には、これらはすべて同じ場所に見えます。

http://example.com/
http://www.example.com/
https://example.com/
https://www.example.com/

ブラウザーや検索エンジンのクローラーには、4つの別々のオリジンに見えます。スキームもホスト名も違うことがあり、ウェブの設計上、同じ内容を返さなければならない決まりは何もありません。一方で、印刷されたチラシ、古いブックマーク、5年前の掲示板の投稿にあるリンクは、それぞれ別のものを使っています。

それらを結び付けるのがリダイレクトです。サーバーはページを返さず、300番台の3桁のステータスと、別のアドレスを示すLocationヘッダーで応答し、ブラウザーはそこへ移動します。整ったサイトは4つのうち1つを本当のアドレスに決め、残り3つはそこへ1回のリダイレクトで応答します。

訪問者を移動させるステータスコード

コード意味使う場面
301恒久的な移動HTTPからHTTPS、wwwありからなし、名前を変えたページ。ブラウザーはキャッシュし、検索エンジンはインデックスの登録を新しいアドレスに移します。
308恒久的、メソッド維持301と同じですが、POSTはPOSTのままです。新しいプラットフォームでよく使われます。
302Found(一時的)ログインのための寄り道、メンテナンスページ、A/Bテスト。
307一時的、メソッド維持フォームやAPI向けの302と同じです。ブラウザーが自分で行うHSTSによるアップグレードも307として表示されます。
303See Otherフォーム送信後にブラウザーを結果ページへ送るとき。

追跡結果の「経路」列には、各ホップのコードをサーバーが返した順に表示します。

追跡結果の判定方法

当サイトのサーバーが4つのアドレスをそれぞれ要求し、最大8回までリダイレクトをたどります。多くがたどり着いた行き先をサイトのメインアドレスとみなし、各開始点をそれと比べます。

最終アドレス/1ホップ
その変種がメインアドレスそのものか、1回のリダイレクトでそこへ着きます。これが目指す状態です。
2ホップ以上
チェーンです。たとえばhttp://wwwからhttps://www、さらにhttps://へ。動きはしますが、ホップが1つ増えるごとに往復が丸ごと1回かかり、スマートフォンでは100〜300 msになることがよくあります。
一時的なリダイレクト
途中に302、303、307があります。恒久的なつもりのルールなら、検索エンジンはどちらのアドレスを残すべきか迷います。
別のアドレス
その変種は別の場所に着くので、サイトが2つのバージョンで存在していることになります。エラーと判定します。
失敗
応答がありません。wwwなしのドメインではエラー、wwwでは警告と判定します。

HTTPSでない行き先は常にエラーです。最終ページでは、HTMLの混在コンテンツも調べます。スクリプト、スタイルシート、フレーム、フォームの送信先、画像、メディアのうち、まだhttp://で指定されているものです。ブラウザーは最初の4種類をブロックするのでこれはエラー、画像とメディアは警告です。最後にrel="canonical"リンクを読み、リダイレクトの行き先と違うホスト名を指していれば警告します。

ルールは1回で書く

チェーンは、2つの層がそれぞれ半分ずつ仕事をすると生まれます。たとえばサーバーの管理パネルがHTTPSを強制し、その後プラグインがwwwを外す場合です。1つのルールで、すべての変種を最終アドレスへ直接送りましょう。

nginx

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;
}

Apache(.htaccess)

RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [L,R=301]

Cloudflareでは「Always Use HTTPS」をオンにし、ホスト名用のリダイレクトルールを1つ追加します。wwwの名前には専用のDNSレコードが必要で、証明書の対象にも含まれていなければなりません。そうでないと、訪問者はリダイレクトまでたどり着けません。TLS証明書チェッカーで確認できます。

追跡するのはトップページだけで、HTTPステータスコードで送られるリダイレクトだけです。JavaScriptや<meta http-equiv="refresh">タグによるリダイレクトはたどらず、深い階層のページは別のルールに従うこともあります。混在コンテンツはHTMLのソースから検出するので、後からスクリプトが追加するリソースは見えません。

よくある質問

301リダイレクトと302リダイレクトの違いは何ですか?

301は移動が恒久的だと伝えます。ブラウザーはそれを覚え、検索エンジンは古いアドレスを新しいものに置き換えます。302は元のアドレスが今も正しく、寄り道は終わるかもしれないと伝えます。HTTPSとwwwのルールには301か308を使ってください。

サイトはwwwありとなし、どちらにすべきですか?

検索順位には関係ありません。wwwなしのドメインのほうが短くなります。wwwの形はCNAMEにでき、一部のCDNやサーバーの構成ではそれが必要です。大事なのは、片方がもう片方へリダイレクトすることです。

リダイレクトチェーンはSEOに悪影響がありますか?

2〜3ホップのチェーンでも順位のシグナルは引き継がれ、Googlebotは合計10ホップまでたどります。失うのは、長い経路から入ってくるすべての訪問者にとっての速度です。また、チェーンの輪が1つ増えるたびに、壊れうるものが1つ増えます。

混在コンテンツとは何ですか?

HTTPSのページが、暗号化されていないhttp://でリソースを読み込んでいる状態です。ブラウザーはそうしたスクリプト、スタイルシート、フレームをブロックし、画像はアップグレードを試みます。たいていはHTTPSへ移行したときに、古いアドレスがコンテンツに残ったものです。

リダイレクトを直したのに、ブラウザーがまだ古いアドレスに行くのはなぜですか?

ブラウザーは301の応答をキャッシュし、それが数か月に及ぶこともあります。プライベートウィンドウやcurl -I http://example.comで試すか、ここでもう一度追跡してください。当サイトのサーバーはチェック間でキャッシュを持ちません。