PHP
WordPress

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

More than 3 years have passed since last update.


問題の概要

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を参照してください。かなり複雑なので、私も完全には把握できていません。