htaccess, mod_rewrite und RewriteRule's?

Yaslaw

alter Rempler
Moderator
Sind eigentlich normale Reguläre Ausdrücke....

Dieses .htaccess muss direkt unter http://zahnrad.de abgelegt sein
Code:
#Rewrite Engine einschalten
    RewriteEngine on
#nur Pfade umleiten die keine Datei sind    
    RewriteCond %{REQUEST_FILENAME} !-f
#nur Pfade umleiten die kein Ordner sind
    RewriteCond %{REQUEST_FILENAME} !-d

# alles an meine Datei weiterleiten. Von da kann man dan machen was man will...
# http://zahnrad.de/blabla -> http://zahnrad.de/Backend/main.php?section=blabla
    RewriteRule ^(.*)$ Backend/main.php?section=$1 [L,QSA]
 
  • Gefällt mir
Reaktionen: Joe

chickenwing

Mitglied
Hallo,

da wären vielleicht noch ein oder zwei Dinge zu erwähnen. Vorallem manch "Neulinge" in der Welt der .htaccess gehen in der Annahme, sie könnten damit ihre bestehende Linkstruktur nach außen ändern. Das ist natürlich nicht der Fall. Die muss schon im Quellcode selbst geändert werden. Die .htaccess biegt vielmehr entsprechend der RewriteRules die Requests um.
Nach "RewriteEngine On" sollte man am besten auch ein "RewriteBase /" angeben, auf die sich die folgenden Requests beziehen. Dadurch muss man sich um den Prefix (Domainnamen) nicht kümmern, der von der RewriteEngine verwaltet wird. Man kann zuhauf Probleme googeln, bei denen durch ein fehlendes RewriteBase RewriteRules nicht oder falsch abgearbeitet werden.
Je nach Serverkonfiguration kann auch ein "+OptionFollowSymLinks" notwendig sein; ich würd's erstmal ohne probieren.
Im Gegensatz zu entsprechenden PHP-Funktionen dürfen Reguläre Ausdrücke in der htaccess keine Delimiter (Begrenzungszeichen) angegeben werden. Das könnte zu falschen Ergebnissen führen.
RewriteCond ist als eine Art "If"-Abfrage zu verstehen, d.h. die nachfolgende RewriteRule kann an bestimmte Bedingungen geknüpft werden. Wer allerdings eine relativ einfache Seitenstruktur hat, kommt meist ohne aus.
Last but not least muss allerdings dafür der Server auch entsprechend eingerichtet sein, um überhaupt "rewriten" zu können. In Apache muss das mod_rewite-Modul eingebunden sein, in der httpd.conf muss "AllowOverrides None" (oft standardmäßig eingestellt) auf "AllowOverrides All" und das evtl. folgende "deny from all" muss in "Allow from all" geändert werden.

