webentwicklung-frage-antwort-db.com.de

301 Umleitungsprobleme im virtuellen Apache-Host

Ich habe eine Site mit aktiviertem SSL (Certbot) und habe daher meine 301-Weiterleitungen in der Datei /etc/Apache2/sites-available/example.com-le-ssl.conf eingerichtet. Ich habe es so gemacht, da der virtuelle Nicht-SSL-Host (: 80), soweit ich es verstehe, alles auf: 443 umleitet.

Einige der Weiterleitungen funktionieren, aber wenn das URL-Fragment dasselbe ist (außer, dass es in einen übergeordneten URL-Slug verschoben wurde), erhalte ich eine Weiterleitungsschleife. Außerdem werden Blog-Posts mit einem GET -Parameter überhaupt nicht erfasst.

Wie so:

# This works
Redirect 301 /foobar https://www.example.com/slug/foo-bar/

# This loops
Redirect 301 /foo-bar https://www.example.com/slug/foo-bar/

# This doesn't seem to redirect at all
Redirect 301 /article.cfm?blogid=9 https://www.example.com/blog/pretty-name/

Ich kann mir vorstellen, dass die Schleife beim ersten Mal richtig umleitet, dann aber auch /foo-bar am Ende der neuen URL sieht und eine andere Umleitung versucht. Am Ende habe ich eine URL in der Browserleiste, die wie folgt aussieht:

https://www.example.com/slug/foo-bar///////

Bis ich von Chrome eine Fehlermeldung über Umleitungsschleifen erhalte.

Also dachte ich, dass der führende / direkt nach Redirect 301 nur das URL-Fragment ab sofort nach der Basis des vollqualifizierten Domänennamens aufgenommen hat?

Und gibt es einen Grund, warum ein 301 mit einem GET -Parameter (z. B. /article.cfm?blogid=9) auch nicht funktioniert?

Ich habe herumgegoogelt, aber so viel von dem, was ich gefunden habe, dreht sich nur darum, von non-www nach www oder von non-ssl nach ssl zu wechseln. Ich finde auch die Dokumentation etwas stumpf.

BEARBEITEN: Diese Direktiven befinden sich direkt innerhalb des <VirtualHost> und nicht innerhalb eines <Directory> Blocks. In der Nicht-SSL-Konfiguration werden 3 verschiedene Domänen auf die neue, kanonische Domäne umgeleitet. Anstatt eine nicht-kanonische Domain auf https und dann auf die kanonische Domain umzuleiten, habe ich RewriteRule geändert, um alle auf die https-Version der kanonischen Domain umzuleiten. Ich habe auch die abschließenden Schrägstriche aus den 301-Umleitungszeilen in der ssl-Konfigurationsdatei entfernt.

1
armadadrive
# This loops
Redirect 301 /foo-bar https://www.example.com/slug/foo-bar/

Ich kann mir vorstellen, dass der Loop beim ersten Mal richtig umleitet, dann aber auch /foo-bar am Ende der neuen URL sieht und versucht, erneut umzuleiten.

Nein, alleine würde dies keine Schleife verursachen. Die mod_alias Redirect Direktive ist Präfix-Matching - es entspricht dem Start der URL , nicht das "Ende der URL".

Entweder...

  • Es wird eine zwischengespeicherte Umleitung angezeigt (da Sie mit 301 permanenten Umleitungen testen). Wenn Sie den Browser-Cache während des Tests nicht sorgfältig deaktivieren, sollten Sie mit 302 (temporären) Weiterleitungen testen, bis Sie bestätigt haben, dass er wie erwartet funktioniert.
  • Es besteht ein Konflikt mit anderen Richtlinien.
  • Sie haben den Webserver nicht neu gestartet, nachdem Sie diese Änderungen an der Serverkonfiguration vorgenommen haben.

Da Sie jedoch den abschließenden Schrägstrich im Quell-URL-Pfad weggelassen haben (dh /foo-bar), aber den abschließenden Schrägstrich in die Ziel-URL eingefügt haben, sollten Sie /foo-bar/ anfordern (mit einem abschließender Schrägstrich), dann würde dies zu einer Umleitung zu https://www.example.com/slug/foo-bar// führen (doppelter abschließender Schrägstrich), aber immer noch keine Schleife. Dies liegt daran, dass mit der Direktive Redirect alles nach der anfänglichen Übereinstimmung an das Ende der Ziel-URL angehängt wird.

Sie würden eine Umleitungsschleife wie die folgende sehen:

https://www.example.com/slug/foo-bar///////

Wenn Sie eine Direktive wie:

Redirect 301 /slug/foo-bar https://www.example.com/slug/foo-bar/

Und forderte /slug/foo-bar/ an (mit einem abschließenden Schrägstrich). Wenn Sie eine Eins-zu-Eins-Umleitung wünschen, müssen Sie RedirectMatch verwenden oder stattdessen mod_rewrite verwenden.

Also dachte ich, dass der führende / direkt nach Redirect 301 nur das URL-Fragment ab sofort nach der Basis des vollqualifizierten Domänennamens aufgenommen hat?

Ja, das ist richtig.

# This doesn't seem to redirect at all
Redirect 301 /article.cfm?blogid=9 https://www.example.com/blog/pretty-name/

Und gibt es einen Grund, warum eine 301 mit einem GET-Parameter (z. B. /article.cfm?blogid=9) auch nicht funktioniert?

Ja. Sie können die Abfragezeichenfolge nicht mit der Anweisung Redirect abgleichen. Die Direktive Redirect stimmt nur mit dem URL-Pfad überein, der die Abfragezeichenfolge ausschließt.

Wenn Sie mit der Abfragezeichenfolge übereinstimmen möchten, müssen Sie mod_rewrite verwenden und die Servervariable QUERY_STRING prüfen. Zum Beispiel:

RewriteEngine On
RewriteCond %{QUERY_STRING} ^blogid=9
RewriteRule ^/?article\.cfm https://www.example.com/blog/pretty-name/ [R,L]

"hübscher Name" - Sie müssen jedoch auf Umleitungsschleifen achten, da Sie vermutlich den "hübschen Namen" später in neu schreiben die Anfrage. (?) Ist dies der Fall, ist diese Weiterleitung nicht unbedingt erforderlich, es sei denn, diese URLs wurden bereits von externen Dritten indexiert oder verlinkt.

Beachten Sie auch, dass es ratsam ist, alle Ihre Mod_Alias-Weiterleitungen (Redirect und RedirectMatch) zu konvertieren, wenn Sie Mod_rewrite (RewriteRule) für einige Weiterleitungen/Umschreibungen verwenden Vermeiden Sie unerwartete Konflikte. Verschiedene Module werden zu unterschiedlichen Zeiten während der Anforderung ausgeführt, obwohl sie in der Konfigurationsdatei in der angegebenen Reihenfolge angegeben sind (mod_rewrite wird zuerst ausgeführt).

1
MrWhite