Порядок выполнения RewriteRule

alexhemp

Новичок
Порядок выполнения RewriteRule

Имеется Apache 2.0.59

В существующий проект нужно добавить фичу

Роутинг запросов и поддержка ЧПУ сделана на mod_rewrite

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

/toyota/corolla/1993/index.html - т.е. все тойоты 1993 года.

Хочется это обработать в скрипте, ибо вариантов масса, хочется просто сопоставлять REQUEST_URI каталогу товаров.

Вот часть правил в .htaccess

Код:
RewriteEngine on

RewriteRule ^index\.html$				index.php?		       [L,NC,NS]
...
RewriteRule ^search\.html$				search.php?%{QUERY_STRING} [L,NC,NS]
RewriteRule ^search/page([0-9]+)\.html$	search.php?page=$1&%{QUERY_STRING} [L,NC,NS]

RewriteRule ^files/([0-9]+)\.([a-z]+)$	download.php?id=$1    [L,NC,NS]
RewriteRule ^([.a-zA-Z0-9_-]+)\.html$	pages.php?key=$1     [L,NC,NS]

Добавляю строку в конец списка правил:
RewriteRule ^ cat.php [L,NC,NS]

Итог - все запросы обрабатываются этим правилом, хотя у всех предыдущих стоят флаги L,NC,NS

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

-~{}~ 20.07.07 01:55:

Включил RewriteLog - то что там увидел, меня потрясло...

Апач плюет на флаг L и обрабатывает трансформированный адрес снова через всю цепочку... :-(

Как-бы от этого избавится...
 

MiksIr

miksir@home:~$
Он не плюет на L ибо этот флаг относится только к одному запросу, а после реврайта выполняется уже второй запрос (внутренний редирект).
Избавится очень просто - проверять, не cat.php ли собирается реврайтица.
 

alexhemp

Новичок
Да, это я понимаю, не пойму почему нет флага который запрещает обрабатывать INTERNAL REDIRECT

правда RewriteCond действует только на следующий за ним RewriteRule, вот это неудобно!

Задумался над сменой Web-сервера :)
 

MiksIr

miksir@home:~$
Я это тоже понять не могу. На самом деле флаг есть (NS), но он явно для других целей и внутренние редиректы от mod_rewrite не отлавливает.
Впрочем, варианта решения таких проблем два. Первый - реорганизация кода, в частности вынос самих php обработчиков из корневой директории, в которой работает реврайт.
Второй - использовать скриптовый RewriteMap, где можно сколь-угодно сложную логику реализовать на своем любимом языке.
 

alexhemp

Новичок
Вот скорее всего второй вариант и буду делать, возьму за основу router из CodeIgniter...
 
Сверху