JoePHP関数「header()」を使った、HTTPリダイレクト(転送)処理に関してです。ウェブサイトのSEOの観点では、HTTPステータスコードをケアしたリダイレクト処理を行うことが重要となります。この記事では、本当にSEO面で安全なリダイレクト処理について、掘り下げて行きます。リダイレクト管理プラグインの利用PHPでのリダイレクト処理の書き方まず、実際のPHPでのリダイレクト(転送)の記述例からです。HTTPのヘッダを出力するためのheader()関数を使います。すべての出力を終了exit;数行のコードでリダイレクトが完了しますので、非常に簡単に処理を追加することができます。この処理には、いくつか知っておくべきことがあります。上記の処理に関して、3点の抑えるべきポイントです。HTTPステータスコードを加えてリダイレクトするリダイレクト関数の実行前に何も出力しないようにするリダイレクト実行後「exit;」を付記するそれでは、それぞれについて下記に詳しく補足します。1HTTPステータスコード「301」を加えてリダイレクトするSEOの観点で、意図に合致するHTTPステータスコードをリダイレクト時に発信することは、Google自身も推奨しています。検索エンジンに実装者の「リダイレクトの意図」を明確に伝える手段だからです。多くの場合、リダイレクト処理が必要になるケースは「URLが変更になったので、旧アドレスへのアクセスを永久に転送したい」という場合のほうが多いと思います。permanently)です。これはheader関数の第四引数で渡すことができます。リダイレクトに関するステータスコードは「30X」で指定されます。リダイレクト関連のHTTPステータスコードには、下記のようなものがあります。(Found)」となってしまいます。302は、通常「一時的な転送」を意味するシグナルです。発信することで、Googleの検索エンジンが、「永続的な転送」のメッセージを認識します。この場合、GoogleはもともとのURLが持っていたページに対する評価を新しいURLに引き継いでくれます。(302や、ステータスコードがなくても、評価を引き次ぐ可能性があります。301で明示した方が、間違いなく無難でしょう。)さらに、一般的にWEBブラウザーは302のシグナルに対して、「一時的な転送」というメッセージを認知しますので、URLに対してページのキャッシュをローカルに永続的には残さないように実装されるようです。ブラウザがローカルキャッシュをいつまでも参照し続けてしまえば、サーバー側の更新により「一時的な転送」が終了したタイミングを判断できないからです。場合によっては、302に対してはそのセッションの期間だけキャッシュ保持する、301に対しては長期的にキャッシュを保持するなど、シグナルの意味に合わせて最適な振る舞いが実装が行われているようですが、このキャッシュに関する仕様はブラウザ依存となります。その他のHTTPステータスコードについて302、303と307は、いずれも「一時的な転送」を意味します。規定の仕様上の詳細な違いありますが、ブラウザ側の実装はそれほど「大きくは」変わりません。されていますので「Webサイトの引っ越しやURL構造の変更に利用するの301か、302のいずれかである」と考えて問題無いはずです。詳細の仕様が気になる方は、HTTPの仕様を追いかけてみて下さい。日本語のWiki解説は分かり易いです。Mueller氏が過去にこれについて言及しています。redirects詰まるところは、Google自身がページの移動のシグナルとしての301の利用を公式に謳っており、特にURL全体が変更になる「WEB全体サイトの引っ越し」などには、301による転送処理の利用を強く推奨しています。転送の目的に合わせて、正しいシグナルを発信すべきでしょう。リダイレクトの使用2リダイレクト関数の実行前に何も出力しないようにするもう一つの注意点は、出力のタイミングです。下記のようなPHPリダイレクト処理は、エラーが生じてしまいます。出力を終了exit;問題なのは、PHPは「文字列の出力が発生した時点でheaderを送信してしまう」という点です。上記は、リダイレクト関数の実行前に、DOCTYPEの記述が発生してしまっています。headerを送信するためには、header関数より上に、いかなる文字列も出力してはいけません。(改行もだめ、空文字もだめ)特に、複数の人がフィアルを更新している場合、まれにBOM有のUTF-8を使用している場合がありますので、ご留意下さい。目に見える文字列がなくても、出力が発生してしまいます。BOM(バイトオーダーマーク)3リダイレクト実行後「exit;」を付記する実際、このexitはなくても、リダイレクト自体は問題なく動作します。クローラー(検索エンジンのボット)などのロボットは、HTTPヘッダー情報を無視してページの内のソースの読み込みを進めることがあります。明記することで、古いURL側のコンテンツを、インターネット上に残さない事を徹底できます。「exit();」でも「exit;」でもどちらでも構いません。これに関してはPHPドキュメントに記載をご覧ください。exit以上となります。これら3点を抑えれば、SEOセーフなリダイレクトとなります。参考リンク下記、PHPのリダイレクトに関する参考リンクです。PHPマニュアルは情報量が多いです。ヘルプもぜひ見ておいて下さい。リダイレクトの使用PHPマニュアル:header()PHPマニュアル:exitWordPress:アクションフック【補足】Wordpressテーマ内でリダイレクト関数の利用おまけで、補足情報ーワードプレスにおけるリダイレクト処理です。WordPressの応答速度とリダイレクトのタイミングを考えるWordPressテーマでは、初めてのテンプレート出力(例:index.phpの出力)が開始するより先に、プラグインのロード、テーマのロード、URLのパース、クエリの生成、実行・・などなど、多くの処理が行われます。「Wordpressメインクエリ」は、Wordpressがページを表示を行うために必ず毎回走る処理で、比較的重い処理です。(一概にいえないですが、だいたい1秒〜くらいはかかります)WordPressでリダイレクトするときは、できるだけ早いタイミングでheaderを応答させることが必要です。なくば、すべてのユーザがリダイレクト前に数秒待たされることになります。.htaccessの利用も検討すべきもっとも早い応答タイミングで、転送設定が現実的なのは、WEBサーバーレベルの応答ですので、基本的には(Apacheであれば).htaccessでリダイレクトを記述すべきです。一方で、複雑な設定や、複雑な条件分岐を行うとなると、htaccessの記法の制約で行うよりは、表現力の高いPHPレベルでリダイレクト処理を行うことも、しばしば有効な選択肢になります。アクションフックの利用WordPressテーマ内から素早く適切なタイミングで転送を行うため、アクションフックを利用するのがよいでしょう。テーマから利用できる、一番最初のフックは、「after_setup_theme」です。)これ以前のフックは、テーマファイルが読み込まれていない時点で発生するフックなので、テーマ内部からは、関数を差し込む事ができません。)実際には、下記をfunctions.phpに書き込むことで、functions.phpがロードされた直後に実行されます。(この時点ではまだ、メインクエリが実行されていません。)これは、functions.php内に記述された関数や変数を利用して分岐処理を追加するが可能なことを意味します。}}なお、上記は、ページURLに「my_old_page_url」がふくまれるときだけ転送、という正規表現を利用して条件をつけた例です。(#をデリミタに使うのはただの好みです。これによりURL文字列内のスラッシュをエスケープしなくて済みます)実際は、予期せぬリダイレクトが発生しないよう、できるだけ厳しくマッチングを取ったほうが無難でしょう。条件が複雑なほどテストする量が増えますし、予期せぬ検討漏れが発生します。慎重に設定しましょう。リダイレクト管理プラグインの利用WordPress環境において、リダイレクト処理の追記が頻繁に発生するような環境では、プラグインの利用も有効な手段です。「Redirection」は、記述したリダイレクト処理をDBで管理できる、最も一般的なプラグインです。設定次第で、htaccessレベルでも、PHPレベルでも、好きなようにリダイレクトが設定できます。旧URLへのアクセス数をカウントしてくれるなどの付加的な機能もあります。リダイレクトの管理が煩雑になりそうであれば、一度試してみる価値はあるでしょう。リモートブランチの最新に合わせようとしたら・・、あれ?コンフリクト・・?なにこれ、うまくいかない12021-05-11Git正規表現:数字の表現。桁数や範囲など正規表現での、数字に桁数に関する方法に関してです。これを応用して、数字の大きさの範囲を指定します。正規表現にいて、複数のパターンのうち「いずれか、または」を意味する「OR」を表現する方法についてです。正規表現の基本、行頭(行の先頭)と行末(行の末尾)を表す表現です。取り消し方法や、やり直し操作に関する方法をまとめました。どんなコミッ12018-07-15GitPHPに関連する記事PHP:特定の文字列を含むかどうか検索する方法、まとめ。PHPで「対象の文字列が、特定の文字(文字列)を含むかどうか」の判定するための方法です。一緒に、PHPの文字列関数に関し12018-05-09PHPMacOSにPHP7をインストール。Apacheで使う設定。MacでPHP7をインストールします。最初homebrewを使ったのですが、アパッチから動かすところで、ちょっと躓いた12017-06-01PHPWordPress:ログイン中のユーザが管理ユーザかどうか確認ワードプレスのコード内で、現在ログイン中のユーザが管理レベルのユーザかどうかで分岐します。2016-11-24PHPForbidden地獄。Yosemite更新でやり直したApacheとSQL設定yosemiteに更新したらApacheが動かなくなった。VIMPHPの記事PHP:特定の文字列を含むかどうか検索する方法、まとめ。2018-05-09MacOSにPHP7をインストール。Apacheで使う設定。2017-06-01WordPress:ログイン中のユーザが管理ユーザかどうか確認2016-11-24Forbidden地獄。強制し、リモートでローカルを上書きする方法2021-05-11正規表現:数字の表現。コマンドの履歴を削除する方法2021-12-19「WWWクリエイターズ」は、より多くの人が開発とウェブを楽しむための目指したウェブサイトです。コマンドラインやgitなど、開発ビギナーのつまづきやすい部分を共有しています。})(jQuery);閉じる。