.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]

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.


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.


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]

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 .


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.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.