Chuyển hướng 301 thay vì 404 khi URL là tiền tố của tên bài đăng hoặc trang?


8

này các bạn! tôi có một vấn đề kỳ lạ với định tuyến URL. Khi tôi yêu cầu một URL không tồn tại, ví dụ http: // localhost / foo , wordpress trả về chính xác 404. Tuy nhiên, nếu URL đó là tiền tố của một bài đăng hoặc tên trang, thay vào đó, nó sẽ trả về chuyển hướng 301 cho bài đăng hoặc trang.

ví dụ: nếu tôi có một bài đăng vào ngày 10/1/2010 có tên Food Post, nó sẽ trả về 301 với Địa điểm: http: // localhost / 2010-10-01_food_post (cấu trúc permalink của tôi). tương tự, nếu tôi có một trang có tên là Trang thực phẩm, nó sẽ trả về 301 với Địa điểm: http: // localhost / food_page .

bạn có thể thấy điều này trong hành động trên trang web trực tiếp của tôi, http://snarfed.org/ . ví dụ: http://snarfed.org/foo chuyển hướng đến http://snarfed.org/2009-10-30_food_highlight .

tắt permalinks (tức là chuyển sang "mặc định") sẽ sửa nó, cho cả bài viết và trang, nhưng tự nhiên tôi không thực sự muốn làm điều đó.

Tôi thấy điều này trên ba bản cài đặt khác nhau, tất cả wordpress 3.0.1 và apache 2.2, hai ubfox lucid / mysql 5.1 và một freebsd 7.3 / mysql 5.0. Tôi đã tắt tất cả các plugin và xóa mọi thứ khỏi .htaccess của tôi ngoại trừ các dòng cho wordpress bên dưới, nguyên văn, nhưng không có may mắn.

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

cảm ơn trước...

Câu trả lời:


17

Điều này là bình thường, đó là bởi vì redirect_canonical(), điều đó đảm bảo bạn luôn ở một URL "chính tắc" (tuân theo cấu trúc permalink của bạn), thực thi redirect_guess_404_permalink()để đưa ra dự đoán tốt nhất tại một bài đăng khi URL không đầy đủ . Nếu bạn muốn ngăn chặn điều này, tôi nghĩ rằng cách tốt nhất là để móc vào các redirect_canonicalbộ lọc , và trả về false nếu nó là một cái gì đó 404. như thế này:

add_filter('redirect_canonical', 'no_redirect_on_404');
function no_redirect_on_404($redirect_url)
{
    if (is_404()) {
        return false;
    }
    return $redirect_url;
}

Những gì tập tin này đi vào?
Ben Davis

@BenDavis: Bạn có thể đặt cái này trong functions.phpchủ đề của bạn, hoặc trong một plugin riêng. Nó phụ thuộc vào nơi bạn muốn gói chức năng này.
Jan Fabry
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.