Wie ignoriere ich ein Verzeichnis in mod_rewrite?

74

Ich versuche, die Modrewrite-Regeln das Verzeichnis überspringen zu lassen vip. Ich habe eine Reihe von Dingen ausprobiert, wie Sie unten sehen können, aber ohne Erfolg.

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
#RewriteRule ^vip$ - [PT]
RewriteRule ^vip/.$ - [PT]
#RewriteCond %{REQUEST_URI} !/vip 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Wie kann ich modrewrite dazu bringen, das /vip/Verzeichnis vollständig zu ignorieren, sodass alle Anforderungen direkt an den Ordner übergeben werden?

Aktualisieren:

Als Punkte der Klarheit:

  • Es wird auf Dreamhost gehostet
  • Die Ordner befinden sich in einem WordPress-Verzeichnis
  • Der Ordner / vip / enthält ein Webdav .htaccess usw. (obwohl ich dies nicht für wichtig halte
user24557
quelle
Auf Apache 2.2 müssen Sie möglicherweise RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-fdiesen stackoverflow.com/a/12575089/516748
KCD

Antworten:

131

Versuchen Sie, dies vor andere Regeln zu stellen.

RewriteRule ^vip - [L,NC] 

Es wird mit jedem URI-Anfang übereinstimmen vip.

  • Die -Mittel tun nichts.
  • Das Lbedeutet, dass dies die letzte Regel sein sollte; ignoriere alles, was folgt.
  • Das NCbedeutet kein Fall (also wird auch "VIP" abgeglichen).

Beachten Sie, dass es mit jedem Anfang übereinstimmt vip. Der Ausdruck ^vip$würde vipaber nicht vip/oder übereinstimmen vip/index.html. Das $könnte dein Untergang gewesen sein. Wenn Sie es wirklich richtig machen wollen, möchten Sie vielleicht mitmachen, ^vip(/|$)damit Sie nicht übereinstimmenvip-page.html

Patrick McElhaney
quelle
Übrigens hatte ich vor ein paar Wochen das gleiche Problem, und das funktionierte für mich unter Apache / 2.2.8 (UNIX).
Patrick McElhaney
Warum nicht verwenden RewriteRule ^vip/? - [L,NC], um sich um das Problem des Schrägstrichs zu kümmern?
Brooke.
2
@Brandon Das entspricht im Wesentlichen ^vip. Es würde mit "vip" übereinstimmen, gefolgt von einem Schrägstrich (vielleicht) und einigen anderen Zeichen (vielleicht). Wir möchten "vip" genau ( ^vip$) oder eine beliebige Zeichenfolge, die mit "vip /" ( ^vip/) beginnt, zuordnen .
Patrick McElhaney
Der Grund, der nicht funktioniert, ist der gleiche wie der, warum die vorhandenen RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-dnicht funktionieren. Das betreffende Verzeichnis verfügt über einen speziellen .htaccess, der einen Fehler verursacht. Dasselbe gilt für ein kennwortgeschütztes Verzeichnis.
Brentonstrine
Das hat funktioniert. Ich habe es jedoch für meinen eigenen Gebrauch optimiert. Um sicherzustellen, dass jeder Ordner "/ vip /" funktioniert, verwenden Sie "RewriteRule \ / vip \ / - [L, NC]"
Kyle Bridenstine
14
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

Dies besagt, wenn es sich um eine vorhandene Datei oder ein Verzeichnis handelt, berühren Sie diese nicht. Sie sollten auf site.com/vip zugreifen können und es sollte keine Umschreiberegel stattfinden.

etw
quelle
Er hat recht, diese Regeln sollten ausreichen. Das Problem ist, dass das Verzeichnis passwortgeschützt ist. Siehe die anderen Antworten unten (einschließlich meiner), die dies näher erläutern.
Brentonstrine
10

Der Code, den Sie hinzufügen, und alle Antworten, die Rewrite-Regeln / -Bedingungen enthalten, sind nutzlos! Der Standard-WordPress-Code macht bereits alles, was Sie brauchen sollten:

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

In diesen Zeilen steht: "Wenn es sich NICHT um eine vorhandene Datei ( -f) oder ein vorhandenes Verzeichnis ( -d) handelt, geben Sie diese an WordPress weiter. Das Hinzufügen zusätzlicher Regeln, egal wie spezifisch oder gut sie sind, ist überflüssig - Sie sollten bereits von den WordPress-Regeln abgedeckt sein!"

Warum arbeiten sie nicht ???

Das .htaccessim vipVerzeichnis gibt einen Fehler aus. Das gleiche passiert, wenn Sie ein Verzeichnis mit einem Passwort schützen.

Hier ist die Lösung:

ErrorDocument 401 /err.txt
ErrorDocument 403 /err.txt

Fügen Sie diese Zeilen vor dem WordPress-Code ein und erstellen Sie dann /err.txt. Auf diese Weise wird es, wenn es auf Ihr WebDAV (oder kennwortgeschütztes Verzeichnis) stößt und fehlschlägt, in diese Datei verschoben und von der vorhandenen Standard-WordPress-Bedingung ( RewriteCond %{REQUEST_FILENAME} !-f) erfasst .

Brentonstrin
quelle
1
In Bezug auf meine Gegenstimme für diese Lösung. Ich hatte ein .htaccess-Passwort, das das Unterverzeichnis schützte, das an index.php, die err.txt-Datei, weitergeleitet wurde, und es mir ermöglichte, das Verzeichnis zu bearbeiten.
Fotis Paraskevopoulos
1
Ich hatte einen anderen Ordner unter einem WordPress-Verzeichnis, der eine separate PHP-App enthielt. Diese App hat einen Fehler ausgelöst, aber anstatt den Fehler zu erhalten, kam sie über WordPress zurück und gab mir eine 404. Diese Lösung löst dieses Problem und ich konnte den 500-Fehler sehen, der von der PHP-Anwendung ausgelöst wurde. Ich danke dir sehr!
Paul Zepernick
Dies ist eine perfekte Lösung für diejenigen, die Probleme mit htpasswd-geschützten Unterordnern haben. Vielen Dank!
Eugene Sue
9

Zusammenfassend ist die endgültige Lösung:

ErrorDocument 401 /misc/myerror.html
ErrorDocument 403 /misc/myerror.html

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

Ich habe mehr über die Ursache dieses Problems in meiner speziellen Situation gepostet, einschließlich Wordpress und WebDAV auf Dreamhost, von denen ich erwarte, dass viele andere auf meiner Website sind .

Cody A. Ray
quelle
8

Sie haben erwähnt, dass Sie bereits eine .htaccess-Datei in dem Verzeichnis haben, das Sie ignorieren möchten - Sie können verwenden

RewriteEngine off

In diesem .htaccess, um die Verwendung von mod_rewrite zu beenden (nicht sicher, ob Sie mod_rewrite in diesem Ordner verwenden, wenn dies der Fall ist, hilft dies nicht, da Sie es nicht deaktivieren können).

Jay
quelle
Würde nicht helfen, da der .htaccess im übergeordneten Verzeichnis, der Rewrite-Regeln enthält, lange vor Apache in / vip ausgewertet wird.
Marc B
2
Ich habe gerade diese Methode verwendet und es hat gut funktioniert. Und ich habe .htaccess im übergeordneten Verzeichnis, das rewriteengine aktiviert. Also denke ich, dass Apache unabhängig davon im untergeordneten Verzeichnis sucht.
Adam Culp
7

Versuchen Sie, diesen Teil Ihres Codes zu ersetzen:

RewriteRule ^ vip /.$ - [PT]

...mit den folgenden:

RewriteCond% {REQUEST_URI}! (VIP) [NC]

Das sollte Abhilfe schaffen.

ChongFury
quelle
Dies hat mir in einem Fall geholfen, in dem bereits eine allgemeine Regel vorhanden war (blockieren Sie alle versteckten Verzeichnisse, die mit. Beginnen), aber ich musste eine Ausnahme machen (zulassen, dass .sen bekannt für letsencrypt auf cron funktioniert).
Squarecandy
4
RewriteCond %{REQUEST_URI} !^pilot/ 

ist der Weg, das zu tun.

Gokul Muralidharan
quelle
3

Ich hatte das gleiche Problem mit WordPress und stellte fest, dass das Problem damit zusammenhängt, dass für 401- und 403-Fehler kein geeigneter Handler vorhanden ist.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

Diese Bedingungen sollen die URL vorhandener Ordner bereits nicht neu schreiben, erledigen jedoch nicht ihre Aufgabe für kennwortgeschützte Ordner. In meinem Fall wurde das Problem durch Hinzufügen der folgenden zwei Zeilen zu meinem Stammverzeichnis .htaccess behoben:

ErrorDocument 401 /misc/myerror.html
ErrorDocument 403 /misc/myerror.html

Natürlich müssen Sie die Datei /misc/myerror.html erstellen.

matdumsa
quelle
3

Das funktioniert ...

RewriteRule ^vip - [L,NC]

Aber stellen Sie sicher, dass es die erste Regel danach ist

RewriteEngine on

dh

ErrorDocument 404 /page-not-found.html

RewriteEngine on

RewriteRule ^vip - [L,NC]

AddType application/x-httpd-php .html .htm

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d 

etc
Klopfen
quelle
3

In meinem Fall war die Antwort von Brentonstrin (und ich sehe, Matdumsa hatte auch die gleiche Idee) die richtige ... Ich wollte ihre Antworten abstimmen, aber da ich hier neu bin, habe ich keinen "Ruf", also habe ich eine vollständige Antwort zu schreiben, um zu betonen, was meiner Meinung nach der wahre Schlüssel hier ist.

Einige dieser Antworten würden die Verwendung der WordPress-Datei index.php erfolgreich verhindern ... In vielen Fällen liegt der Grund dafür darin, dass es ein echtes Verzeichnis mit echten Seiten gibt, die Sie direkt anzeigen möchten, und das

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

Linien kümmern sich bereits darum, so dass die meisten dieser Lösungen in einem Fall wie meinem eine Ablenkung darstellen.

Der Schlüssel war Brentonstrines Erkenntnis, dass der Fehler ein sekundärer Effekt war, der durch den Passwortschutz in dem Verzeichnis verursacht wurde, das ich direkt anzeigen wollte. Durch das Einfügen der

ErrorDocument 401 /err.txt
ErrorDocument 403 /err.txt

Zeilen und Erstellen von Fehlerseiten (Ich habe tatsächlich err401.html und err403.html erstellt und informativere Fehlermeldungen erstellt) Ich habe die Generierung der 404-Antwort gestoppt, als keine Seite gefunden werden konnte, die für die 401-Authentifizierung angezeigt werden konnte, und dann funktionierte der Ordner wie erwartet ... zeigt einen Apache-Anmeldedialog, dann den Inhalt des Ordners oder bei einem Fehler meine Fehlerseite 401.

Carlaron
quelle
Sie könnten einen Kommentar hinterlassen, anstatt auch eine Antwort zu geben.
Brentonstrine
-1

Ich bin mir nicht sicher, ob ich Ihr Ziel verstehe, aber das Folgende könnte das tun, wonach Sie suchen?

RewriteRule ^/vip/(.*)$   /$1?%{QUERY_STRING} [L]

Dadurch wird eine URL wie http://www.example.com/vip/fred.html ohne / vip neu geschrieben.

Peter Howe
quelle