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が表示されるようになる。

コメント/トラックバック

この記事へのコメント/トラックバックはありません。

コメントする

(管理人にのみ公開されます)

上へ参ります。