Использование нескольких правил перезаписи?

У меня есть простой файл .htaccess с содержимым ниже.

<IfModule mod_rewrite.c>
     RewriteEngine on

     RewriteCond %{REQUEST_FILENAME} !-f
     RewriteCond %{REQUEST_FILENAME} !-d

     RewriteRule ^(.*)$ index.php?s=$1 [L]
</IfModule>

Я хочу добавить это правило.

RewriteRule ^p$ index.php?p= 

Я пытался сделать это ниже, но это не работает. Похоже, оба правила выполняются. Я попробовал пару разных флагов и снова не повезло. Может кто-нибудь сказать мне, как заставить это работать, пожалуйста.

<IfModule mod_rewrite.c>
     RewriteEngine on

     RewriteCond %{REQUEST_FILENAME} !-f
     RewriteCond %{REQUEST_FILENAME} !-d

     RewriteRule ^p$ index.php?p= 
     RewriteRule ^(.*)$ index.php?s=$1 [L]
</IfModule>

person user1326244    schedule 28.08.2012    source источник


Ответы (2)


Во-первых, вы должны знать, что условия перезаписи влияют только на следующее правило перезаписи, и вы добавили свое новое правило между условиями перезаписи и правилом перезаписи, это означает, что теперь они будут влиять только на ваше новое правило, а не на старое (то, что у вас есть в ваш код заключается в том, что правила перезаписи выполняются только в том случае, если целевой URL-адрес не является файлом или каталогом), поэтому, если вы хотите, чтобы на ваше старое правило по-прежнему действовало условие перезаписи, вам нужно будет добавить новое правило перед перезаписью условия.

По вашей проблеме, я думаю, zessx ответил достаточно (это исправлено добавлением флага [L]).

В итоге у вас должно получиться что-то вроде этого:

<IfModule mod_rewrite.c>
     RewriteEngine on

     RewriteRule ^p$ index.php?p= [L]

     RewriteCond %{REQUEST_FILENAME} !-f
     RewriteCond %{REQUEST_FILENAME} !-d
     RewriteRule ^(.*)$ index.php?s=$1 [L]
</IfModule>
person Oussama Jilal    schedule 28.08.2012

Вы должны добавить флаг [L], чтобы прекратить чтение правил при совпадении:

<IfModule mod_rewrite.c>
     RewriteEngine on

     RewriteCond %{REQUEST_FILENAME} !-f
     RewriteCond %{REQUEST_FILENAME} !-d

     RewriteRule ^p$ index.php?p= [L]
     RewriteRule ^(.*)$ index.php?s=$1 [L]
</IfModule>

Напоминание о RewriteRule флагах:

  • Л = Последний. Остановите обработку RewriteRules, как только это совпадет. Заказ имеет значение!
  • С = цепь. Продолжить обработку следующего RewriteRule. Если это правило не соответствует, то следующее правило не будет выполняться. Подробнее об этом позже.
  • E = Установить переменную среды. Apache имеет различные переменные окружения, которые могут влиять на поведение веб-сервера.
  • F = Запрещено. Возвращает ошибку 403-Forbidden, если это правило соответствует.
  • Г = ушел. Возвращает ошибку 410-Gone, если это правило соответствует.
  • Н = обработчик. Принудительно обрабатывает запрос, как если бы он был указанного типа MIME.
  • N = Далее. Заставляет правило начать заново и выполнить повторное сопоставление. БУДЬ ОСТОРОЖЕН! Могут образоваться петли.
  • NC = нет дела. Позволяет [jpg] соответствовать как jpg, так и JPG.
  • NE = выхода нет. Предотвращает перезапись специальных символов (. ? # и т. д.) в их эквиваленты в шестнадцатеричном коде.
  • NS = Нет подзапросов. Если вы используете серверные включения, это предотвратит совпадения с включенными файлами.
  • П = Прокси. Принудительно обрабатывает правило mod_proxy. Прозрачно предоставляйте контент с других серверов, потому что ваш веб-сервер извлекает его и повторно обслуживает. Это опасный флаг, так как плохо написанный превратит ваш веб-сервер в открытый прокси, а это плохо.
  • PT = сквозной. Примите во внимание операторы псевдонимов при сопоставлении RewriteRule.
  • QSA = QSAдополнение. Если исходная строка содержит запрос (http://example.com/thing?asp=foo ) добавить исходную строку запроса к переписанной строке. Обычно это было бы отброшено. Важно для динамического контента.
  • R = перенаправить. Обеспечьте перенаправление HTTP на указанный URL-адрес. Также может предоставить точный код перенаправления [R=303]. Очень похоже на RedirectMatch, который быстрее и его следует использовать, когда это возможно.
  • С = Пропустить. Пропустите это правило.
  • Т = Тип. Укажите MIME-тип возвращаемого содержимого. Очень похоже на директиву AddType.

Выдержка из этого (очень) полного поста: https://serverfault.com/questions/214512/everything-you-ever-wanted-to-know-about-mod-rewrite-rules-but-were-fraid-to-as

person zessx    schedule 28.08.2012