Переписать мод — переписать все, кроме

#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]