mod_rewrite funktioniert nicht immer

Hallo

Ich möchte suchmaschinenfreundliche URLs erstellen. Für meine dynamische Seite benutze ich folgende Form: http://website.de/page?p=hallo
Und das möchte ich erzielen: http://website.de/hallo oder http://website.de/hallo/

Ich habe einiges schon mit mod_rewite in der .htaccess versucht und bekomme nur http://website.de/hallo.html hin. Das Löschen des (.html?) oder Ersetzen mit (.?) funktioniert einfach nicht.

RewriteEngine On
RewriteBase /
RewriteRule ^(.*)(.html?)$ /page.php?p=$1

Danke!

Hallo

Moin moin!

Ich habe einiges schon mit mod_rewite in der .htaccess
versucht und bekomme nur http://website.de/hallo.html hin. Das
Löschen des (.html?) oder Ersetzen mit (.?) funktioniert
einfach nicht.

RewriteEngine On
RewriteBase /
RewriteRule ^(.*)(.html?)$ /page.php?p=$1

Danke!

Also ich könnte mir vorstellen, dass der Fehler in der falschen Anordnung des „?“ liegt. Denn: Aktuell bezieht sich das „?“ (also „0 oder genau 1“) auf das „l“ von „.html“, nicht jedoch wie gewünscht auf alles. Dazu müsste das „?“ dann hinter die runde Klammer.
Außerdem glaube ich, dass da noch eine Angabe am Ende der Zeile fehlt:

RewriteRule ^(.*)(.html)?$ /page.php?p=$1 [L]

Dann sollte (!) es funktionieren (ungetestet). Alternativ mal kurz eine Rewrite-Rule von mir, die eigentlich das gleiche macht, was du da vorhast:

RewriteRule !(index.php)$ ./index.php?query=%{REQUEST_URI}&%{QUERY_STRING} [NC,L]

Allerdings etwas anders :wink:

LG
Lutz

Danke für deine Hilfe. Habe gerade in dem Moment die E-Mail wegen deiner Antwort bekommen, als ich meine Lösung hier posten wollte :smile:

Nach langem Ausprobieren hab ichs gefunden:

RewriteEngine On
RewriteBase /
RewriteRule ^([^/.]+)/?$ /page.php?p=$1

Ich wurde gerade darauf hingewiesen, dass diese Methode natürlich ALLE Dateianfragen an die index.php weiterleitet. Das kann man aber auch noch beeinflussen.

Folgende Anweisung VOR der RewriteRule deaktiviert die Rule für bestimmte Unterordner:

RewriteCond %{REQUEST_URI} !^(/ordner1|/ordner2|/ordnern) [NC]

Und folgende Anpassung der Rule selbst ignoriert bestimmte Dateien aus dem Root-Pfad (wo auch die index.php liegt):

RewriteRule !(index.php|.ico|sitemap.xml)$ ./index.php?query=%{REQUEST_URI}&%{QUERY_STRING} [NC,L]

In diesem Beispiel werden Aufrufe der Datei index.php, aller Dateien mit der Endung .ico und die sitemap.xml nicht umgewandelt. Das kann beliebig erweitert werden (durch Pipes getrennt: „|“).

Alternativ dazu wäre es noch möglich immer nur die URL umzuschreiben, wenn eine Anfrage gestellt wird, die weder einem gültigen Pfad noch einer gültigen Datei entspricht (also immer, wenn die angeforderte Datei oder der Ordner nicht vorhanden sind):

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f [NC]
RewriteCond %{REQUEST_FILENAME} !-l [NC]
RewriteRule .* ./index.php?query=%{REQUEST_URI}&%{QUERY_STRING} [NC,L]

MfG
Lutz

1 Like

Danke für die ausführliche Beschreibung - ist sehr hilfreich! Dafür (und auch für die schnelle Reaktion auf meinen Hinweis) gibt’s ein Sternchen!

Gruß

Robi