記事がなかったときや引数つきのURIだったときに404を返す
Yahoo!さんやLive Searchさんが未だに引数付きのURIを上位に表示するので、「いい加減消してくれよ」と404を返すようにしました。
<?php if (!have_posts()) { status_header(404); } ?>
こう書くことで、!have_posts()
のとき(表示する記事がないとき)に404を返します。ただ、これだけだと今現在Yahoo!検索で2番目に表示される「www.hekt.org/?p=10」に対してはwww.hekt.org/archives/10が表示されてしまって404を返せないので、$_SERVER[REQUEST_URI]
(「http://www.hekt.org」よりあとの部分)が”/?”で始まっている場合にも404を返すように修正。
<?php if (!have_posts() || preg_match('/^\/\?/', $_SERVER[REQUEST_URI])) { status_header(404); } ?>
これでたぶん上手くいくはずですが、何かのサービスで「http://www.nanikano-service.com/?page=http://www.hekt.org/」みたいなかたちのURIになったときに不具合が出るかもしれませんね。404を返すだけなので大丈夫かもしれませんが。
今回HTTPヘッダの確認にFirefoxのアドオン「Live HTTP headers」を使ったのですが、これでログを見てみると、どうやら引数付きのURIにアクセスがあったときは正しいURIにリダイレクトされているんですね。賢い。(そのお陰でログに200が残って、上手く動いてないと勘違いして試行錯誤することになったけど……。)