Я не очень хорошо разбираюсь в Apache mod_rewrite, и мне приходится переписывать все запросы, передавая их как параметр GET на страницу PHP (например, index.php?_REQUEST=$
), которая будет проверять их и перенаправлять в нужное место в соответствии с настройкой написанный в файле INI.
Переписывание должно исключать некоторые каталоги (в которых прямой доступ):
admin/
api/
bin/cmd/
(но NOT bin
)Как я могу сделать это в.htaccess?
Можно ли передать запрос переменной окружения ($_ENV
) вместо переменной GET?
Попробуйте выполнить следующее в файле.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
всегда переписывает запрос.
RewriteRule !^(admin|api|bin/cmd)/ index.php [L]
но переписал все в index.php без фильтра каталогов
RewriteCond
для предотвращения цикла перезаписи!
index.php
запрос доступен для PHP в$_SERVER['REQUEST_URI']
.RewriteEngine on RewriteCond %{REQUEST_URI} !^admin RewriteRule (.*) index.php?_REQUEST=$1 [L]
Но не работает, он пропускает весь запрос, но фильтр не применяется в каталог (я пробовал только с одним только для попытки). В любом случае, извините за мой плохой английский, я имел в виду, можете ли вы передать запрос в env var, но да, я могу использовать REQUEST_URI.