Aktuell habe ich eine .htaccess-Datei wie diese.
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_URI} ^/(always|rewrite|these|dirs)/ [NC]
RewriteRule ^(.*)$ router.php [L,QSA]
Es funktioniert, wenn sich die Site-Dateien im Dokumentstammverzeichnis des Webservers befinden (d. h. domain.com/abc.php
-> <DOCUMENT_ROOT>/abc.php
). Aber in unserem aktuellen Setup (das nicht geändert werden kann) ist dies nicht gewährleistet. Wir können manchmal beliebige Ordner zwischen dem Dokumentstammverzeichnis und dem Ordner der .htaccess-Datei haben (d. h. domain.com/something/abc.php
-> <DOCUMENT_ROOT>/something/abc.php
). Das einzige Problem dabei ist, dass das Zweite RewriteCond
nicht mehr funktioniert. Gibt es eine Möglichkeit, dynamisch zu prüfen, ob der aufgerufene Pfad ein relativer Pfad zur .htaccess
Datei ist?
Zum Beispiel:
Wenn ich eine Site habe, wo domain.com/prefix/
ist das Verzeichnis der .htaccess
Datei?
NOT FORCED TO REWRITE -> domain.com/prefix/index.php
FORCED TO REWRITE -> domain.com/prefix/rewrite/index.php
Wenn ich eine Site habe, wo domain.com/
ist das Verzeichnis der .htaccess
Datei?
NOT FORCED TO REWRITE -> domain.com/index.php
FORCED TO REWRITE -> domain.com/rewrite/index.php
Antwort1
Es gibt eine Lösung, aber sie ist nicht einfach.
Verwenden RewriteMap
.
Ich würde es folgendermaßen machen:
Ein ... kreierenUmschreibenMapDatei. Siehehier für weitere Informationen. Dies ist eine sehr einfache Textdatei mit: Erstens die falsche URLohne das '/', Dannein Raum(zumindest) und dann die richtige URL, so:
ok /folder1/
ok /folder2/
ok /folder3/
Dann der Code:
RewriteMap myfoldermap \
dbm:/web/htdocs/yourwebsite.com/rewriterules/myfoldermap.map
RewriteCond %{REQUEST_URI} ^/([^/]+)/(.*)
# Now in '%1' there's the name of the folder
# Don't touch the URL but...
# ...check if it exists in the map file
RewriteRule (.*) - [QSA,E=FOLDERMAP:${myfoldermap:%1|notfound}]
# if the environment is neither empty or not found...
RewriteCond %{E:FOLDERMAP} !^(notfound|)$
# this means we found something...
# => apply the RewriteRule
RewriteRule ^(.*)$ router.php [L,QSA]
Wenn es nicht funktioniert: Lesen Sie meine üblichen „zwei Hinweise“ und fügen Sie Ihrer Frage das Umschreibeprotokoll hinzu.
Zwei Hinweise:
Wenn Sie sich nicht in einer gehosteten Umgebung befinden (= wenn es Ihr eigener Server ist und Sie die virtuellen Hosts und nicht nur die .htaccess
Dateien ändern können), versuchen Sie, die RewriteLog
Direktive zu verwenden: Sie hilft Ihnen, solche Probleme aufzuspüren:
# Trace:
# (!) file gets big quickly, remove in prod environments:
RewriteLog "/web/logs/mywebsite.rewrite.log"
RewriteLogLevel 9
RewriteEngine On
Mein bevorzugtes Tool zum Prüfen von regulären Ausdrücken:
http://www.quanetic.com/Regex(vergessen Sie nicht, ereg(POSIX) statt preg(PCRE) zu wählen!)
Antwort2
TutZum Umschreiben gezwungenbedeutet, dass die Umschreibregel auch dann funktionieren soll, wenn die angeforderte Datei oder das angeforderte Verzeichnis vorhanden ist?
Wenn ja, versuchen Sie einfach, die Erstellung der Datei/des Verzeichnisses zu vermeiden.
Oder teilen Sie es in zwei Regeln auf:
RewriteRule ^/(immer|diese|Verzeichnisse|neu schreiben)/ router.php [L]
RewriteCond %{REQUEST_FILENAME} !-f
UmschreibenCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ router.php [L,QSA]
Antwort3
Wenn ich Sie richtig verstehe (insbesondere weiß ich nicht, was Sie meinen mitzum Umschreiben gezwungen),RewriteBase
ist für Sie.
Übrigens:Verwenden Sie keine Dinge wiedomain.com:-)