301 Weiterleitung statt 404, wenn URL ein Präfix eines Beitrags- oder Seitennamens ist?

8

Hey alle zusammen! Ich habe ein seltsames Problem mit dem URL-Routing. Wenn ich eine URL anfordere, die nicht existiert, z. B. http: // localhost / foo , gibt WordPress korrekt eine 404 zurück. Wenn diese URL jedoch ein Präfix eines Beitrags oder Seitennamens ist, gibt sie stattdessen eine 301-Weiterleitung an den Beitrag zurück oder Seite.

Wenn ich beispielsweise am 01.10.2010 einen Beitrag mit dem Namen "Food Post" habe, wird ein 301 mit dem Speicherort " http: // localhost / 2010-10-01_food_post" (meine Permalink-Struktur) zurückgegeben. Wenn ich eine Seite mit dem Namen "Food Page" habe, wird eine 301 mit dem Speicherort "http: // localhost / food_page" zurückgegeben .

Sie können dies in Aktion auf meiner Live-Site http://snarfed.org/ sehen . Beispiel: http://snarfed.org/foo leitet zu http://snarfed.org/2009-10-30_food_highlights weiter .

Das Deaktivieren von Permalinks (dh das Umschalten auf "Standard") behebt das Problem sowohl für Beiträge als auch für Seiten, aber das möchte ich natürlich nicht wirklich.

Ich sehe dies auf drei verschiedenen Installationen, alle WordPress 3.0.1 und Apache 2.2, zwei Ubuntu Lucid / MySQL 5.1 und ein Freebsd 7.3 / MySQL 5.0. Ich habe alle Plugins deaktiviert und alles aus meinem .htaccess entfernt, außer den Zeilen für WordPress unten, wörtlich, aber kein Glück.

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

Danke im Voraus...

Ryan
quelle

Antworten:

17

Dies ist normal, da redirect_canonical()dies sicherstellt, dass Sie sich immer an einer "kanonischen" URL befinden (entsprechend Ihrer Permalink-Struktur), ausgeführt wird redirect_guess_404_permalink(), um einen Beitrag zu erraten, wenn die URL unvollständig ist . Wenn Sie dies verhindern möchten, ist es meiner Meinung nach am besten, sich in den redirect_canonicalFilter einzuhängen und false zurückzugeben, wenn es sich um einen 404 handelt.

add_filter('redirect_canonical', 'no_redirect_on_404');
function no_redirect_on_404($redirect_url)
{
    if (is_404()) {
        return false;
    }
    return $redirect_url;
}
Jan Fabry
quelle
In welche Datei geht das?
Ben Davis
@ BenDavis: Sie können dies in functions.phpIhr Thema oder in ein separates Plugin einfügen . Dies hängt davon ab, wo Sie diese Funktionalität bündeln möchten.
Jan Fabry