So erstellen Sie Umschreiberegeln relativ zur .htaccess-Datei

So erstellen Sie Umschreiberegeln relativ zur .htaccess-Datei

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 RewriteCondnicht mehr funktioniert. Gibt es eine Möglichkeit, dynamisch zu prüfen, ob der aufgerufene Pfad ein relativer Pfad zur .htaccessDatei ist?

Zum Beispiel:

Wenn ich eine Site habe, wo domain.com/prefix/ist das Verzeichnis der .htaccessDatei?

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 .htaccessDatei?

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 .htaccessDateien ändern können), versuchen Sie, die RewriteLogDirektive 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),RewriteBaseist für Sie.

Übrigens:Verwenden Sie keine Dinge wiedomain.com:-)

verwandte Informationen