Alles in allem ist das Thema rund um die RewriteEngine von Apache relativ komplex. Wer dem Gedanken anhängt, dass Thema in 1-2 Stunden abgehandelt zu haben, wird enttäuscht werden. Unabdingbar ist, sich zuerst intensiv mit den regulären Ausdrücken zu beschäftigen (wer's bis dato noch nicht getan hat). Es gibt zwar unzählige Beispiele im Netz, aber in den seltensten Fällen findet man das, was man gerade für sich persönlich braucht.

Hier noch ein bisschen Lektüre:
http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritebase
http://www.workingwith.me.uk/articles/scripting/mod_rewrite
http://suchmaschinentricks.at/tipps-tricks/mod_rewrite.html
http://corz.org/serv/tricks/htaccess2.php?page=3
http://www.htaccess-guide.com/

Greetz
cw
 

Joe

Erfahrenes Mitglied
Erstmal vielen Dank euch beiden.

Nachdem ich gestern stundenlang probiert habe kann ich nur bestätigen was chickenwing sagt. Erstens damit wird man mal nicht eben im vorbeigehen fertig und 2.ens es ist einfacher Fehler zu provozieren als was vernünftiges hinzukriegen.

Aber anscheinend habe ich was grundsätzlich falsch verstanden glaube ich.
Mein Gedanke war folgender.
Ich habe eine lange und umständliche URL, diese wollte ich sozusagen Umschreiben in eine kürzere URL mit Hilfe von Mod_Rewrite. Die so umgeschriebene URL soll dann in der Adresszeile auch sichtbar sein anstatt der alten langen URL. Gleichzeitig soll doch nach wie vor auf die Seite weitergeleitet werden.

Also entweder ich verstehe was nicht richtig oder was ich will geht schlicht so nicht.
Schlichtes Bsp.:
HTML:
RewriteEngine On
Options +FollowSymlinks 
RewriteBase /

#Soll die Seite info.php in foo.php umbenennen
RewriteRule (.*)\info.php$ $1foo.php

#Sperrt den Zugriff auf den Ordner includes und leitet auf die index.php um
RewriteRule includes /index.php [R=301,L]

# Leitet bei Error 404 auf die Seite Index.php um
ErrorDocument 404 /index.php

# Schaltet das Indexverzeichniss nach aussen hin ab
Options -Indexes
Die Seite http://zahnrad.de/info.php soll umbenannt werden in http://zahnrad.de/foo.php.
Das wirft aber lediglich einen 404 Error.
Mein Hoster hat definitiv ModRewrite angeschalten.

Also ich hab schlicht NULL Plan warum das nicht geht wie ich gern hätte.
 

chickenwing

Mitglied
Hallo,

tja, dem Irrglauben, ich könnte mit mod_rewrite meinen Querystring umschreiben, bin ich auch mal verfallen :) als ich angefangen habe, mich damit zu beschäftigen. Wäre ja auch zu schön gewesen.
Aber wie sollte das gehen? Die RewriteEngine "biegt" ja die Requests von außen um und nicht Deine Antwort (hier u.a. Deine internen Links).
Du musst also erstmal Deine Linkstruktur ändern, wie sie nach außen hin zu sehen sein soll und dann kannst Du darauf basierend mittels htaccess auf die tatsächlichen Inhalte verweisen.
Vereinfacht gesagt, wenn Deine bisherigen Links so aussahen wie index.php?id=Ursula&hobby=stricken, dann musst Du Deinen Code erstmal so umstricken, dass Deine Links z.B. so aussehen: ursula-stricken.html . Wenn jetzt ein Besucher auf ursula-stricken.html klickt, dann kannst Du mittels htaccess daraus index.php?id=ursula&hobby=stricken machen. Nur so rum geht das...
Rewrite frickelt Dir also Deine "Aufrufe" um, nicht aber Deine Inhalte.

Wenn es nur darum geht, eine exakt bestimmte Datei umzuleiten, dann kannst Du auch
#Soll die Seite info.php in foo.php umbenennen
RewriteRule \/info.php$ /foo.php
schreiben.
Um den Prefix http://zahnrad.de musst Du Dich nicht kümmern, da Du das via Rewritebase der Rewriteengine überlässt. Lediglich um das "/" sollte man sich evtl. kümmern, damit sowohl http://zahnrad.de als auch http://zahnrad.de/ zum selben Ergebnis kommen (ich mach das jedenfalls immer so; sollte ich vllt. mal ausprobieren, ob's wirklich nötig ist). Allerdings muss im o.g. Beispiel auch die Datei foo.php im Gegensatz zu info.php vorhanden sein. Bei der Anordnung gilt immer:
RewriteRule Bedingung /Ergebnis, nicht andersherum


Greetz
cw
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Joe

Joe

Erfahrenes Mitglied
Also dem Irrglauben zu erliegen ist auch garnicht so schwer, wird ja auch in jedem Tut die Möglichkeit des ShortURL angepriessen. Immerhin ist jetzt etwas Licht ins Dunkel gekommen auch wenns mir immernoch nicht ganz klar ist wie das alles miteinander arbeitet.
Werd die Sache jetzt erstmal auf ne ganz lange Bank schieben :D Oder besser ganz Ad-Acta legen. Wäre ohnehin nur kosmetische Sache gewsesen und die Sicherheit wird auch nur geringfügig erhöht. Wobei es sicher noch etliche andre Dinge gibt um die Sicherheit zu erhöhen.

Nicht desto trotz Danke für die ausführlichen Antworten.
 

chickenwing

Mitglied
Na sagen wir mal so: es gibt einfach gigantische Möglichkeiten!
Abgesehen von "suchmaschinenfreundlichen"-URLs kannst Du so ziemlich jeden Zugriff von außen zulassen, blockieren, redirecten und was weiß ich noch alles.
Das mit den short-URLs stimmt ja auch, bloß musst Du die halt einpflegen und dann durch die RewriteEngine umpfriemeln lassen. Ich finde alleine schon die Möglichkeit cool, dem Besucher und den Sumas eine vermeintlich statische html-Seite zu präsentieren, die tatsächlich aber eine dynamische php-Seite ist. Das einzige, was mich bislang davon abgehalten hat, alle meine Seiten umzuschreiben, ist, dass ich mein lokalen Testserver (basierend auf einer Xampp-Installation unter XP) nicht dazu bringen kann, meine htaccess richtig abzuarbeiten. Wenn ich das (jemals) gelöst bekomme, hat für meine Seiten die Stunde Null geschlagen und keine ist mehr sicher vor mir :)

Greetz
cw