- 2025.07.07
- 保守・セキュリティ
- GIVデザインチーム
WAFで403!?制作時に気をつけたい.htaccessとの関係
ホームページの制作していると「突然403エラーが出てページが表示されない!」というトラブルに直面することがあります。特に、WordPressなどのCMSを扱っているときに、サーバーのWAF(Web Application Firewall)と.htaccessの設定が干渉しているケースは少なくありません。
今回は、実際に遭遇した事例を交えながら、制作中に注意したいポイントと対処法をご紹介します。
1.403エラーとは?
403エラーは、アクセスが拒否されたときに返されるHTTPステータスコードです。例えば、URL自体が存在していても、アクセス権限がない場合やサーバー側の設定でブロックされた場合に表示されます。
「ページが見つからない」404エラーとは異なり、「ページはあるけど見せられない」という状態が403エラーです。
2.WAFとは?レンタルサーバーでも標準搭載のセキュリティ機能
WAF(Web Application Firewall)は、悪意のあるアクセスからWebアプリケーションを守るための仕組みです。最近ではロリポップ、さくらインターネット、Xサーバーなど、多くのレンタルサーバーに標準で搭載されています。
たとえば以下のような攻撃を防ぐ目的があります:
クロスサイトスクリプティング(XSS)
SQLインジェクション
悪意あるボットによるスキャン
便利な反面、制作や開発中に必要な通信までブロックしてしまうことがあるのです。
3.よくある403の原因3選
【.htaccessの記述ミスや競合】
WordPressでは標準で .htaccess にmod_rewriteルールが書かれていますが、これを他の設定で上書きしてしまうと挙動がおかしくなることがあります。特にWAFと競合するのが、
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
などの記述。WAFがこれを攻撃パターンと誤検知することがあります。
【特定のリクエストがWAFにブロックされる】
WAFはパスやパラメータに対しても厳しくチェックします。
‐ /wp-admin/へのアクセス
‐ フォーム送信時のPOSTリクエスト
‐ クエリパラメータ付きのURL
などが、WAFのルールに引っかかって403エラーになることがあります。
【外部スクリプトやJSの読み込み】
制作段階で入れるJavaScript(例:フォーム検証やトラッキング系)に対しても、WAFは厳しく反応することがあります。
たとえば、
document.write('<script src="外部ドメイン"></script>');
このような記述はクロスサイトスクリプティング(XSS)と誤検知される可能性があります。
4.解決策:403が出たらここをチェック
【WAFを一時的にOFFにする】
多くのレンタルサーバーでは、管理画面からドメイン単位でWAFを無効化できます。
ロリポップ:セキュリティ設定 → ドメインごとのWAFを「無効」に
さくら:コントロールパネル → WAF設定 → 無効化
※公開後は必ずWAFを再度ONに戻すのを忘れずに!
【.htaccessの構文を見直す】
下記はWordPressで推奨される最小構成の例です:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
必要以上に複雑なRewrite条件を入れないようにしましょう。
【サーバーログを確認する】
403エラーの原因を突き止めるには、アクセスログやエラーログの確認が有効です。
/var/log/httpd/error_log(サーバーにSSHで入れる場合)
※コントロールパネルにログ表示機能があることも
WAFによってブロックされたリクエストのUser-Agentやパラメータが分かれば、より適切に対応できます。
5.体験談:本番移行中に、403エラー。原因はWAFだった!
ホームページのリニューアル案件で、レンタルサーバのコンパネにアクセスできないということで、WordPressのプラグインを利用しながら、本番移行を実施していました。しかし、古いhtmlや削除しきれていない古いWordPressのphpが邪魔をして、正常にインポートが完了しないということがありました。
そこで、FTPだけ開放していただき、必要なPHPをアップロードし、表示確認をしようとしたら、突然403 Forbiddenエラーが発生し、サイトが真っ白になってしまったのです。最初は「アップロードしたファイルに問題があったのかな?」と疑いましたが、原因となりそうなコードもなく、色々と調べると、実は原因はWAFがFTP経由のファイル変更を「攻撃」と誤検知したことでした。
WAFはサーバー内部の書き換えや、特定ディレクトリの更新を監視しており、WordPressのコアファイルやPHPファイルに変化があった場合、アクセス制限をかけることがあります。
今回は以下の流れで対応しました:
・WAFが原因とわかったため、一時的にWAFをOFFにしてアクセスを回復(お客様へお願いしました)
・FTPでのアップロード後に動作確認し、問題がないことを確認したうえでWAFを再ON
つい、自分のコードが?.htaccessとか変にしちゃった?と焦りますが、冷静になると、「ああ、そうね。」と。焦ったときこそ冷静に、コードだけじゃなくて、環境も確認しましょう。(あと、コンパネのアクセス件はあった方が良いです)