2 Stimmen

htaccess - Kann ich eine RewriteCond zu einer anderen RewriteCond hinzufügen?

OK, ich ziehe das zurück, denn es ist entweder einfach oder nicht möglich...

  • URL = www.example.com/foldername/
  • BENUTZER-IP = 203.0.113.111
  • ORDNER AUF DEM SERVER = /2030113111-foldername/

.htaccess

RewriteCond %{REMOTE_ADDR} ^([^.]+)\.([^.]+)\.([^.]+)\.([^.]+)?
RewriteCond ^%1%2%3%4-%{REQUEST_FILENAME} -d
RewriteRule ^. - [L,NC]

Dies würde die Anzeige von Ordnern schützen, es sei denn, die IP des Benutzers ist spezifisch für den angeforderten Ordnernamen und der IP-URI benannte Ordner existiert.

Ich brauche eine Lösung, die speziell HTACCESS verwendet.

1voto

anroesti Punkte 10431

Sie können mehrere RewriteCond s für nur einen RewriteRule . Schreiben Sie einfach die RewriteCond s unter einander, z.B.

RewriteCond foo bar
RewriteCond bar foo
RewriteRule .* example.org

Die RewriteRule wird nur ausgeführt, wenn foo == bar y bar == foo ist (niemals) wahr :)

0voto

MrWhite Punkte 33983

Ja, so etwas kann man machen, aber nicht ganz so, wie Sie es tun. Sie müssen nur die richtigen Servervariablen verwenden.

RewriteCond ^%1%2%3%4-%{REQUEST_FILENAME} -d

Das Problem bei dieser Richtlinie ist, dass REQUEST_FILENAME ist ein absoluter Dateisystempfad. Dies prüft also effektiv, ob ^2030113111-/home/user/public_html/foldername ein gültiges Verzeichnis ist - was fehlschlagen wird. Die TestString ist auch ein String ist kein regulärer Ausdruck, so dass die ^ Vorwahlen werden auch Dinge kaputt machen.

Stattdessen könnten Sie etwas tun wie:

RewriteCond %{REMOTE_ADDR} ^([^.]+)\.([^.]+)\.([^.]+)\.([^.]+)$
RewriteCond %{DOCUMENT_ROOT}/%1%2%3%4-$1 -d
RewriteRule (.+) - [L]

Wo $1 ist der URL-Pfad, der mit der RewriteRule Muster . Die RewriteRule Muster wird zuerst verarbeitet, bevor die RewriteCond Richtlinien, die ihr vorausgehen.

Um zu testen, welches Verzeichnis wir überprüfen, können Sie dies einer Umgebungsvariablen zuweisen und in Ihrem Skript überprüfen. Also, zum Testen:

RewriteCond %{REMOTE_ADDR} ^([^.]+)\.([^.]+)\.([^.]+)\.([^.]+)$
RewriteCond %{DOCUMENT_ROOT}/%1%2%3%4-$1 (.*)
RewriteRule (.+) - [E=DIRECTORY_CHECKING_FOR:%1,L]

Untersuchen Sie die DIRECTING_CHECKING_FOR Umgebungsvariable in Ihrem Skript sollte so etwas anzeigen wie: /home/user/public_html/2030113111-foldername abhängig von der Struktur Ihres Dateisystems.

Beachten Sie, dass %1 entspricht der zuletzt übereinstimmend Gruppe in einer vorhergehenden CondPattern (nicht unbedingt die unmittelbar darüber liegende, wenn es keine passenden Gruppen gibt). Also, die %1 im RewriteRule Substitution entspricht der (.*) (der gesamte "Verzeichnisname", der geprüft wird). Während %1 im RewriteCond TestString mit dem ersten Oktett der IP-Adresse übereinstimmt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X