2009-09-16 2 views
0

Я использую apache mod_rewrite, чтобы сделать URL моего приложения довольно красивым. У меня есть основы mod_rewrite down pat - несколько частей моего приложения используют простые и предсказуемые перезаписывания.Работа с несколькими необязательными параметрами с помощью 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/, что кажется мне неправильным.

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

Edit: ответ должен был завершить ввод с помощью $, и изменить порядок правил, очень немного:

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

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

^blog/$ 

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

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

+0

Dav, ваш «конец ввода» часть была очень полезной. Я обновлю свой вопрос, чтобы отразить ответ. Благодаря! – EvilChookie

2

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

+0

Вы правы. Я изначально имел их в своих правилах, но вытаскивал их как часть набивки с ним. – EvilChookie

Смежные вопросы