Ich habe dies in einigen .htaccess
Beispielen gesehen
RewriteBase /
Die Funktionalität scheint der <base href="">
von HTML etwas ähnlich zu sein .
Ich glaube, es kann seinen Wert automatisch an den Anfang von RewriteRule
Aussagen stellen (möglicherweise solche ohne führenden Schrägstrich)?
Ich konnte es nicht richtig zum Laufen bringen. Ich denke, die Verwendung könnte für die Portabilität von Websites sehr nützlich sein, da ich häufig einen Entwicklungsserver habe, der sich von einem Produktionsserver unterscheidet. Bei meiner aktuellen Methode lösche ich Teile aus meinen RewriteRule
Anweisungen.
Kann mir jemand kurz erklären, wie man es umsetzt?
Vielen Dank
.htaccess
mod-rewrite
Alex
quelle
quelle
Antworten:
In meinen eigenen Worten, nachdem ich die Dokumente gelesen und experimentiert habe:
Sie können verwenden
RewriteBase
, um eine Basis für Ihre Umschreibungen bereitzustellen . Bedenken SieDies ist eine echte Regel, die ich verwendet habe, um sicherzustellen, dass URLs einen abschließenden Schrägstrich haben. Dies wird konvertieren
zu
Wenn Sie das
RewriteBase
dort haben, wird der relative Pfad vomRewriteBase
Parameter entfernt.quelle
$1
entspricht dem in Klammern gesetzten RewriteRule-Muster, aber der relative Pfad für die Substitution ergibt sich aus dem RewriteBase-Parameter. Die resultierende Substitution ist also/~new/$1/
.RewriteBase
Direktiven. Kurz gesagt, Sie können nicht mehr als eine haben - ich denke, die letzteRewriteBase
Direktive gewinnt und wirkt sich auf die gesamte .htaccess-Datei aus.RewriteBase
eine Basis für Ihre Neufassungen zu schaffen“ - die nur eine Umordnung der Worte ziemlich sind - aber ich habe keine Ahnung , was für eine „Basis“ ist in diesem Zusammenhang noch , wie die Bedeutung der Das von Ihnen angegebene Beispiel würde sich unterscheiden, wenn dieRewriteBase
Zeile entfernt würde. Auf zum Handbuch gehe ich ...RewriteBase
wird nur auf das Ziel einer relativen Umschreiberegel angewendet .Verwenden Sie RewriteBase wie folgt ...
ist im Wesentlichen das gleiche wie ...
Wenn sich die .htaccess-Datei jedoch befindet, zeigt
/folder/
dies auch auf dasselbe Ziel: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
DirektivenSie 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 dasRewriteBase
wird verwendet, um eine relative Pfadbasis bereitzustellen.Angenommen, Sie haben diese Ordnerstruktur:
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:/a/b/c/d
, dann ist der erfasste URI ($1
)a/b/c/d
.subdir2
und die Anforderung lautet, lautet/subdir2/e/f/g
der erfasste URIe/f/g
.subsubdir
befindet und die Anforderung lautet/subdir2/subsubdir/x/y/z
, lautet der erfasste URIx/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:
Das
bar.php
ist ein relativer Pfad im Gegensatz zu: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 isthttp://example.com/bar.php
.Die andere Regel mit dem relativen Pfad basiert jedoch auf dem Verzeichnis, in dem sich die Regel befindet
ist in der "Wurzel" und du gehst zu
http://example.com/foo
, du wirst bedienthttp://example.com/bar.php
. Wenn sich diese Regel jedoch im Verzeichnis "subdir1" befindet und Sie zu gehenhttp://example.com/subdir1/foo
, werden Sie bedienthttp://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 desR
Flags oder implizit, weil Siehttp://host
das Ziel Ihrer Regel haben). Das heißt diese Regel: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 desR
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:in "subsubdir"
http://example.com/subdir2/subsubdir/foo
wird mir das eigentlich dienenhttp://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:
wo sich diese Regeln im Verzeichnis "subdir1" befinden würden und
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:
so dass zu gehen
http://example.com/subdir1/foo
dienenhttp://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:Und wenn Sie diese Dateien und Regeln in ein anderes Verzeichnis verschieben mussten, ändern Sie einfach die Basis:
und das ist es.
quelle
RewriteEngine On
. Zum Beispiel keine Notwendigkeit für 1 und 1, aber für meinen dedizierten Server.AFAIK, RewriteBase wird nur verwendet, um Fälle zu beheben, in denen mod_rewrite in einer
.htaccess
Datei ausgeführt wird, die sich nicht im Stammverzeichnis einer Site befindet, und der falsche Webpfad (im Gegensatz zum Dateisystempfad) für den Ordner erraten wird, in dem er ausgeführt wird RewriteRule in einem .htaccess in einem Ordner, derhttp://example.com/myfolder
Ihnen zugeordnet ist, kann Folgendes verwenden:Wenn mod_rewrite nicht richtig funktioniert.
Der Versuch, damit etwas Ungewöhnliches zu erreichen, anstatt dieses Problem zu beheben, klingt nach einem Rezept, um sehr verwirrt zu werden.
quelle
RewriteBase ist nur in Situationen nützlich, in denen Sie einen .htaccess nur im Stammverzeichnis Ihrer Site platzieren können. Andernfalls ist es möglicherweise besser, Ihre verschiedenen .htaccess-Dateien in verschiedenen Verzeichnissen Ihrer Site abzulegen und die RewriteBase-Direktive vollständig wegzulassen.
In letzter Zeit habe ich komplexe Websites entfernt, da dadurch die Bereitstellung von Dateien vom Testen zum Leben nur noch einen Schritt komplizierter wird.
quelle
Wenn ich entwickle, befindet es sich in einer anderen Domäne innerhalb eines Ordners. Wenn ich eine Site live nehme, existiert dieser Ordner nicht mehr. Mit RewriteBase kann ich in beiden Umgebungen dieselbe .htaccess-Datei verwenden.
Wenn live:
Bei der Entwicklung:
quelle
%{REQUEST_URI}
in einerRewriteCond
Direktive verwendet haben?Die klarste Erklärung, die ich gefunden habe, war nicht in den aktuellen Apache-Dokumenten 2.4, sondern in Version 2.0 .
Wie funktioniert es? Für Sie Apache-Hacker enthält dieses 2.0-Dokument "detaillierte Informationen zu den internen Verarbeitungsschritten".
Lektion gelernt: Während wir mit "aktuell" vertraut sein müssen, finden sich Edelsteine in den Annalen.
quelle
Dieser Befehl kann die Basis-URL für Ihre Umschreibungen explizit festlegen. Wenn Sie im Stammverzeichnis Ihrer Domain beginnen möchten, fügen Sie vor Ihrer RewriteRule die folgende Zeile ein:
quelle
Ich glaube, dieser Auszug aus der Apache-Dokumentation ergänzt die vorherigen Antworten gut:
quelle