blog.hekt.org

記事がなかったときや引数つきの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が残って、上手く動いてないと勘違いして試行錯誤することになったけど……。)