Wie deaktiviere ich 301 umleitende Beiträge (nicht kanonisch)?
2 Antworten
- Stimmen
-
- 2012-03-10
Dies scheintmit
redirect_guess_404_permalink()
zutun zu haben,derin Zeile 96 vonwp-includes/canonical.php
aufgerufen wird. Nur zum Testen habeich derersten Zeile der Funktionredirect_guess_404_permalink()
eineredirect_guess_404_permalink()
hinzugefügt,die dieses seltsame Verhalten zu stoppen schien. Ich stöbereein bisschen herum,aberbisjetzt seheich keine gute Möglichkeit,dies zubeheben,ohne diese WordPress-Kerndatei zubearbeiten (wasichpersönlich ablehne,da diesin einer Produktionsumgebung der Fallistmacht Kernaktualisierungen schwieriger und unfallanfällig). Ich wünschte,esgäbeeinen guten Filter-/Aktions-Hookfürredirect_guess_404_permalink
,um dieses Verhalten zu verknüpfen. Ich werdeein bisschen weiter stöbern und diese Antwort aktualisieren,wennicheine gute Lösungfinde.EDIT
Möglicherweise habeicheinen Fixgefunden,denich kurzgetestet undbearbeitet habe.
Bearbeiten (erneut) Es wurdeeine Logik hinzugefügt (die diein canonical.php ,um die Umleitung durchzuführen),umnachbestimmten Abfrageparametern zu suchen. Nicht sogutgetestet wie die letzte Bearbeitung,also lassmich wissen,wieesfunktioniert. Wennesnicht zu 100%funktioniert,solltees Sie zumindestin die richtige Richtungbringen (und canonical.php ).
add_action('template_redirect', 'remove_404_redirect', 1); function remove_404_redirect(){ if (is_404()){ $id = max(get_query_var('p'), get_query_var('page_id'), get_query_var('attachment_id')); $redirect_url = false; if ($id && $redirect_post = get_post($id)) { $post_type_obj = get_post_type_object($redirect_post->post_type); if ($post_type_obj->public) $redirect_url = get_permalink($redirect_post); } if (!$redirect_url) remove_filter('template_redirect', 'redirect_canonical'); } }
Diesfunktioniert,da die unerwünschten Weiterleitungennur auftreten,wenn die Seite anfänglicheine 404ist. Wir suchen alsonurnach 404 undentfernengegebenenfalls den Umleitungsfilter. YAY!
This appears to have to do with
redirect_guess_404_permalink()
called on line 96 ofwp-includes/canonical.php
. Just to test, I added areturn false;
to the first line of theredirect_guess_404_permalink()
function, and that seemed to stop this odd behavior. I'm poking around a bit, but so far I don't see a good way to fix this without editing that core WordPress file (which I am personally opposed to doing in a production environment, since it makes core updates more difficult and accident prone). I wish there was a good filter/action hook to use inredirect_guess_404_permalink
to shortcut this behavior. I'll keep poking a bit and update this answer if I find a good solution.EDIT
I may have found a fix, which I tested briefly and worked.
Edit (again) Added some logic (which replicates the checks done in canonical.php to perform the redirect) to check for certain query parameters. Not as well tested as the last edit, so let me know how it works. If not 100% working, it should at least get you in the right direction (and check canonical.php).
add_action('template_redirect', 'remove_404_redirect', 1); function remove_404_redirect(){ if (is_404()){ $id = max(get_query_var('p'), get_query_var('page_id'), get_query_var('attachment_id')); $redirect_url = false; if ($id && $redirect_post = get_post($id)) { $post_type_obj = get_post_type_object($redirect_post->post_type); if ($post_type_obj->public) $redirect_url = get_permalink($redirect_post); } if (!$redirect_url) remove_filter('template_redirect', 'redirect_canonical'); } }
This will work because the undesired redirects are only occurring if the page is initially a 404, so we just check for 404 and, if it is, remove the redirecting filter. YAY!
-
Genial!Danke,dass du dasgefunden hast -ich habeeine Weilegegraben,konntees abernichtfinden.Eineelegante Lösung klingt spektakulär.Awesome! Thanks for finding that - I dug for a while but wasn't able to find it. An elegant solution sounds spectacular.
- 0
- 2012-03-16
- Alex Cook
-
Hey @AlexCook,überprüfemeine Bearbeitung der Antwort.Ich denke,das solltefunktionieren,um dieses Problem zubeheben.Hey @AlexCook , check my edit of the answer. I think that should work to fix this issue.
- 0
- 2012-03-16
- William
-
Sieht aus wie die Verwendung dieser kaputten? P=xxx-Weiterleitung,wasmöglicherweiseein großes Problemist.Alsich diesen Hack hinzufügte,verhinderteer,dass diese Arten von Forwardsfunktionierten.Looks like using this broke ?p=xxx forwarding, which is potentially a big issue. When I added this hack, it prevented those types of forwards from working.
- 0
- 2012-03-20
- Alex Cook
-
@AlexCook Guter Fang,ich habemeine Antworterneut aktualisiert.Obwohlesnicht soelegantist,solltees dieses Problembeheben.Es repliziertgenauer die Überprüfungen,diein `canonical.php`in der`is_404 () `Prüfung um Zeile 83 durchgeführt wurden. Ich hoffe,dasbehebtesendgültig :)@AlexCook Good catch, I updated my answer again. While not as elegant, it should resolve this issue. It replicates more exactly the checks done in `canonical.php` in the `is_404()` check around line 83. Hope that fixes it for good :)
- 0
- 2012-03-21
- William
-
- 2014-03-25
Hieristeine einfachere Einstellung.Deaktivieren Sie die Umleitungnur,wenn keine der query_vars vorhandenist.Auf diese Weisebehalten wir die Funktionalitätbei,ohne dass die Logikbereitsbei redirect_canonical dupliziert werdenmuss.
add_filter('redirect_canonical', 'no_redirect_on_404', 10, 2); function no_redirect_on_404($redirect_url, $requested_url){ $id = max(get_query_var('p'), get_query_var('page_id'), get_query_var('attachment_id'), get_query_var('day'), get_query_var('monthnum'), get_query_var('year')); if (is_404() && !$id){ return false; } return $redirect_url; }
Here's a simpler take. Only turn off the redirecting if none of the query_vars are present. In this way we get to keep the functionality, without the need to duplicate the logic already at redirect_canonical.
add_filter('redirect_canonical', 'no_redirect_on_404', 10, 2); function no_redirect_on_404($redirect_url, $requested_url){ $id = max(get_query_var('p'), get_query_var('page_id'), get_query_var('attachment_id'), get_query_var('day'), get_query_var('monthnum'), get_query_var('year')); if (is_404() && !$id){ return false; } return $redirect_url; }
Ich habeein seltsames Verhaltenin WordPressfestgestellt,bei dembestimmte URL-Strukturenfür Beiträge automatisch umgeleitet werden.
Zum Beispiel habeicheinen Beitragseintragfür: mysite.com/999/about-us
Dann würden Sie denken,derfolgende Link würdeeinen 404erzeugen: mysite.com/567891/about-us-1
WordPress leitetjedoch automatisch zu/999/about-us
weiterGibteseine Möglichkeit,diesebestimmte Art der Weiterleitung zu deaktivieren?Es scheint,als würde WPnach dernächsten "Gefälltmir" -Schnecke suchen.Beachten Sie,dassich keine Einträgefür about-us-1in der Posts-Tabelle habe und keine Revisionen oderirgendetwas,das dazuführen würde,dass WP so weitergeleitet wird.
Ich habe diesen Ausschnittgefunden,der kanonische 301-Weiterleitungen deaktiviert:
Diesistjedochnicht die Lösung,da auf der Site unerwünschte URL-Strukturenerzeugt werden.