wordpress-logo-stacked-rgb

Apacheが出力する 404 not found の画面が表示され、WordPressで用意してある 404.php の内容が表示されないときのTipsです。

 環境

Debian GNU/Linux 7.0 wheezy
kernel 3.2.0-4-amd64
apache2 2.2.22-13+deb7u7
WordPress 4.5.3-ja (BizVektor 1.8.22)

私が構築した環境ではリンク先が存在しないURLを指定すると、Apacheの標準エラー画面が表示される状態でした。

Not Found

The requested URL /xxx was not found on this server.
Apache Server at www.lonnie.co.jp Port 80

WordPressが動いている環境では、404.php が動くはずなのですが…

.htaccessが存在しなかったので、作成してみました。

# BEGIN WordPress
<IfModule mod_rewrite.c>;
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
ErrorDocument 404 /index.php?error=404

何も状況は変化しません。
ひょっとして mod_rewrite が動いていないのかも?と思い、

# a2enmod rewrite
Module rewrite already enabled

…という返事が返ってきます。

Apacheの設定に問題があるかもしれないので、/etc/apache2/sites-available/default の内容を確認します。

 <Directory /var/www/>
     Options Indexes FollowSymLinks MultiViews
     #AllowOverride None
     AllowOverride all
     Order allow,deny
     allow from all
 </Directory>

問題はなさそうです。
※ちゃんと none を all に変更してあります。

以上の検証から.htaccessを使って 404.php を動かすのは諦めました。

結局、/etc/apache2/conf.d/localized-error-pages を変更しました。

【変更前】
# Some examples:
#ErrorDocument 500 "The server made a boo boo."
#ErrorDocument 404 /missing.html
#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
#ErrorDocument 402 http://www.example.com/subscription_info.html

【変更後】
# Some examples:
#ErrorDocument 500 "The server made a boo boo."
ErrorDocument 404 /index.php?error=404
#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
#ErrorDocument 402 http://www.example.com/subscription_info.html

この変更後、# apache2ctl graceful でサービスの再起動をかけると無事 404.php が動き、WordPress からエラー画面が表示されるようになりました。

 【追記】2016/09/03

その後、いくつかのプラグインをインストールしたせいか、/var/www に .htaccess が出来上がっていて、なかを覗くと色々な設定が書かれています。
しかも、ErrorDocument 404 /index.php?error=404 の設定が入っていなくても、404.php が動作するようになりました。念の為、上記にある /etc/apache2/conf.d/localized-error-pages の変更を元通り(コメントアウト状態)にしても、404.php は普通に動作します。もちろん、これが正常なのですが… もしかすると8/16にWordPressのバージョンが4.6に上がったときに正常な状態に戻ったのかもしれません。