Исключить некоторые папки из RewriteRule

1

Я не очень хорошо разбираюсь в Apache mod_rewrite, и мне приходится переписывать все запросы, передавая их как параметр GET на страницу PHP (например, index.php?_REQUEST=$), которая будет проверять их и перенаправлять в нужное место в соответствии с настройкой написанный в файле INI.

Переписывание должно исключать некоторые каталоги (в которых прямой доступ):

  • admin/
  • api/
  • bin/cmd/ (но NOT bin)

Как я могу сделать это в.htaccess?

Можно ли передать запрос переменной окружения ($_ENV) вместо переменной GET?

  • 0
    «Это возможно ...» - это вопрос или утверждение? Что бы вы предпочли? Вы пробовали что-нибудь до сих пор? Вам на самом деле не нужно передавать запрос вообще. Предполагая, что вы внутренне переписываете в index.php запрос доступен для PHP в $_SERVER['REQUEST_URI'] .
  • 0
    @w3d w3d Я пытался с этим: RewriteEngine on RewriteCond %{REQUEST_URI} !^admin RewriteRule (.*) index.php?_REQUEST=$1 [L] Но не работает, он пропускает весь запрос, но фильтр не применяется в каталог (я пробовал только с одним только для попытки). В любом случае, извините за мой плохой английский, я имел в виду, можете ли вы передать запрос в env var, но да, я могу использовать REQUEST_URI.
Теги:
.htaccess
mod-rewrite

1 ответ

1
Лучший ответ

Попробуйте выполнить следующее в файле.htaccess в корневом каталоге документа:

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/index\.php
RewriteRule !^(admin|api|bin/cmd)/ /index.php [L]

Это внутренне перезаписывает /index.php когда запрос не начинается с /admin/, /api/ и т.д. И еще не является /index.php (чтобы предотвратить цикл перезаписи). Затем обратитесь к запросу через переменную PHP $_SERVER['REQUEST_URI'].

RewriteCond% {REQUEST_URI}! ^ Admin

Проблема с этой строкой (из вашего комментария) заключается в том, что %{REQUEST_URI} всегда начинается с косой черты, поэтому это никогда не будет соответствовать, поэтому следующий RewriteRule всегда переписывает запрос.

  • 0
    Я попробовал это сейчас, но это не работает, сначала я получил внутреннюю ошибку сервера, поэтому я изменил код: RewriteRule !^(admin|api|bin/cmd)/ index.php [L] но переписал все в index.php без фильтра каталогов
  • 0
    Добавлен RewriteCond для предотвращения цикла перезаписи!
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню