Amazonで商品を見る セール会場へ

WordPressにセキュリティヘッダーを設定する方法|.htaccessとfunctions.phpの書き方と確認の手順

サイトの診断ツールやセキュリティの点検で「セキュリティヘッダーが設定されていません」と指摘されることがあります。

WordPressの初期状態では、公開ページにセキュリティヘッダーはほとんど付きません。

この記事では、6種類のヘッダーの役割と、WordPressで設定する2つの書き方、設定できたかを確かめる手順を紹介します。

この記事で使うセキュリティヘッダー診断は、当サイトと同じMOTOKI合同会社が作った「WEBツール箱」の1つです。

無料で、会員登録なしで使えます。

最終確認日:2026年9月28日

目次

著者

WEB制作をしているデジタルノマド
WordPressのカスタマイズが好きで、色々と自作しています。

WordPressのカスタマイズに困ったらご相談ください!

この記事で分かること

  • セキュリティヘッダー6種類の役割
  • 今のサイトの設定を確かめる手順
  • .htaccessとfunctions.phpでの書き方
  • CSPだけは慎重に進める理由

セキュリティヘッダーとは

セキュリティヘッダーは、サーバーがページと一緒にブラウザーへ送る「このページはこう扱ってください」という指示です。

設定していないとすぐに侵入されるものではなく、万一の攻撃で被害を小さくするための備えです。

ツールでは、次の6種類を100点満点で採点します。

ヘッダー防ぐもの配点
Strict-Transport-Security(HSTS)HTTPでの接続による盗み見や改ざん20
Content-Security-Policy(CSP)改ざんされたスクリプトの実行20
X-Content-Type-Options画像などに偽装したスクリプトの実行15
X-Frame-Options他サイトに埋め込んでクリックをだまし取る攻撃15
Referrer-Policy移動先のサイトへのURLの漏れ15
Permissions-Policy使わないカメラ・マイク・位置情報の呼び出し15

X-Frame-Optionsは、CSPの「frame-ancestors」で代わりに設定していても満点になります。

HSTSは、有効期間(max-age)が半年より短いと点数が半分になります。

今のサイトの設定を確かめる

  1. セキュリティヘッダー診断を開く
  2. 調べたいサイトのURLを入れて「診断する」を押す
  3. 点数と、6種類それぞれの結果が出る
  4. 足りないものがあれば、そのまま貼れる.htaccessの設定例が出る

ツールはページに1回アクセスして、返ってきたヘッダーを読むだけです。

攻撃を試すようなことはしません。

実際に調べた結果

wordpress.org|25点

wordpress.orgの診断の結果です。

セキュリティヘッダー診断でwordpress.orgを調べた結果
wordpress.orgを調べた結果。25点で、足りない4種の設定例が出る(2026/09/28時点の表示)

設定されていたのはHSTSとX-Frame-Optionsの2つだけで、25点でした。

HSTSは有効期間が3600秒(1時間)と短いため、半分の10点になっています。

結果の下には、足りない4種類をまとめた.htaccessの設定例が出ます。

WordPressの配布元でも、公開ページのヘッダーはこの程度しか付いていません。

このサイト|80点

セキュリティヘッダー診断でこのサイトを調べた結果
このサイトを調べた結果。CSPだけが未設定で80点(2026/09/28時点の表示)

このサイトでは、CSPを除く5種類を設定しています。

足りないのはCSPだけなので、設定例にもCSPの1行だけが出ました。

WordPressのサイトでは、CSPだけが最後に残ることがよくあります。

理由は後の「CSPは様子見から始める」で説明します。

WEBツール箱|94点

セキュリティヘッダー診断でWEBツール箱を調べた結果
WEBツール箱を調べた結果。6種すべて設定して94点(2026/09/28時点の表示)

WEBツール箱は6種類すべてを設定していて、94点でした。

満点にならないのは、CSPに「unsafe-inline」が入っているためです。

ページの中に直接書いたスクリプトを許可する指定で、これがあるとCSPの効き目が下がります。

WordPressで設定する方法

設定する場所は、サーバーの設定ファイル(.htaccess)か、テーマのfunctions.phpのどちらかです。

方法向いているサイト効く範囲
.htaccessApacheやLiteSpeedで動くレンタルサーバーその.htaccessが適用されるパスの応答。CDNや別サーバーのファイルは別確認
functions.php.htaccessを使えないサーバー、テーマ側で管理したい場合WordPressが作る公開ページだけ

.htaccessに書く

ツールが出した設定例を「コピー」で写し、サイトのルートにある.htaccessに貼ります。

貼る場所は「# BEGIN WordPress」から「# END WordPress」までの外にしてください。

この2行の間は、パーマリンクの設定を保存したときにWordPressが書き換えるため、中に書いた設定が消えることがあります。

IfModuleはモジュールが無い場合に中の設定を省略しますが、構文ミスや許可されない設定による500エラーまでは防ぎません。編集前に.htaccessを保存し、エラー時は追加部分を戻します。

ツールが出す設定例の1行は、次のような形です。

Header always set \
  X-Content-Type-Options "nosniff"

ここでは画面の幅に合わせて2行に分けています。

行末の「\」は次の行へ続くという意味の記号で、Apacheはこのままでも1行として読みます。

迷ったら、ツールの出力のとおり1行で貼ってください。

functions.phpに書く

子テーマのfunctions.phpか、Code Snippetsのようなコードを追加するプラグインに書きます。

WordPressには、ページを送る直前に動く「send_headers」という仕組みがあり、そこでヘッダーを足します。

add_action( 'send_headers', function () {
  $h = array(
    'X-Content-Type-Options'
      => 'nosniff',
    'X-Frame-Options'
      => 'SAMEORIGIN',
    'Referrer-Policy'
      => 'strict-origin-when-cross-origin',
    'Permissions-Policy'
      => 'camera=(), microphone=(), '
       . 'geolocation=()',
  );
  foreach ( $h as $k => $v ) {
    header( "$k: $v" );
  }
} );

この方法で付くのは、WordPressが作る公開ページだけです。

画像やCSSなどのファイル、管理画面には付きません。

なお、WordPress本体はログイン画面と管理画面にだけ「X-Frame-Options: SAMEORIGIN」を自動で付けています。

Referrer-Policyの値の選び方は「Referrer-Policyをレスポンスヘッダーに追加する方法」で一覧にしています。

HSTSは常時SSL化が済んでから

HSTSは、ブラウザーに「このドメインは決めた期間、HTTPSでしか開かない」と覚えさせる指示です。

設定したあとにHTTPSをやめると、覚えたブラウザーからはサイトが開けなくなります。

すべてのページがHTTPSで開けることを確かめてから設定してください。

不安なときは、有効期間を300秒のように短くして試し、問題が無ければ1年(31536000秒)に伸ばします。

ツールの設定例にある「includeSubDomains」は、サブドメインにも同じ指示をかける指定です。

HTTPSに対応していないサブドメインがある場合は、この指定を外してください。

CSPは様子見から始める

CSPは、ページが読み込んでよいスクリプトや画像の出どころを限る指示です。

CSPは読み込み元やスクリプトの実行を制限しますが、設定を誤ると表示や機能が止まります。ヘッダー間で効果を一律に順位付けはできません。

WordPressでは、テーマやプラグインがページの中にスクリプトを直接書き込むことが多く、解析タグ・広告・埋め込み動画も外のドメインから読み込みます。

そのため、いきなり本番に適用せず、次の手順で進めます。

  1. ヘッダー名を「Content-Security-Policy-Report-Only」にして設定する(止めずに、違反だけをブラウザーに記録する)
  2. サイトの主なページと、問い合わせフォームを開く
  3. ブラウザーの開発者ツールの「Console」に出た違反を見て、必要な出どころを許可に足す
  4. 主要な操作とログイン状態を変えて確認し、許可先を必要最小限に見直したうえで本適用する。コンソールの警告だけを消すために許可を広げない

ツールが出すCSPの設定例は、多くのサイトで動くよう「unsafe-inline」を含めた緩めの内容です。

満点を目指すより、サイトが止まらないことを優先してください。

ツールを使わずに確かめる方法

ヘッダーは、ブラウザーの開発者ツールでも見られます。

  1. 調べたいページを開き、F12キー(Macはcommand+option+I)で開発者ツールを開く
  2. 「Network」タブを選び、ページを再読み込みする
  3. 一番上に出るページ本体の行をクリックし、「Headers」の「Response Headers」を見る

