Zur Navigation

Frage zur Weiterleitung in der htaccess [3]

21 Jörg Kruse

Ja, die Reihenfolge ist meist sehr wichtig. Wie schaut der Code denn momentan aus?

30.09.2020 15:43

22 WhiteWay

#1
RewriteCond %{HTTP_HOST} ^www\.domain\.de$   
RewriteCond %{REQUEST_URI} !\.jpg 
RewriteCond %{REQUEST_URI} !\.png 
RewriteCond %{REQUEST_FILENAME} !-d              
RewriteCond %{REQUEST_FILENAME} !-f  
RewriteCond %{REQUEST_URI} /buch/
RewriteRule ^/?buch/([^/]+)/([0-9]+)/?$ de/seiten/searchb.php?buch=$1&seite=$2 [L,QSA]
#2
RewriteRule ^buch/(.+)$ https://www.domain.de/buch/$1/1 [R=301,L]
#3
RewriteCond %{QUERY_STRING} buch=(.+)&seite=([0-9]+)
RewriteRule ^buch\.php$ https://www.domain.de/buch/%1/%2 [R=301,L]

Die Bedingung unter 2. habe ich etwas angepaßt, da der Link zur ersten Seite nicht &seite=1 enthielt, sondern ganz ohne den Seitenparameter im Index steht. War aber mein Fehler, weil ich das falsch geschildert hatte.

Der unter 3. funktioniert so nicht.

30.09.2020 16:45

23 Jörg Kruse

Wie sieht denn eine Beispiel-URL konkret aus, die von #3 nicht weitergeleitet wird?

Ergibt #2 nicht eine Endlosweiterleitung, wo mehrere /1 hinten an die URL angehangen werden?

Ansonsten würde ich Weiterleitungen (#2 und #3) immer vor den internen Rewrites (#1) platzieren.

Zur Reihenfolge allgemein siehe auch:

https://jkip.de/howtos/mod_rewrite-reihenfolge

Außerdem würde ich vor jedem Test von 301-Weiterleitungen den Browser-Cache leeren.

30.09.2020 19:31 | geändert: 30.09.2020 19:32

24 WhiteWay

Wie sieht denn eine Beispiel-URL konkret aus, die von #3 nicht weitergeleitet wird?

https://www.domain.de/de/seiten/buch.php?buch=bibel&seite=1

Ergibt #2 nicht eine Endlosweiterleitung, wo mehrere /1 hinten an die URL angehangen werden?

Nicht, wenn ich die Anweisungen in der Reihenfolge 1, 2, 3 in der htaccess stehen habe. Nachdem ich Deinem Vorschlag gefolgt bin, 2, 3, 1 zu machen, dann ja.

01.10.2020 06:42

25 Jörg Kruse

https://www.domain.de/de/seiten/buch.php?buch=bibel&seite=1

Da fehlt noch der vordere Teil des Pfades:

RewriteCond %{QUERY_STRING} buch=(.+)&seite=([0-9]+)
RewriteRule ^de/seiten/buch\.php$ https://www.domain.de/buch/%1/%2 [R=301,L]

Zur Endlosweiterleitung:

Hier würde ich das Muster so definieren, dass es keinen weiteren Slash (aus einer vorhergehenden Weiterleitung) enthält

RewriteRule ^buch/([^/]+)$ https://www.domain.de/buch/$1/1 [R=301,L]

01.10.2020 11:56 | geändert: 01.10.2020 11:56

26 WhiteWay

Jetzt habe ich das so:
#1
RewriteCond %{HTTP_HOST} ^www\.domain\.de$   
RewriteCond %{REQUEST_URI} !\.jpg 
RewriteCond %{REQUEST_URI} !\.png 
RewriteCond %{REQUEST_FILENAME} !-d              
RewriteCond %{REQUEST_FILENAME} !-f  
RewriteCond %{REQUEST_URI} /buch/
#2
RewriteRule ^buch/([^/]+)$ https://www.domain.de/buch/$1/1 [R=301,L]
#3
RewriteCond %{QUERY_STRING} buch=(.+)&seite=([0-9]+)
RewriteRule ^de/seiten/buch\.php$ https://www.domain.de/buch/%1/%2 [R=301,L]
#1 alt nach unten geschoben
RewriteRule ^/?buch/([^/]+)/([0-9]+)/?$ de/seiten/searchb.php?buch=$1&seite=$2 [L,QSA]

Jetzt habe ich beim direkten Aufruf der php-Datei eine Endlosweiterleitung und einen 404.

Die umgeleitete Version funktioniert aber.

Ich lasse das jetzt so, wie es vorher war, bis auf die Korrektur von #3. Ich habe ja den canonical drin stehen, da wird es schon nicht so schlimm sein, daß sich die php-Datei auch direkt aufrufen lässt, oder? Was meinst Du?

01.10.2020 15:14 | geändert: 01.10.2020 15:14

27 Jörg Kruse

Wieso hast du #1 auseinandergerissen? die RewriteConds beziehen sich als Teil eines Regelsatzes immer auf die nachfolgende RewriteRule und sollten von daher mit verschoben werden.

02.10.2020 10:37 | geändert: 02.10.2020 10:39

28 WhiteWay

Dann muss ich die selben RewriteConditions vor jeder RewriteRule einfügen? Sie sind ja für alle gleich.

02.10.2020 14:15

29 Jörg Kruse

Vor jeder RewriteRule? Für die RewriteRule unter #3 machen die RewriteConds unter #1 wenig Sinn, bzw. sind sogar kontraproduktiv.

03.10.2020 17:19

30 WhiteWay

Aktuell habe ich es jetzt so:
#2
RewriteRule ^buch/([^/]+)$ https://www.domain.de/buch/$1/1 [R=301,L]

#3
RewriteCond %{QUERY_STRING} buch=(.+)&seite=([0-9]+)
RewriteRule ^de/seiten/buch\.php$ https://www.domain.de/buch/%1/%2 [R=301,L]

#1
RewriteCond %{HTTP_HOST} ^www\.domain\.de$   
RewriteCond %{REQUEST_URI} !\.jpg 
RewriteCond %{REQUEST_URI} !\.png 
RewriteCond %{REQUEST_FILENAME} !-d              
RewriteCond %{REQUEST_FILENAME} !-f  
RewriteCond %{REQUEST_URI} /buch/
RewriteRule ^/?buch/([^/]+)/([0-9]+)/?$ de/seiten/searchb.php?buch=$1&seite=$2 [L,QSA]

Ergebnis: #1 und #2 funktionieren, aber #3 bringt eine endlose Weiterleitung. Die sieht dann so aus:
domain.de/buch/bibel&seite=1&buch=bibel&seite=1&buch=bibel&seite=1...

Dann habe ich #3 nochmal so abgeändert:

RewriteCond %{THE_REQUEST} \?buch=
hinzugefügt und bei der RewriteRule hintern dem %2 noch ein? angehängt.
RewriteRule ^de/seiten/buch\.php$ https://www.domain.de/buch/%1/%2? [R=301,L]

So scheint mir, funktioniert das jetzt auch. Ich teste noch ein wenig weiter..

04.10.2020 13:25 | geändert: 04.10.2020 14:24