Apache mod_rewrite: Wie geht man mit Schrägstrichen in URLs um?

Apache mod_rewrite: Wie geht man mit Schrägstrichen in URLs um?

Ich habe folgende URL-Struktur:

http://mysite.com/movies/index.php?id=123

Ich möchte index.php?id=123 loswerden und stattdessen die folgende URL verwenden:

http://mysite.com/movies/123

Ich habe die folgende .htaccess-Datei im Verzeichnis /var/www/mysitecom/movies erstellt:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^(.*)$ mysitecom/movies/index.php?id=$1 [L,QSA]

Und es funktioniert. Wenn ich beispielsweise angebe ...

http://mysite.com/movies/123

... Ich bekomme ...

http://mysite.com/movies/index.php?id=123

Die Probleme beginnen, wenn ich angebe ...

http://mysite.com/movies/123/

Mit diesem Schrägstrich wird die URL nicht richtig verarbeitet. Es sieht so aus, als hätte ich überhaupt keine ID angegeben und alle meine CSS-Stile werden nicht angewendet.

Ich habe versucht, mit regulären Ausdrücken in der Regel zu spielen, wie ...

RewriteRule ^([^/]+)[/]*$ mysitecom/movies/index.php?id=$1 [L,QSA]

...aber es hat nicht geholfen.

Meine Frage ist also, wie ich in meinem Fall mit Schrägstrichen umgehen soll. Soll ich meine Umschreibregel wählen oder muss ich etwas anderes tun? Ich muss sicherstellen, dasshttp://mysite.com/movies/123/behandelt genau die gleiche wiehttp://mysite.com/movies/123. Irgendwelche Gedanken?

Danke,

Aktualisieren:

BenutzerAbonnierenhat mir geholfen (unten).

Dsumsky, vielen Dank für Ihre Antwort. Ich habe beschlossen, in Form der Antwort zu kommentieren, um die Möglichkeit zu erhalten, den Text zu formatieren.

Zunächst habe ich es versäumt, die Protokollierung zu aktivieren. Mit diesen Zeichenfolgen in meiner .htaccess ...

RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 3

... ich habe folgenden Fehler:

Rewrite log not allowed here

Nun, ich habe diese Zeichenfolgen in /etc/apache2/apache2.conf eingefügt und Apache neu gestartet. Das rewrite.log wurde erstellt, wird aber auch beim erneuten Schreiben leer.

Zweitens funktionierte es ohne die folgenden Zeichenfolgen überhaupt nicht:

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f

Also habe ich sie hinzugefügt. Dann ist etwas mit %{HTTP_HOST} schiefgelaufen, also habe ich es ein wenig geändert, indem ich einen Pfad angegeben habe:

RewriteRule ^([^/]*)/?$ mysitecom/movies/index.php?id=$1 [L]

Es wurde besser. Mit beidenhttp://mysite.com/movies/123Undhttp://mysite.com/movies/123/Ich sehe, dass die ID angewendet wurde. Im ersten Fall ist alles vollkommen in Ordnung, aber im zweiten Fall werden CSS-Stile nicht angewendet, als wären sie überhaupt nicht angegeben. Ich verstehe nicht, warum das passiert. Für mich sieht es so aus, als würden Stile angewendet, BEVOR die Rewrite-Regel ausgeführt wird. Ich denke, das stimmt, weil ich Stile folgendermaßen verknüpfe:

Also, es sieht so aus, als ob es für /123 funktioniert. Ich meine, Apache kann ../library/main.css finden, aber für /123/ scheint es ein eingebettetes Verzeichnis zu sein und ../library/main.css funktioniert nicht.

Irgendwelche Ideen?

Update 2:

Ich habe es verstanden. Die endgültige .htaccess:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RedirectMatch ^(.+[\d+])/$ $1
RewriteRule ^([^/]*)$ mysitecom/movies/index.php?id=$1 [L]

Abonnieren, danke für deine Hilfe! Ich markiere deinen Beitrag als Antwort.

Antwort1

Ich habe einen Test-VirtualHost erstellt, der Ihren Anforderungen entspricht, und die folgende Umschreiberegel konfiguriert, die anscheinend das bewirkt, was Sie beabsichtigt haben:

RewriteEngine On
RewriteLog "/var/log/httpd/rewrite.log"
RewriteLogLevel 3

RewriteCond %{HTTP_HOST} mysite\.com [NC]
RewriteRule ^/movies/([^/]*)/?$ %{HTTP_HOST}/movies/index.php?id=$1 [L]

Die Regel gleicht den letzten Teil der URI ab, der eine Art Film-ID ist, und entfernt abschließende Schrägstriche, falls vorhanden.

Wenn Sie nicht sicher sind, was mit der Rewrite Engine passiert, aktivieren Sie die Protokollierung, wie ich es konfiguriert habe. Sie können dann jeden einzelnen Schritt überprüfen, den die Engine ausführt, und Ihre Regeln richtig testen.

Ich habe es mit den folgenden URLs getestet:

http://mysite.com/movies/123
http://mysite.com/movies/123/

Ich habe die entsprechenden Zeilen im Log gefunden:

init rewrite engine with requested uri /movies/123
applying pattern '^/movies/([^/]*)/?$' to uri '/movies/123'
rewrite '/movies/123' -> 'mysite.com/movies/index.php?id=123'

init rewrite engine with requested uri /movies/123/
applying pattern '^/movies/([^/]*)/?$' to uri '/movies/123/'
rewrite '/movies/123/' -> 'mysite.com/movies/index.php?id=123'

verwandte Informationen