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]
Заранее благодарю...
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;
}