WordPressの余計なヘッダを除去する方法

 WordPressは便利なCMSですが、デフォルトで出力されるヘッダーが多く、不要な情報が含まれることがあります。この余計なヘッダーは、セキュリティやパフォーマンスの観点から削除する方が望ましい場合があります。

 本投稿では、余計なヘッダーを除去する方法と、その中でも標準的な手段では削除できないヘッダーに対応する方法をご紹介します。


なぜ余計なヘッダーを削除するのか?
  • WordPressではデフォルトで以下のようなヘッダーが出力されます:

  • Link: WordPress REST APIのエンドポイントを示すヘッダー。

  • X-Redirect-By: リダイレクト元を示すヘッダー。

  • X-Powered-By: 使用中のプラットフォーム情報(PHPなど)を明らかにするヘッダー。

 これらの情報は、開発者にとって有益な場合もありますが、外部に公開する必要がないケースがほとんどです。特にセキュリティの観点から、攻撃者に不要な情報を与えないために削除するのが一般的です。


なぜ標準的な方法では削除できないヘッダーがあるのか?

 WordPressの仕組みでは、特定のヘッダーが通常の処理フローの中で後から追加されることがあります。例えば、remove_action() を使用しても、WordPressのコアがその後の段階でヘッダーを再び追加してしまうケースがあるため、完全に削除することができません。

 また、header_remove() を利用しても、PHPレベルでの処理がWordPressのフックシステムよりも早い段階で実行される場合には無効化できないことがあります。このようなヘッダーは、WordPressの内部処理やプラグイン、テーマの設定によって動的に付加されるため、標準的な方法では対処できないのです。


標準的なヘッダーの削除方法

WordPressでは、以下の関数を利用して不要なヘッダーを削除できます:

1. remove_action() を使用

以下のコードをテーマの functions.php に追加します:

// Linkヘッダーを削除
remove_action('wp_head', 'rest_output_link_wp_head');

// WordPressのバージョン情報を削除
remove_action('wp_head', 'wp_generator');

2. header_remove() を使用

PHPの標準関数 header_remove() を使ってヘッダーを削除できます:

// X-Powered-Byヘッダーを削除
header_remove('X-Powered-By');



標準手法では削除できないヘッダーへの対策

 remove_action() や header_remove() を使っても削除できないヘッダーがあります。これは、WordPressが処理の後半でこれらのヘッダーを追加しているためです。

  • 解決策: header_register_callback() を活用

 PHPの header_register_callback() を使うことで、WordPressがすべての処理を終えた後に不要なヘッダーを除去できます。

以下のコードを functions.php

/*************************************************
 * WordPressの標準関数では削除できないヘッダーを除去
 *
 * - Link: 出力元が不明なヘッダー(恐らく後付けされる)
 * - X-Redirect-By: 不要なリダイレクト情報
 *************************************************/
header_register_callback(function () {

    // 不要なLinkヘッダーを削除
    header_remove('Link');

    // リダイレクト時のX-Redirect-Byヘッダーを削除
    header_remove('X-Redirect-By');
});

おまけ確認方法

curl -I https://your-site.com

ななし: