#apache #mod-rewrite
#apache #мод-переписать
Вопрос:
У меня есть эта строка кода:
RewriteRule ^(.*)/$ allcities.php?state=$1 [QSA,L]
Как я могу изменить это, чтобы оно не перезаписывало новый созданный мной каталог, такой как «admin». Поскольку в настоящее время это также переписывается.
Ответ №1:
Вы можете использовать RewriteCond
для этого:
RewriteCond %{REQUEST_URI} !^/admin
RewriteRule ^(.*)/$ allcities.php?state=$1 [QSA,L]
Обратите внимание на восклицательный знак перед регулярным выражением на RewriteCond
. Это заставляет регулярное выражение вернуть свое значение. Таким образом, в этом случае условие выполняется, если URI запроса не начинается с /admin
.
Пожалуйста, смотрите документацию mod_rewrite для получения дополнительной информации.
Комментарии:
1. Спасибо. Однако, что произойдет, если есть файл, который начинается с admin? Можете ли вы изменить его на /admin / без каких-либо проблем?
2. Да, вы можете использовать любые регулярные выражения, которые вам требуются, например,
^/admin/?$
которые будут соответствовать пути с необязательной косой чертой в конце.3. @HolgerJust Я думаю, вы имеете в виду
^/admin(/|$)
— правило в том виде, в каком вы его написали, не будет точно соответствовать только для /admin или /admin /.4. @fluffy что будет делать ваша версия?
5. Это то, что я имел в виду. Но да, это не обязательно то, чего на самом деле хотел Бретт 🙂 Но, как правило, я довольно плохо догадываюсь…
Ответ №2:
Правила перезаписи обрабатываются в порядке их получения. Вам нужно будет иметь обработчик, который будет перенаправлять в существующий каталог, прежде чем это правило будет обработано. Например:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ allcities.php?state=$1 [QSA,L]