関数

redirect_canonical() – 受信リンクを正規のサイトURLへリダイレクトする

WordPressのredirect_canonical()関数は、アクセスされたURLがサイト設定の正規URLと異なる場合に、自動的にリダイレクトして統一されたURLへ誘導します。

これにより、重複コンテンツの回避やSEO最適化を図る効果が期待できます。

ただし、管理画面や検索、フィードなど一部のリクエストには適用されず、サーバ環境やSSL設定による挙動の違いも考慮されています。

機能および動作の基本

redirect_canonical()の目的

WordPressのredirect_canonical()は、サイトにアクセスするユーザーが正規のURLへ統一されるようにリダイレクトする機能です。

これにより、重複コンテンツが発生せず、検索エンジンがサイトを正しく認識できるようになります。

また、URLの形式が異なる場合でも、最終的に統一されたURLへ誘導されるため、ユーザーが安定した環境でコンテンツを閲覧することが可能となります。

リダイレクト対象となるリクエスト

一般ユーザーのアクセスに対して、redirect_canonical()はリダイレクトを適用します。

たとえば、以下の場合にリダイレクトが発生します。

  • ユーザーが誤った形式のURL(例:末尾のスラッシュの有無、ホスト名のwww有無の違い)でアクセスした場合
  • 間違ったパラメータや不要なクエリ文字列が付与された場合

この処理により、ユーザーは常に正規URLでコンテンツを表示する環境が確保され、サイト全体の一貫性が守られます。

リダイレクトが適用されないケース

一部のリクエストでは、リダイレクト処理が適用されません。

具体的な例としては、以下のようなケースがあります。

  • 管理画面へのアクセス(is_admin()が真の場合)
  • 検索結果ページ、RSSフィード、トラックバックなどの特殊なリクエスト

また、投稿プレビューの場合もリダイレクトは行われず、ユーザーが意図したコンテンツを確認できるようになっています。

URLの解析と正規化処理

URL分解とパス整形の仕組み

redirect_canonical()は、リクエストされたURLをまずparse_url()関数で分解します。

分解された要素(スキーム、ホスト、パス、クエリなど)をもとに、正規化処理が行われます。

この解析処理により、余計な文字や記号の除去、不要な空白やエンコードの修正が進められ、正確なパス情報が取り出されます。

不要文字の除去とパス調整

パス部分では、末尾の余分なスラッシュや、改行、不可視文字などが除去され、完全なパスが形成されます。

正規表現を活用して不必要な部分が削除されるため、リダイレクト先のURLが一貫した形式となります。

// URLから余分な文字を除去する例
function sanitize_path($path) {
    // 末尾のスラッシュを統一
    $path = rtrim($path, '/');
    // 不要な空白を削除
    $path = preg_replace('/\s+/', '', $path);
    return $path;
}
/sanitized/path

クエリパラメータの整理

解析されたクエリ文字列については、プレビュー用や検索パラメータ、ページネーション情報など、リダイレクトに不要なものを削除する処理が行われます。

この処理にはremove_query_arg()などの関数が活用され、必要なパラメータのみが残るように調整されます。

ホスト名およびポート番号の統一

リダイレクトされるURLがサイトの正規URLと一致するために、ホスト名とポート番号の整合性が確認されます。

これにより、異なる表記のホスト名や異なるポート番号でアクセスされた場合でも、正しい設定値へ誘導される仕組みとなっています。

ホスト名の検証と調整

サイトの基本URLはhome_url()などで定義されているため、リクエストされたホスト名がこの設定に沿っているか検証されます。

必要に応じて、ホスト名の変更が行われ、www付き・なしの違いが統一されるように調整が進められます。

// サイト設定に合わせたホスト名の統一例
function adjust_host($redirect, $home_url) {
    $user_home = parse_url($home_url);
    $redirect['host'] = $user_home['host'];
    return $redirect;
}
$redirect_data = ['host' => 'example.net'];
$redirect_data = adjust_host($redirect_data, home_url());
Array
(
    [host] => example.com
)

ポート番号の整合性チェック

サイト設定にポート番号が含まれている場合、リクエストされたURLのポートも一致するか検証されます。

