.htaccess mod_rewrite - So schließen Sie ein Verzeichnis von der Umschreiberegel aus

145

Ich habe 8 Zeilen mit Umschreiberegeln in meiner .htaccess-Datei. Ich muss zwei physische Verzeichnisse auf meinem Server von diesen Regeln ausschließen, damit auf sie zugegriffen werden kann. Im Moment werden alle Anfragen an die Datei index.php gesendet.

Auszuschließende Verzeichnisse: "admin" und "user".

Daher sollten http-Anfragen: http://www.domain.com/admin/ nicht an die Datei index.php übergeben werden.

ErrorDocument 404 /index.php?mod=error404

Options  FollowSymLinks
RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]

RewriteRule ^([^/] )/([^/] )\.html$ index.php?lang=$1&mod=$2 [L]
RewriteRule ^([^/] )/$ index.php?lang=$1&mod=home [L]
Kelvin
quelle
Ich denke, Sie haben die Quantifizierer nach [^/]einem einfachen Raum vergessen, wenn dort nicht erlaubt (es muss mit maskiert werden \<space>).
Gumbo
Echter Gumbo, guter Fang :). es sollte ^ ([^ /] +) sein.
Kelvin

Antworten:

287

Versuchen Sie diese Regel vor Ihren anderen Regeln:

RewriteRule ^(admin|user)($|/) - [L]

Dadurch wird der Umschreibvorgang beendet.

Gumbo
quelle
Hallo Gumbo, dein Code hat funktioniert, wenn der Benutzer domain.com/admin/ (mit einem Schrägstrich) eingegeben hat, aber nicht ohne. Wissen Sie, was geändert werden kann, damit beide Fälle funktionieren? Vielen Dank
Kelvin
@ Kelvin: Der Wechsel ($|/)sollte beide Fälle behandeln.
Gumbo
Ist es nicht besser, hier RewriteCond anstelle von RewriteRule zu verwenden?
Rineez
7
@rineez RewriteCondbenötigt immer ein RewriteRule, an das es angehängt ist. Und das Hinzufügen dieser Bedingung als negiert RewriteCondzu jeder RewriteRulekann ziemlich sperrig sein, eine einzelne RewriteRuleals Ausgang über denen, die in einem solchen Fall ignoriert werden sollten, ist eleganter.
Gumbo
3
@Ergec Es bedeutet "nichts ändern".
Gumbo
112

Sie können auch eine .htaccess-Datei mit enthalten

RewriteEngine Off

In den Ordnern, die Sie vom Umschreiben ausschließen möchten (gemäß den Regeln in einer .htaccess-Datei, die sich weiter oben im Baum befindet). Einfach aber effektiv.


quelle
18
+1 ~ .htaccess arbeitet hierarchisch, sodass lokale Ordner ihre Eltern überschreiben, genau wie eine normale Kaskade in CSS oder MVC.
Atari
4
Es gibt nur eine Sache, die Sie beachten sollten: Durch Aktivieren von .htaccess-Dateien (Einstellung AllowOverrideauf etwas anderes als Nonein der Apache-Konfiguration) wird Apache gezwungen, bei jeder Anforderung nach .htaccess zu suchen. Wenn Sie also eine stark frequentierte Website / einen Webserver haben, kann der Zugriff auf das Dateisystem / die Festplatte einen negativen Einfluss auf die Leistung haben ...
Bohrsty
Perfekter Rat für die Validierung der Erneuerung von SSL-Zertifikaten über die Dateimethode. Sie müssen keine Änderungen außerhalb der temporären Verzeichnisse oder in der vhost-Datei vornehmen. Sobald die Validierung abgeschlossen ist, können Sie einfach den gesamten Ordner löschen und fertig. Einfach toll.
Countzero
25

Fügen Sie eine Bedingung hinzu, um nach dem Administratorverzeichnis zu suchen.

RewriteCond %{REQUEST_URI} !^/?(admin|user)/
RewriteRule ^([^/] )/([^/] )\.html$ index.php?lang=$1&mod=$2 [L]

RewriteCond %{REQUEST_URI} !^/?(admin|user)/
RewriteRule ^([^/] )/$ index.php?lang=$1&mod=home [L]
rauben
quelle
Hallo Rob, ich habe diese Zeile direkt nach "RewriteBase /" gesetzt und erhalte jetzt "500 Error - Internal Server Error"
Kelvin
@ Kelvin Ich habe meine Antwort bearbeitet und die Bedingung vor jeder Regel hinzugefügt, auf die sie angewendet werden soll.
Rob
Dieser war der einzige, der mir tatsächlich geholfen hat. Die akzeptierte Antwort hat mir nicht geholfen.
Uwe Keim
5

Wenn Sie ein bestimmtes Verzeichnis aus der Regel entfernen möchten (dh, Sie möchten das Verzeichnis foo entfernen ), können Sie Folgendes verwenden:

RewriteEngine on

RewriteCond %{REQUEST_URI} !^/foo/$
RewriteRule !index\.php$ /index.php [L]

Die oben beschriebene rewriteRule schreibt alle Anfragen in /index.php um, mit Ausnahme der Anfragen nach / foo / .

Um alle vorhandenen Verzeichnisse auszuschließen, müssen Sie die folgende Bedingung über Ihrer Regel verwenden:

RewriteCond %{REQUEST_FILENAME} !-d

die folgende Regel

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !index\.php$ /index.php [L]

schreibt alles (außer Verzeichnisse ) in /index.php um .

Amit Verma
quelle
5

Wir haben die folgende mod_rewrite-Regel verwendet:

RewriteEngine on
RewriteCond %{REQUEST_URI} !^/test/
RewriteCond %{REQUEST_URI} !^/my-folder/
RewriteRule (.*) http://www.newdomain.com/$1 [R=301,L]

Dadurch wird (permanent mit einer 301-Weiterleitung) der gesamte Datenverkehr auf die Site an http://www.newdomain.com umgeleitet , mit Ausnahme von Anforderungen an Ressourcen in den Verzeichnissen / test und / my-folder. Wir übertragen den Benutzer auf die genaue Ressource, die er angefordert hat, indem wir die Erfassungsgruppe (. *) Verwenden und dann 1 US-Dollar in die neue URL aufnehmen. Achten Sie auf die Räume.

Camilo Tilaguy
quelle
4
RewriteEngine On

RewriteRule ^(wordpress)($|/) - [L]
user3578691
quelle