Martin Stern: htaccess modrewrite -> Umleitungslimit überschritten!

Hi,

ich habe ein kleines Problem, und zwar habe ich mein Forum per Modrewrite umgeschrieben was soweit auch sehr gut funktioniert:

hier ist der Code der htaccess:
RewriteEngine On

Catch New + Rewrite

RewriteRule ^t([0-9]+)-?([0-9]+)?.htm$ showtopic.php?thread=$1&pagenum=$2 [QSA,L]

Catch old Urls

RewriteCond %{QUERY_STRING} ^thread=([0-9]+)&pagenum=([0-9]+)$
RewriteRule ^showtopic.php$ /t%1-%2.htm? [R=301,L]
RewriteCond %{QUERY_STRING} ^thread=([0-9]+)$
RewriteRule ^showtopic.php$ /t%1.htm? [R=301,L]

wenn jemand folgendes aufruft wird daraus:
www.domain.de/showtopic.php?threadid=389343 -> www.domain.de/t389343.htm

wenn allerdings jemand mehrseitige Themen aufruft (mit pagenum)
www.domain.de/showtopic.php?threadid=389343&pagenum=2
wird das ganze nicht umgeschrieben, sondern man bekommt die Meldung Umleitungslimit für diese URL überschritten. Die angeforderte Seite konnte nicht geladen werden.

da es beinahe alles funktioniert und ich irgendwie den Haaken nicht finde frage ich hier und hoffe das ein Experte den Fehler sieht!

freue mich über jeden Tipp!

Gruss
Martin

P.S. die Max Redirects hochsetzen funktioniert auch nicht bzw. führt zu Err 500

  1. Hallo!

    Catch New + Rewrite

    RewriteRule ^t([0-9]+)-?([0-9]+)?.htm$ showtopic.php?thread=$1&pagenum=$2 [QSA,L]

    Catch old Urls

    RewriteCond %{QUERY_STRING} ^thread=([0-9]+)&pagenum=([0-9]+)$
    RewriteRule ^showtopic.php$ /t%1-%2.htm? [R=301,L]
    RewriteCond %{QUERY_STRING} ^thread=([0-9]+)$
    RewriteRule ^showtopic.php$ /t%1.htm? [R=301,L]

    wenn allerdings jemand mehrseitige Themen aufruft (mit pagenum)
    www.domain.de/showtopic.php?threadid=389343&pagenum=2
    wird das ganze nicht umgeschrieben, sondern man bekommt die Meldung Umleitungslimit für diese URL überschritten.

    Schritt für Schritt:
    showtopic.php?threadid=1&pagenum=2 wird im ersten Schritt durch Regel 2 zu t1-2.htm umgeschrieben wird. Dann erfolgt wie gewünscht (Umleitung 301) ein erneuter Aufruf durch den Browser mit t1-2.htm, was wegen Regel 1 zu showtopic.php?threadid=1&pagenum=2 umgeschrieben wird. Bis hierhin alles wie erwartet.

    Dein Problem ist jetzt, dass der letzte Schritt (Regel 1) eine interne Umleitung zur Folge hat, das bedeutet, für showtopic.php?threadid=1&pagenum=2 wird quasi eine neue HTTP-Anfrage erzeugt, allerdings intern im Apache. Damit geht alles wieder von vorne los und showtopic.php?threadid=1&pagenum=2 wird wegen Regel 2 zu t1-2.htm umgeschrieben, was die Endlosschleife startet: Externe Umleitung, t1-2 zu showtopic, showtopic zu t1-2, externe Umleitung und so weiter.

    Bevor du fragst:

    • Die RewriteRule-Option L bezieht sich auf die Abarbeitung der aktuellen Instanz einer Anfrage.
    • Dass es mit showtopic.php?thread=1 funktioniert, liegt daran, dass diese URL erst in t1.htm (Regel 3) und dann in showtopic.php?thread=1&pagenum= umgeschrieben wird (Regel 1). Die Endlosschleife würde jetzt wieder durch Regel 2 ausgelöst werden, würdest du dort nicht verlangen, dass nach &pagenum= eine Zahl kommt. Da die Zahl aber fehlt, passt Regel 2 nicht, der Aufruf funktioniert.
      Probiere es aus, t1-2.htm funktioniert wiederum nicht, weil diese URL in showtopic mit Zahl hinter &pagenum= resultiert.

    Zur Abhilfe könntest du ganz einfach die Parameter von showtopic in Regel 1 vertauschen:

    RewriteRule ^t([0-9]+)-?([0-9]+)?.htm$ showtopic.php?pagenum=$2&thread=$1 [QSA,L]

    Diese URL passt nicht mehr auf Regel 2 und dem Skript ist es egal, in welcher Reihenfolge die Parameter kommen.

    P.S. die Max Redirects hochsetzen funktioniert auch nicht bzw. führt zu Err 500

    Natürlich nicht, ob du nun 200 oder 300 Mal deinen Kopf mit aller Gewalt gegen eine Betonwand donnerst, ist für den Schädelbruch nicht wirklich wichtig.

    Gruß, Moses