WordPressに403を
WordPressはテーマに404.phpがあると、404エラーの時404ページを表示してくれる。
/index.php?error=404
上記にアクセスすると、404ページが表示されるわけだが…
?error=404ってどう見てもGETパラメータである。
ということは、だ。
403にしたら、403ページが表示できるようになるんじゃないか?
というわけで、403.phpを作ってやってみた。
/index.php?error=403にアクセスしてみた。
トップページが表示された。
次に.htaccessに下記を書き。
ErrorDocument 403 /index.php?error=403
/wp-adminへのアクセスを拒否させて403エラーを発生させてみた。
今度は404ページが表示された。
このときのGETパラメータを取得してみら、errorはなぜか空。
ソースを見ると、なるほど納得。しっかりunsetしてる。
別に空にする必要ないと思うんだけどなぁ。
1 2 | if (isset($_GET['error'])) unset($_GET['error']); |
ちなみに最初の、/index.php?error=403に直接アクセスした時と、ErrorDocument 403でリダイレクトした時の結果が違ったのは、実行中のファイル名とリクエストURIが違ったので、404ページに行ってしまったみたい。
※リダイレクトすると実行中のファイル名のみ変わる。
unsetを消してしまえばいいんだけど、WordPressがバージョンアップした場合元に戻ってしまうので、ソースを変更するのはよろしくない。
なので、プラグインっぽくテーマのfunctions.phpに下記を追加。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | /* error値を保持させる *******************************************************************************/ $error = null; add_action('init', get_http_error_code, 100); function get_http_error_code($arg) { global $error; if(!is_null($_GET['error'])) { $error = $_GET['error']; } } add_action('parse_request', set_http_error_code, 100); function set_http_error_code($query_vars) { global $error; $_GET['error'] = $error; } |
消える前に取得して、消えた後に戻す。
これで、error値が消えなくなった。
1 2 3 4 5 6 7 8 | <?php $error = $_GET["error"]; if($error == 403) { header("HTTP/1.0 403 Forbidden"); //ないと404が返る include (TEMPLATEPATH . '/403.php'); return; } ?> |
404.phpとindex.php(念のため)の「<?php get_header(); ?>」の前に上記を追加すれば403.phpが表示されるようになる。

205StudioTR