it-swarm.com.de

RedirectMatch und Redirect stören sich gegenseitig

Ich habe die folgenden Zeilen in meinem .htaccess (es gibt andere Zeilen, aber diese beiden stehen nebeneinander)

RedirectMatch 301 ^/datingstories https://example.com/blog/category/relationships/datingstories/
RewriteRule ^([a-zA-Z0-9_-]+)$ showprofile.php?username=$1
  • Die Site enthält eine WordPress-Blog-Komponente (unter /blog) sowie eine Mitgliedschafts- und Profilseite, die außerhalb von WordPress erstellt wurde.
  • Die erste Zeile ist eine einfachere Möglichkeit, auf eine bestimmte Gruppe von Blogs in einer Unterkategorie zuzugreifen, d. H. https://example.com/datingstories wird in die Datierungsunterkategorie des Blogs übersetzt. Dies wird auch extern geteilt (weshalb ich die kürzere URL wollte)
  • In der zweiten Zeile wird Site-Name/Benutzername in sitename/showprofile.php?username=username übersetzt. Die Site enthält Mitgliedsprofilseiten, und die URL ist vereinfacht (d. H. https://example.com/frank leitet zu https://example.com/showprofile.php?username=frank weiter). Die URL im Browser zeigt jedoch https://example.com/frank

Das Problem tritt auf, wenn auf https://example.com/datingstories geklickt/verlinkt wird und die resultierende URL https://example.com/blog/category/relationships/datingstories/?username=dating lautet.

Gibt es eine Möglichkeit zu verhindern, dass der ?username=dating als Teil der resultierenden URL angezeigt wird, während die Seite noch geladen wird? Ich denke, die zweite .htaccess-Regel wird angewendet, aber ich bin mir nicht sicher, wie, da showprofile.php nicht in der resultierenden URL angezeigt wird.

Idealerweise wäre es auch großartig, wenn die resultierende Seite die kürzere URL und nicht die längere URL anzeigt.

Ich weiß Ihre Zeit zu schätzen, um danach zu suchen und darauf zu reagieren.

2
E.Hoh

RedirectMatch und Redirect stören sich gegenseitig

In dem von Ihnen angegebenen Beispiel stören sich RedirectMatch (mod_alias) und RewriteRule (mod_rewrite), nicht Redirect. Redirect ist eine mod_alias-Direktive, diemitRedirectMatch funktioniert - Sie würden also nicht unbedingt erwarten, dass diese auf diese Weise in Konflikt geraten.

Wie oben erwähnt, ist RewriteRule eine mod_rewrite-Direktive, während RedirectMatch (und Redirect) mod_alias-Direktiven sind. Verschiedene Apache-Module werden unabhängig von der Reihenfolge in Ihrer .htaccess-Datei unabhängig voneinander und zu unterschiedlichen Zeiten während der Anforderung ausgeführt. Im Fall von mod_alias und mod_rewrite führt mod_rewrite immerfirstaus.

In Ihrem Beispiel wird also die RewriteRule (2. Direktive)vorder RedirectMatch Direktive verarbeitet, die ihr vorangeht - da beide mit der URL /datingstories übereinstimmen. Die Verarbeitung wird dann durch die Datei fortgesetzt und der gesamte Prozess beginnt für einen zweiten Durchgang von vorne, wenn der erste mod_alias RedirectMatchredirectsdie URL (RedirectMatch stimmt mit der URL in der Anfrage überein, nicht mit der umgeschriebenen URL. Also entspricht dies wieder /datingstories, nicht showprofile.php (die umgeschriebene URL). Dies ersetzt den umgeschriebenen URL-Pfad (showprofile.php), behält aber die Abfragezeichenfolge (?username=dating) bei. (Aus den von Ihnen veröffentlichten Anweisungen geht jedoch nicht hervor, warum datingstories im URL-Parameter in dating abgeschnitten wird - möglicherweise liegt ein Konflikt mit anderen Anweisungen vor.) Die frühererewritewird in eine konvertiertexternal redirectnachdem der 301 HTTP Status angewendet wurde.

Die Lehre hier ist, dass Sie niemalsredirects/rewritesaus beiden Modulen mischen sollten, um verwirrende Konflikte wie diese zu vermeiden. Da WordPress mod_rewrite für seinen Front-Controller verwendet, würden Sie im Idealfall durchgehend mod_rewrite verwenden. Sie sollten also alle mod_alias RedirectMatch- (und Redirect-) Anweisungen konvertieren, um stattdessen mod_rewrite RewriteRule zu verwenden.

Zum Beispiel:

RewriteRule ^datingstories /blog/category/relationships/datingstories/ [R=301,L]
RewriteRule ^([a-zA-Z0-9_-]+)$ showprofile.php?username=$1 [L]

Und vernachlässigen Sie nicht das Flag L, um die weitere Verarbeitung (aktueller Durchlauf durch die Datei) bei Bedarf zu stoppen.

0
MrWhite