htaccess - Могу ли я добавить RewriteCond к другому RewriteCond - PullRequest
2 голосов
/ 05 февраля 2011

ОК, я откажусь от этого, потому что это либо просто, либо невозможно ...

  • URL = www.example.com/foldername/
  • USER IP = 203.0.113.111
  • FOLDER ON SERVER = /2030113111-foldername/

.htaccess

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

Это защитит просмотр папки, если IP-адрес пользователя не является специфическим для запрошенного имени папки и IP-URIименованная папка существует.

Требуется решение, использующее HTACCESS специально.

Ответы [ 2 ]

1 голос
/ 05 февраля 2011

Вы можете использовать несколько RewriteCond с только для одного RewriteRule. Просто напишите RewriteCond под друг другом, например,

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

RewriteRule будет выполняться, только если foo == bar и bar == foo имеют значение true (никогда). :)

0 голосов
/ 14 февраля 2017

Да, вы можете сделать что-то подобное, но не совсем так, как вы это делаете.Вам просто нужно использовать правильные переменные сервера.

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

Проблема этой директивы заключается в том, что REQUEST_FILENAME - это абсолютный путь к файловой системе.Таким образом, это эффективно проверяет, является ли ^2030113111-/home/user/public_html/foldername допустимым каталогом - который потерпит неудачу.TestString также является строкой , а не регулярным выражением, поэтому префикс ^ также может сломать вещи.

Вместо этого вы можете сделать что-то вроде:

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

Где $1 - это URL-путь, соответствующий шаблону RewriteRule .Шаблон RewriteRule обрабатывается в первую очередь, перед директивами RewriteCond, которые предшествуют ему.

Чтобы проверить, какой каталог мы проверяем, вы можете присвоить его переменной средыи проверьте это в вашем сценарии.Итак, для тестирования:

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

Проверка переменной среды DIRECTING_CHECKING_FOR в вашем скрипте должна показать что-то вроде: /home/user/public_html/2030113111-foldername, в зависимости от структуры вашей файловой системы.

Обратите внимание, что %1совпадает с последней совпавшей группой в предшествующей CondPattern (не обязательно той, что непосредственно выше, если нет соответствующих групп).Итак, %1 в подстановке RewriteRule соответствует (.*) (полное «имя каталога», которое мы проверяем).Принимая во внимание, что %1 в RewriteCond TestString соответствует первому октету IP-адреса.

...