404.phpの一行目に以下を追加する。(get_header()より上)
<?php header("HTTP/1.1 404 Not Found"); ?>
<?php header("Status: 404 Not Found"); ?>
小粋空間: WordPress でステータスコード 404(Not Found)を返却するエラーページを作るで紹介されている方法も試してみたが、私の環境ではStausが200 OKのままで効果が全くなかった。(coreserver、PHPはCGIモード、WordPress2.5.1)
――ここからは悪戦苦闘の記録
さくらインターネットのサーバーで管理していたサイトのひとつをMTからWordPressに移行したら、503(一時的な過負荷)が出まくったり、何秒もページが表示されなかったりと散々だったのでcoreserver(コアサーバー)
に移転した。(私がプラン以上のことをしてしまっていることに問題があるだけで、基本的にさくらインターネットは好き。いろいろレンタルサーバを試してきたけれど、結局落ち着くところはさくらインターネットで、何個も契約している。ただ、MySQLを使うとなると…。)
しかし、coreserverでWordPressを稼動させようとすると細かいところでちょこちょこ問題が発生する。その問題のほとんどがPHPがセーフモードで動いていることに起因するわけで、私の場合はまず、WordPressをさくさく快適に動かすための強力なプラグインWP Super Cacheで問題が発生した。.htaccessに「AddHandler application/x-httpd-phpcgi .php」と書き込めばCGIで動くようになりセーフモードではなくなるのだが、全体をCGIで動かすのはためらわれたので、とりあえず該当しそうなPHPファイルを.htaccessでCGIとして動くようにしてみたが、やはりエラーが出てしまう。ということで、結局WordPressのあるディレクトリ全体のPHPをCGIで動かすことになった。
順調に動いていると思っていたのだけれど、久しぶりにGoogleウェブマスターツールをのぞいてみたら、次のようなメッセージが表示されエラーが出ていた。
404 (ファイルが見つかりません) エラー ページのヘッダーで 200 (成功しました) のステータスが返されました。
検索してみると、PHPがCGIで動いていることによってこのエラーが出ているらしい。非常に面倒な話だ。あちらが立てばこちらが立たず…。PHPをCGIで動かさなければ、きちんと404が返されることはすぐに気づいたのだけれど、そこからが長く、WP Super CacheをはずしてWP Cacheに変更したり、(見てもわからないけど)WordPressのソースコード眺めてみたり、(ラジバンダリ…)、「<?php header("HTTP/1.1 404 Not Found"); ?>」をいろんなところに入れてみたり、「AddHandler application/x-httpd-phpcgi .php」を入れてみたり、(ラジバンダリ…)丸一日かけて、冒頭に書いた方法を見つけた。まあ、すぐに気づいても良いようなものだが、二行目を入れるところがポイント。
<?php header("Status: 404 Not Found"); ?>
ちなみに、この問題はステータスコード200が出ていてもきちんと404ページへ移動するため、一見するときちんと404が返されているように見えるのが怖いところで、私は2週間ぐらいこの問題に気づかずにいた。しかも、運が悪いことにMTからWPに変更するときにトップページ以外のURLをすべて変更し、そのリダイレクト(301)を.htaccessに書いていたのだが、サーバ移転の際にリダイレクトを書き忘れ…、いくつかのページが404 Not Foundという形で検索エンジンにインデックスされることに…。(ページが存在しないので、404ページへ飛ぶのだが、Statusは200のためクローラーが404ページを持って帰る。)