設定されていない場合は、リダイレクト先のポート番号は削除されるか、デフォルトのHTTP/HTTPSポートが使用されるため、統一されたアドレスへ誘導されます。

サーバ環境とSSLの考慮

IIS環境におけるパーマリンク設定との連携

IIS環境では、パーマリンクの設定が正しく動作していない場合、redirect_canonical()の処理がスキップされるケースがあります。

そのため、IISでサイト運用する場合は、パーマリンクのサポート状態を十分に確認し、必要に応じてサーバ側の設定変更を検討する必要があります。

Apache環境での動作の違い

Apache環境では、通常、パーマリンクが正しくサポートされるため、redirect_canonical()が自動的に正規のURLを算出してリダイレクトが実行されます。

さらに、カスタムの.htaccessルールを併用することで、さらに詳細なリダイレクト制御が可能となる場合もあります。

SSL環境下でのスキーム選択

SSL環境下の場合、is_ssl()関数を利用してリクエストがHTTPSかどうかを判定し、適切なスキームを付与してURLが生成されます。

以下のサンプルコードは、SSL環境でのスキーム選択の一例です。

// サンプルコード: SSL環境でのリダイレクトURL生成例
$scheme = is_ssl() ? 'https://' : 'http://';
$requested_url = $scheme . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
// $requested_urlにはSSL判定に基づき正しいスキームが付与される
https://example.com/sample/page/

カスタマイズと内部処理の連携

フィルターフックによる動作変更

WordPressではフィルターフックを利用して、redirect_canonical()が生成するリダイレクトURLの動作を自由に変更することが可能です。

特定の条件下でリダイレクトをキャンセルしたり、別のURLを返すなど、柔軟な対応が可能となります。

apply_filtersの利用例

プラグインやテーマでredirect_canonicalフィルターをカスタマイズすることで、特定のクエリパラメータが含まれるときにリダイレクトをキャンセルする例を以下に示します。

// サンプルコード: 特定のクエリパラメータがある場合にリダイレクトをキャンセルする例
add_filter('redirect_canonical', 'custom_redirect_canonical', 10, 2);
function custom_redirect_canonical($redirect_url, $requested_url) {
    // URLに "no_redirect" が含まれる場合はリダイレクトを実行しない
    if (strpos($requested_url, 'no_redirect') !== false) {
        return false;
    }
    return $redirect_url;
}
// クエリパラメータ "no_redirect" が含まれる場合、現在のURLがそのまま保持される

内部フックによる処理分岐

redirect_canonical()は内部フックを利用して、さまざまなWordPress機能と連携しています。

この内部処理により、投稿プレビューやattachmentページなど、特定のケースではリダイレクトが制御され、無用な処理が実行されないようになっています。

リダイレクトループ防止策

同一のURLへの繰り返しリダイレクト(リダイレクトループ)を防ぐため、redirect_canonical()はリクエストURLと生成されたリダイレクト先URLが既に一致しているかどうかをチェックします。

数学的には、リダイレクト条件は以下のように表せます。

If f(requested_url)f(redirect_url) then perform redirect

この条件により、リダイレクトループが防止され、安定した動作が保たれます。

特定リクエストの除外処理

管理画面、検索結果、RSSフィードなど、特定のリクエストに対してはリダイレクトが行われないように制御が実装されています。

たとえば、以下の条件に該当する場合、リダイレクト処理がキャンセルされる仕組みです。

  • is_admin()が真の場合
  • 投稿プレビューの場合
  • 特定のカスタムクエリが存在する場合

こうした条件分岐により、ユーザーや管理者が意図したページに迅速かつ正確にアクセスできる環境が確保されます。

まとめ

本記事では、WordPressのredirect_canonical()が、正規URLへのリダイレクトを通してサイトの一貫性を保ち、重複コンテンツを防ぐ仕組みを解説しています。

URLの解析や正規化処理、ホスト名・ポート番号の調整、SSL環境下でのスキーム設定について学ぶとともに、リダイレクト対象や除外条件、フィルターフックによるカスタマイズの活用法についても触れています。

関連記事

Back to top button