1. Qiita
  2. Items
  3. WordPress

WordPressのおせっかいな404自動リダイレクトを止める

  • 10
    Like
  • 0
    Comment

問題の概要

WordPressには、存在しないURLにアクセスされたとき、正しいURLを自動推測してリダイレクトするという、いささかおせっかいな機能が存在します。

たとえば、
http://example.com/about
という固定ページが存在するとき、

http://example.com/ab
という存在しないURLにアクセスすると、自動で http://example.com/about にリダイレクトされたりします。

この動作は、便利な場面もあるのかもしれませんが、しばしば厄介な問題を引き起こします。

URLの自動推測ロジックは、pathの最後の部分をslug (post_name)とみなして前方一致で検索しているだけなので、結果が安定しません。

上の例でいうなら、新たに ab で始まる投稿を追加したり、削除したり、非表示にしたり、投稿の親子関係を変更したりするだけで、予想もつかないリダイレクトが発生することがあります。

解決策

存在しないURLは、やはり素直に、404 Not Foundになるのが正しいでしょう。

WordPress.orgで、以下の解決策を見つけました。

Ability to disable redirect_guess_404_permalink()

functions.phpに次のコードを書けば、404からのリダイレクトを完全に止めることができます。

functions.php
//https://core.trac.wordpress.org/ticket/16557#comment:2 より

add_filter('redirect_canonical', 'remove_redirect_guess_404_permalink', 10, 2);

function remove_redirect_guess_404_permalink($redirect_url, $requested_url) {
  if(is_404()) {
    return false;
  }
  return $redirect_url;
}

参考

404からの自動リダイレクトには、slugの自動補完以外のパターンも存在します。実際の動作は、wp-includes/canonical.phpを参照してください。かなり複雑なので、私も完全には把握できていません。