Set RewriteBase auf den aktuellen Ordner-Pfad dynamisch
Gibt es eine Möglichkeit, um RewriteBase auf den Pfad der aktuelle Ordner (der Ordner der die .htaccess-Datei befindet) relativ zu dem host root?
Ich habe ein CMS und wenn ich verschieben Sie Sie in das Verzeichnis, in mein host funktioniert es nicht, es sei denn, ich setze die RewriteBase auf den Pfad des Verzeichnis relativ zum root-host. Ich möchte mein CMS zu arbeiten, mit nur kopieren und einfügen, ohne dass änderungen am code in der htaccess.
Update:
Beispiel:
webroot
- sub_directory
- cms
- .htaccess
in diesem Fall sollte ich schreiben in die htaccess: RewriteBase /
und wenn ich den htaccess-innen sub_directory sollte ich ändern RewriteBase zu:
RewriteBase /sub_directory/
So, ich möchte so etwas wie
RewriteBase /%{current_folder}/
- Das ist relativ zum Document Root?
- Siehe update @Sumurai8
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist ein Weg, wie man greifen kann, die
RewriteBase
in eine Umgebungsvariable, die Sie dann verwenden können, in Ihren anderen rewrite-Regeln:Dann können Sie
%{ENV:BASE}
in Ihren Regeln zu bezeichnenRewriteBase
.Erklärung:
Diese Regel funktioniert durch den Vergleich der
REQUEST_URI
zu den URL-Pfad, dieRewriteRule
sieht, das ist dieREQUEST_URI
mit den führendenRewriteBase
abgestreift. Der Unterschied ist derRewriteBase
und in%{ENV:BASE}
.RewriteCond
, die LHS (test-string), können mit back-Referenz-Variablen z.B.$1
,$2
ODER%1
,%2
etc, aber RHS-Seite, d.h. die Bedingung string nicht verwenden diese$1
,$2
ODER%1
,%2
Variablen.\1
,\2
etc.RewriteCond
ersten erfassten Gruppe ist(.*?/)
. Es wird vertreten durch internen back-Referenz `\1.RewriteBase
dynamisch durch den Vergleich%{REQUEST_URI}
und$1
. Ein Beispiel%{REQUEST_URI}
wird/directory/foobar.php
und Beispiel$1
für gleiche Beispiel URI wirdfoobar.php
.^(.*?/)(.*)::\2$
ist, indem der Unterschied in 1. erfassten Gruppe%1
oder\1
. Für unser Beispiel wird es füllen%1
oder\1
mit dem Wert/directory/
die später verwendet wird, in der Einrichtung env-variable%{BASE}
d.h.E=BASE:%1
./
ersten.Akzeptiert die Lösung nicht für mich arbeiten, ich denke, aber das Tat: http://www.zeilenwechsel.de/it/articles/8/Using-mod_rewrite-in-.htaccess-files-without-knowing-the-RewriteBase.html
Lange Geschichte kurz:
Gebäude auf anubhava Antwort und Jon Lins, hier ist was ich kam mit für mich (nicht verwendet haben, diese in der Produktion noch getestet, die ausgiebig noch).
Lassen Sie uns dieses Beispiel-URL, wo .htaccess ist in current_folder:
http://localhost/path_to/current_folder/misc/subdir/file.xyz
Dateisystem:
/var/www/webroot/path_to/current_folder/.htaccess
Können Sie die details von dem, was geschieht, für die Sie sich mittels
LogLevel alert rewrite:trace6
in Ihremhttpd.conf
im apache, und dann suchen in Ihrererror.log
.Hier ein bisschen mehr Klarheit über die folgenden zwei Linien, die würde ich noch ein bisschen verwirrend.
First off, der Doppel-Doppelpunkt
::
ist kein Betreiber irgendeiner Art; es ist nur eine beliebige Trennzeichen. DieRewriteCond
erweitert TestString%{ENV:SUBPATH}::%{REQUEST_URI}
um die folgenden:misc/subdir/file.xyz::/path_to/current_folder/misc/subdir/file.xyz
Dann unsere CondPattern
^(.*)::(.*?)\1$
:^(.*)::
entsprichtmisc/subdir/file.xyz::
\1
ist die erste capture-Gruppemisc/subdir/file.xyz
(.*?)\1$
wird(.*?)misc/subdir/file.xyz$
(.*?)
entspricht die restlichen/path_to/current_folder/
Und unsere
RewriteRule
setztCWD
zu%2
, das ist die zweite capture-Gruppe CondPattern.