Работа с несколькими дополнительными параметрами с помощью mod_rewrite - PullRequest
0 голосов
/ 16 сентября 2009

Я использую Apache mod_rewrite, чтобы сделать URL моего приложения красивым. У меня есть базовые знания mod_rewrite - несколько частей моего приложения используют простые и предсказуемые изменения.

Однако я написал функцию блога, которая использует несколько различных параметров.

http://www.somedomain.com/blog/
http://www.somedomain.com/blog/tag/
http://www.somedomain.com/blog/page/2/

В моем .htaccess есть следующие правила:

RewriteRule ^blog/ index.php?action=blog [NC]
RewriteRule ^blog/(.*) index.php?action=blog&tag=$1 [NC]
RewriteRule ^blog/page/(.*) index.php?action=blog&page=$1 [NC]

Однако правила не работают вместе. Компьютер соответствует первому правилу, а затем останавливает обработку - хотя, по моему мнению, он не должен совпадать. Я говорю машине, чтобы она соответствовала ^blog/, и она идет вперед и совпадает с ^blog/tag/ и ^blog/page/2/, что мне кажется неправильным.

Что не так с моими правилами? Почему они не оцениваются так, как я собираюсь?

Редактировать: Ответ состоял в том, чтобы завершить ввод, используя $, и изменить порядок правил, очень немного:

RewriteRule ^blog/$ index.php?action=blog [NC,L]
RewriteRule ^blog/page/(.*)$ index.php?action=blog&page=$1 [NC,L]
RewriteRule ^blog/(.*)$ index.php?action=blog&tag=$1 [NC,L]

Эти правила дали желаемый эффект.

Ответы [ 2 ]

2 голосов
/ 16 сентября 2009

Я думаю, вам нужно добавить [L] после операторов [NC], иначе это будет продолжаться, даже если его уже сопоставили

2 голосов
/ 16 сентября 2009

Если вы не хотите, чтобы ^blog/ совпадало с чем-то большим, укажите также конец ввода в совпадении:

^blog/$

Однако многие приложения используют только одну страницу, на которую перенаправляются все URL-адреса, и затем обрабатывают остальную часть URL-адреса внутри кода страницы. Обычно большинство веб-языков имеют способ получить URI исходного запроса, который можно проанализировать, чтобы определить, какие «переменные» были указаны, хотя Apache указывает все они на одну и ту же страницу. Затем через includes или какой-либо другой фреймворк / шаблонизатор вы можете загрузить правильную логику.

Как еще одно замечание - обычно «более общие» правила перезаписи ставятся последними, поэтому сначала обрабатываются вещи, которые соответствуют более конкретному перенаправлению. Это, вместе с опцией [L] после правила, гарантирует, что если более конкретное правило соответствует, более общие из них не будут оцениваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...