RewriteBase
wird nur auf das Ziel einer relativen Umschreiberegel angewendet .
Verwenden Sie RewriteBase wie folgt ...
RewriteBase /folder/
RewriteRule a\.html b.html
ist im Wesentlichen das gleiche wie ...
RewriteRule a\.html /folder/b.html
Wenn sich die .htaccess-Datei jedoch befindet, zeigt /folder/
dies auch auf dasselbe Ziel:
RewriteRule a\.html b.html
Obwohl die Dokumente implizieren, dass immer a verwendet wird RewriteBase
, erkennt Apache es normalerweise korrekt für Pfade unter DocumentRoot, es sei denn:
Sie verwenden Alias
Direktiven
Sie verwenden .htaccess-Umschreiberegeln, um HTTP-Umleitungen (und nicht nur stilles Umschreiben) zu relativen URLs durchzuführen
In diesen Fällen müssen Sie möglicherweise die RewriteBase angeben.
Da es sich jedoch um eine verwirrende Direktive handelt, ist es im Allgemeinen besser, absolute (auch als "root relative" bezeichnete) URIs in Ihren Umschreibungszielen anzugeben. Andere Entwickler, die Ihre Regeln lesen, werden diese leichter verstehen.
Zitat aus Jon Lins ausgezeichneter ausführlicher Antwort hier :
In einer htaccess-Datei funktioniert mod_rewrite ähnlich wie ein <Directory>
oder <Location>
container. und das RewriteBase
wird verwendet, um eine relative Pfadbasis bereitzustellen.
Angenommen, Sie haben diese Ordnerstruktur:
DocumentRoot
|-- subdir1
`-- subdir2
`-- subsubdir
So können Sie zugreifen:
http://example.com/
(Wurzel)
http://example.com/subdir1
(subdir1)
http://example.com/subdir2
(subdir2)
http://example.com/subdir2/subsubdir
(subsubdir)
Der URI, der über a gesendet RewriteRule
wird, bezieht sich auf das Verzeichnis, das die htaccess-Datei enthält. Also, wenn Sie haben:
RewriteRule ^(.*)$ -
- Im root htaccess und die Anfrage ist
/a/b/c/d
, dann ist der erfasste URI ( $1
) a/b/c/d
.
- Wenn die Regel aktiviert ist
subdir2
und die Anforderung lautet, lautet /subdir2/e/f/g
der erfasste URI e/f/g
.
- Wenn sich die Regel in der
subsubdir
befindet und die Anforderung lautet /subdir2/subsubdir/x/y/z
, lautet der erfasste URI x/y/z
.
In dem Verzeichnis, in dem sich die Regel befindet, wird dieser Teil von der URI entfernt. Die Umschreibbasis hat keinen Einfluss darauf. So funktioniert das Verzeichnis einfach.
Was die Rewrite - Basis nicht tun, ist es, eine URL-Pfad Basis bereitstellen ( nicht eine Datei-Pfad - Basis) für alle relativen Pfade in der Ziel-Regel . Angenommen, Sie haben diese Regel:
RewriteRule ^foo$ bar.php [L]
Das bar.php
ist ein relativer Pfad im Gegensatz zu:
RewriteRule ^foo$ /bar.php [L]
wo das /bar.php
ein absoluter Weg ist. Der absolute Pfad ist immer der "Stamm" (in der obigen Verzeichnisstruktur). Dies bedeutet, dass unabhängig davon, ob sich die Regel im "root", "subdir1", "subsubdir" usw. befindet, der /bar.php
Pfad immer zugeordnet ist http://example.com/bar.php
.
Die andere Regel mit dem relativen Pfad basiert jedoch auf dem Verzeichnis, in dem sich die Regel befindet
RewriteRule ^foo$ bar.php [L]
ist in der "Wurzel" und du gehst zu http://example.com/foo
, du wirst bedient http://example.com/bar.php
. Wenn sich diese Regel jedoch im Verzeichnis "subdir1" befindet und Sie zu gehen http://example.com/subdir1/foo
, werden Sie bedient http://example.com/subdir1/bar.php
. usw. Dies funktioniert manchmal und manchmal nicht, wie in der Dokumentation angegeben, für relative Pfade erforderlich , aber die meiste Zeit scheint es zu funktionieren. Außer wenn Sie umleiten (mithilfe des R
Flags oder implizit, weil Sie http://host
das Ziel Ihrer Regel haben). Das heißt diese Regel:
RewriteRule ^foo$ bar.php [L,R]
Wenn es sich im Verzeichnis "subdir2" befindet und Sie zu gehen http://example.com/subdir2/foo
, verwechselt mod_rewrite den relativen Pfad als Dateipfad anstelle eines URL-Pfads. Aufgrund des R
Flags werden Sie am Ende auf Folgendes umgeleitet : http://example.com/var/www/localhost/htdocs/subdir1
. Welches ist offensichtlich nicht das, was Sie wollen.
Hier RewriteBase
kommt der Befehl ins Spiel. Die Direktive teilt mod_rewrite mit, was an den Anfang jedes relativen Pfads angehängt werden soll. Also wenn ich habe:
RewriteBase /blah/
RewriteRule ^foo$ bar.php [L]
in "subsubdir" http://example.com/subdir2/subsubdir/foo
wird mir das eigentlich dienen http://example.com/blah/bar.php
. Die "bar.php" wird am Ende der Basis hinzugefügt. In der Praxis ist dieses Beispiel normalerweise nicht das, was Sie wollen, da Sie nicht mehrere Basen im selben Verzeichniscontainer oder in derselben htaccess-Datei haben können.
In den meisten Fällen wird es folgendermaßen verwendet:
RewriteBase /subdir1/
RewriteRule ^foo$ bar.php [L]
wo sich diese Regeln im Verzeichnis "subdir1" befinden würden und
RewriteBase /subdir2/subsubdir/
RewriteRule ^foo$ bar.php [L]
wäre im "subsubdir" -Verzeichnis.
Auf diese Weise können Sie Ihre Regeln teilweise portabel machen, sodass Sie sie in einem beliebigen Verzeichnis ablegen können und nur die Basis anstelle einer Reihe von Regeln ändern müssen. Zum Beispiel, wenn Sie hatten:
RewriteEngine On
RewriteRule ^foo$ /subdir1/bar.php [L]
RewriteRule ^blah1$ /subdir1/blah.php?id=1 [L]
RewriteRule ^blah2$ /subdir1/blah2.php [L]
...
so dass zu gehen http://example.com/subdir1/foo
dienen http://example.com/subdir1/bar.php
etc. Und sagen Sie beschlossen, alle diese Dateien und Regeln zum „subsubdir“ Verzeichnis. Anstatt jede Instanz von /subdir1/
to zu ändern /subdir2/subsubdir/
, hätten Sie einfach eine Basis haben können:
RewriteEngine On
RewriteBase /subdir1/
RewriteRule ^foo$ bar.php [L]
RewriteRule ^blah1$ blah.php?id=1 [L]
RewriteRule ^blah2$ blah2.php [L]
...
Und wenn Sie diese Dateien und Regeln in ein anderes Verzeichnis verschieben mussten, ändern Sie einfach die Basis:
RewriteBase /subdir2/subsubdir/
und das ist es.