コマンドで確かめる場合は、curlを使います。

curl -sS -D - -o /dev/null https://wordpress.org/

2026年9月28日のHEAD要求では、「Strict-Transport-Security: max-age=3600」と「X-Frame-Options: SAMEORIGIN」が返りました。

現在の確認では上のGETコマンドを使い、通常のページ取得と同じ方法でヘッダーを比較します。

Windowsではcurl.exeを使い、/dev/nullをNULに置き換えます。

ツールの結果と同じです。

キャッシュ系のプラグインやCDNを使っている場合は、古いヘッダーが残って見えることがあります。

設定を変えたら、キャッシュを消してから確かめてください。

よくある質問

Q. 満点ならサイトは安全ですか?

安全とは言えません。

ヘッダーはセキュリティ対策の一部で、プラグインの脆弱性やパスワードの管理は別に対策が要ります。

Q. 設定したらサイトが表示されなくなりました

多くはCSPが原因です。

CSPの行を消すか、「Report-Only」に戻して表示を確かめてください。

.htaccessを編集して画面が真っ白になった場合は、貼った行を消して元に戻します。

Q. Nginxのサーバーでも.htaccessは使えますか?

Nginxだけで動くサーバーでは.htaccessは読まれません。

その場合は、サーバーの設定で指定するか、functions.phpの方法を使います。

まとめ

  • 今の設定はセキュリティヘッダー診断にURLを入れれば分かる
  • .htaccessの適用範囲と実際の応答を確認する
  • functions.phpに書くと、WordPressの公開ページにだけ付く
  • HSTSは常時SSL化が済んでから、短い期間で試す
  • CSPはReport-Onlyで様子を見てから本適用する

SSL証明書の有効期限もあわせて確かめるなら、SSL証明書チェックが使えます。

ほかの項目もまとめて点検するなら、「WordPressサイトを自分で点検する手順」で順番と使い分けを解説しています。

ツールの一覧はWEBツール箱にあります。

functions.phpの例はWordPressがPHPで生成する対象応答の設定です。CDNやページキャッシュが直接返す応答には処理が走らない場合があります。変更前後に実際のレスポンスヘッダーを比較し、埋め込み・フォーム・カメラなど必要な機能を確認します。すでにサーバー側に設定がある場合は重複や競合を避け、管理場所を決めてください。

ApacheとWordPressで確認した適用範囲

確認対象隔離環境での結果
PHP例を読み込んだ記事ページ200。nosniff・SAMEORIGIN・Referrer-Policy・Permissions-Policyを確認
画像などに相当する静的ファイル200。PHP例の4種類は追加されなかった
REST API・ログイン画面PHP例の4種類は一括追加されなかった。本体のヘッダーは別に存在する
Apache例を置いた範囲の静的ファイルnosniffあり。追加設定を戻すと付かなくなった

2026年10月3日、隔離したApache 2.4.69・PHP CGI 8.2.29・WordPress 7.1.2で、掲載のPHP例とApacheの複数行の設定例を実行しました。

WordPressがPHPで作る記事ページでは、PHP例の4種類のヘッダーを確認できました。

REST APIにはWordPress本体が別途nosniffを付けるため、それをPHP例の成果と取り違えないようにします。

ログイン画面も本体のヘッダーと追加コードのヘッダーを分けて確認してください。

この試験のCGIはScriptAliasでPHP実行ファイルへ処理を渡す構成です。

ルートの.htaccessに書いたヘッダーは静的ファイルに付きましたが、ログイン画面には届きませんでした。

Apacheであっても設置場所だけで全応答への適用を保証せず、設定を読み込む範囲と実際の応答を確認します。

これは今回のCGI構成の結果であり、他のホストのPHP実行方式へ一律に当てはめるものではありません。

ヘッダーの取得を確認した結果です。

ブラウザーでのCSP違反、フォーム・埋め込みの動作、HSTSの保存状態やPC・スマホの表示は別途確認が必要です。

  • URLをコピーしました!

制作・運用のご依頼はこちら

MOTOKI合同会社のサービス

WordPressの制作・カスタマイズ・高速化・SEO対策・保守まで、Webサイトに関する業務を一括で承ります。料金はサービスごとに公開しています。

WAZAの有料記事のサブスクリプションも開始しました。

目次