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'