wordpressの403Forbiddenエラー

wordpressを運用しているかたで時々403Forbiddenが出力されてしまうという話を聞きます。この403Forbiddenは本来アクセス制限をかけた際に出力されるものなのですが、時として意図せず出力されることがあります。この記事では403をわざと返す方法と、意図せず出力されてしまった場合に解決する方法を記述していきたいと思います。

403Forbiddenエラーとは?

403Forbiddenはステータスコードの一種でウェブサーバからのレスポンスのことです。100番台から500番台まで知られています。代表的なのはページが存在しないという意味の404ですが、phpの誤記入などによってサーバ内部エラーを引き起こした500もよく見かけます。あと、恒久的な移動を意味する301や一時的な移動を意味する302などもよく知られています。

403の意味は簡単にいうと禁止で、アクセス権がない場合にサーバから返されるステータスコードです。具体的にはリクエストはしたけれども処理は不能という意味になります。

これらのステータスコードはwordpressに限らず、どんなサイトでも条件が整えば出力されます。

wordpressで403が意図せず返される

原因は色々考えらますが、大抵は「.htaccess」かファイルやディレクトリのパーミッション(アクセス権)となります。.htaccessは本来ウェブサーバのApacheの設定ファイルですが、最近ではnginx(エンジンエックス)と呼ばれるウェブサーバが導入されているレンタルサーバでも併用できるようになっています。

ファイルのパーミッションとはFTPなどで変更できる属性のことです。例えば700や755、644といった三桁からなる数値で指定できます。また、オーナー、グループ、その他のユーザに対し、それぞれ呼出、書込、実行という権限を与えるような表記になっていたり、rwxr-xr-xといった表記になっていることもあります。後者を数値に変えると755です。

他にWAFを導入して間もないレンタルサーバなどでも、wordpressの更新時に403エラーが返されることもあります。

.htaccessが原因

大抵はwordpressにアクセス制限などをかけていて、そのうえでプロバイダーから割り当てられるIPが変更されると同時に403が表示されます。アクセス制限を管理パネルから設定できるサーバ管理会社も多いため、この機能を気軽に使う人も多くなっているのではないでしょうか。

プロバイダーは基本的にIP枯渇問題から固定IPを割り当てているところはほぼないと思うのですが、モデムの電源が入ってる間は変更されないことが多いようです。ただ、一定期間モデムの電源を切っていたり、端末のmacアドレスから判断してIPが変更されてしまうこともあります。

その場合、IP制限をかけているwordpressへ該当の端末からアクセスするとサーバ側から403Forbiddenエラーが返されてしまいます。

解決方法は、htaccessファイル内の古いIPを変更された新しいIPへと置き換えます。

wordpressのパーミッションが原因

wordpressは基本的にファイルが644、ディレクトリが755となっているかと思います。通常のウェブサイトでも大抵この値になっていることがほとんどではないでしょうか。ただ、wordpressがインストールされているディレクトリにあるwp-config.phpに限っては400や600となっていると思うのですが、サーバの管理会社によって推奨する値が異なります。

上記の数値で動かない場合は、wordpressのファイルを640、ディレクトリを750と試しても良さそうですが、上の方法で解決しない時は多分他に原因がありそうです。

wordpressでWAFを使っているケース

WAFとはウェブ・アプリケーション・ファイアウォールの略称で、簡単にいうと不正な攻撃を防ぐための機能です。具体的には、クロスサイトスクリプティング、SQLインジェクション、ファイル不正アクセス、メールの不正送信、コマンド攻撃、PHP関数の脆弱性への攻撃などを防ぐアプリケーションのことです。

wordpressでWAFを使っていて、これが原因の場合は、WAFの機能をオフにすれば良いだけです。レンタルサーバなら管理画面から簡単に無効化できます。

wordpressのプラグインが原因?

多分、プラグインが原因になっていることはほとんど無いような気がします。というのは、wordpressのプラグインは有効化しないと動作しないためです。動作しなければコードを読込みませんし悪さもしません。

多くはワードプレスのプラグインを有効化した状態で403が表示されていると思いますで、ワードプレスのプラグインが原因であれば有効化した時点で気づいているというのが普通の物事の流れです。

ただ、ユーザの何らかのアクション、例えば何かをクリックした時に403を呼び出してしまうということも可能性としてはあります。プログラムのバグといえば500が定番ですが、そういうこともあり得るかも知れませんね。あとワードプレスとの相性とか。

ワードプレスのプラグイン同士で関数やクラス名が重複するなどしてバッティングすることもあるため、不具合となればすぐにプラグインが疑われるのでしょう。ただこういったバッティングによるエラーでは有効化さえもできませんのですぐに気づきます。

wordpressで403Forbiddenエラーを意図的に使う

ワープレと書きましたが、どんなサイトでもhtaccessが使えるのであれば利用できます。ワープレに限ったことではありませんが、利用するのであればhtaccessファイルへ以下のようなコードを追記します。xの部分に自分のIPアドレスを指定すると他のIPからアクセスしてきた端末へは403を返します。

order deny,allow
deny from all
allow from xxx.xxx.xxx.xxx

ちなみに以下のようにすると、ユーザエージェント名にTridentとbotという名称が入っていると、それらには403を返します。いわゆる部分一致による指定です。特定のロボットを拒否する場合に役立ちますが、以下のようにbotとだけ指定するとほとんどのロボットを拒否することになりますので、自分だけが閲覧するサイトでない限り、この部分は削除か変更して下さいね。

他にもユーザエージェント名の一部もしくは全部を追加したいのであれば、同じようにNC,ORでつなげて下さい。ORでつなげることによって複数指定できます。

また、R=403,LをR=404,LやG,Lなどと変更することで他のステータスコードも使えます。Gはgoneの略称で410のことです。永久に消滅したことを意味しますが、主要な検索エンジンでは404と同じように扱っているようです。

RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} Trident [NC,OR]
RewriteCond %{HTTP_USER_AGENT} bot [NC]
RewriteRule ^.*$ - [R=403,L]

まとめ

この記事では403を解消する方法とあえて出力させる方法の二つを記述しました。基本的には意図的にアクセス制限した時にサーバ側から返されるステータスコードです。何らかの理由でアクセスさせたくないサイト、或いはディレクトリやファイルがある際に役立つかも知れません。逆に出力されて困る際は上記の原因を疑ってみて下さい。