リダイレクト追跡
サイトには4つの玄関があります。httpとhttpsで、それぞれwwwありとなし。この追跡は4つすべてをたどり、各ホップを記録し、すべてが同じHTTPSアドレスにたどり着くかを確かめます。
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のままです。新しいプラットフォームでよく使われます。 |
302 | Found(一時的) | ログインのための寄り道、メンテナンスページ、A/Bテスト。 |
307 | 一時的、メソッド維持 | フォームやAPI向けの302と同じです。ブラウザーが自分で行うHSTSによるアップグレードも307として表示されます。 |
303 | See 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で試すか、ここでもう一度追跡してください。当サイトのサーバーはチェック間でキャッシュを持ちません。