it-swarm.com.de

So leiten Sie zu einem hübschen Link zurück, ohne eine Endlosschleife in .htaccess zu erstellen

Ich schreibe gerade eine .htaccess -Datei um, um hübsche Links zu Original-URLs umzuleiten:

RewriteRule ^users/?$ /?status=users [NC,L,QSA]

was leitet meine SEO/hübschen Link:

example.com/users

zur realen URL

example.com/?status=users

Andererseits möchte ich jeden Suchmaschinen-Bot (oder irgendjemanden anderen), der versucht, an ihn heranzukommen

example.com/?status=users

301 auf den hübschen Link umgeleitet werden

example.com/users

Ich weiß, dass ich den späteren Teil mit erledigen könnte

RewriteCond %{QUERY_STRING} (^|&)status=users($|&)
RewriteRule ^$ /users? [L,R=301]

Aber ich kann diese beiden nicht zusammen verwenden, da es zu einer Endlosschleife kommt und der Browser anzeigt, dass Sie zu oft umgeleitet wurden.

Ich glaube ich verstehe was das Problem hier ist, aber was ist die Lösung? Wie erreiche ich beides?

2
nandu kk
RewriteCond %{QUERY_STRING} (^|&)status=users($|&)
RewriteRule ^$ /users? [L,R=301]

Sie benötigen lediglich eine zusätzliche Bedingung (dh RewriteCond-Direktive) in Ihrer externen Weiterleitung, die erkennt, ob es sich um eine direkte/anfängliche Anforderung des Benutzers handelt auf eine mgeschriebene Anfrage Ihrer anderen Rewrite Direktive.

Eine Möglichkeit, dies zu tun, besteht darin, den REDIRECT_STATUSmgebungsvariable zu überprüfen. Dies wird bei der ersten Anforderung nicht festgelegt, sondern nach dem ersten erfolgreichen Überschreiben auf "200" (wie in 200 OK) festgelegt. Sie können also überprüfen, ob REDIRECT_STATUS leer ist, um die direkte Anforderung zu erkennen und eine Umleitungsschleife zu verhindern.

Zum Beispiel:

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} (^|&)status=users($|&)
RewriteRule ^$ /users? [L,R=301]

Eine andere Möglichkeit besteht darin, nach THE_REQUESTServervariable zu suchen, das die erste Zeile der ersten Anforderung enthält und sich nicht ändert, wenn die URL umgeschrieben wird. Wenn Sie also example.com/?status=users direkt anfordern, würde THE_REQUEST eine Zeichenfolge der folgenden Form enthalten:

GET /?status=users HTTP/1.1

Dies würde Ihnen erlauben, nur eine Bedingung zu haben, im Gegensatz zu zwei wie oben, auf Kosten eines vielleicht komplexeren regulären Ausdrucks. (Die Implementierung wird dem Leser als Übung überlassen.)

2
MrWhite