301 перенаправление вместо 404, когда URL-адрес является префиксом сообщения или имени страницы?


Привет всем! у меня странная проблема с маршрутизацией URL-адресов. когда я запрашиваю URL-адрес, которого не существует, напримерhttp://localhost/foo , wordpress правильно возвращает 404. однако, если этот URL-адрес является префиксом имени записи или страницы, вместо этого он возвращает 301 перенаправление на запись или страницу.

Например, если у меня есть сообщение от 10/1/2010 с именем Food Post, оно вернет 301 с местоположением: http://localhost/2010-10-01_food_post (моя структура постоянных ссылок). аналогично, если у меня есть страница с именем Food Page, она вернет 301 с местоположением: http://localhost/food_page.

Вы можете увидеть это в действии на моем живом сайте, http://snarfed.org /. например, http://snarfed.org/foo перенаправляет на http://snarfed.org/2009-10-30_food_highlights .

Отключение постоянных ссылок (т.Е. переключение на "по умолчанию") исправляет это как для сообщений, так и для страниц, но, естественно, я действительно не хочу этого делать.

Я вижу это на трех разных установки, все wordpress 3.0.1 и apache 2.2, два ubuntu lucid/mysql 5.1 и одна freebsd 7.3/mysql 5.0. я деактивировал все плагины и удалил все из своего.htaccess, кроме строк для wordpress ниже, дословно, но не повезло.

RewriteEngine On
RewriteBase /
RewriteRule ^wordpress/index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wordpress/index.php [L]

Заранее благодарю...

 8
Author: ryan, 2010-10-26

1 answers

Это нормально, это потому, что redirect_canonical(), который гарантирует, что вы всегда находитесь на "каноническом" URL-адресе (соответствующем вашей структуре постоянных ссылок), выполняет redirect_guess_404_permalink() чтобы лучше всего угадать сообщение , когда URL-адрес неполный. Если вы хотите предотвратить это, я думаю, что лучший способ - подключить redirect_canonical фильтр и вернуть false, если это 404. Что-то вроде этого:

add_filter('redirect_canonical', 'no_redirect_on_404');
function no_redirect_on_404($redirect_url)
{
    if (is_404()) {
        return false;
    }
    return $redirect_url;
}
 17
Author: Jan Fabry, 2010-10-26 19:30:19