mod_Rewrite - наверное всех задолбал)
Всем привет, передо мной встала одна задачка и я пытался её решить так:
Код:
RewriteEngine on Помогите найти ошибку или возможно другое решение. |
м.б. тормознуть поиск, если есть совпадение в той строке?
Цитата:
|
Нет не получится.
Я понял почему всеравно выполняется index.php, но не допру как решить, как я понимаю нада улучшить регулярку для второго выражения и исключить первое, но в таком случаи при прямом запросе на css.php он будет его выполнять:( Просто правила обходятся три раза, в первый ставиться css.php далее апач снова запускает его и уже меняет на index.php, далее проходит ещё раз, но уже ничего не меняет и останавливается. |
теперь можно вздохнуть спокойно:)
Я решил свою проблему, остановив цикл с помошью переменной окружения и получилось вот так: Код:
RewriteEngine on Остался самый главный вопрос, как вам подобное решение, говнокод или нет и что посоветуете изменить? |
Цитата:
а вообще, так можно еще сделать (помимо копирования переменных в подзапрос с префиксом REDIRECT_ появляется переменная REDIRECT_STATUS): RewriteRule ^css/\w+\.css$ css.php RewriteCond \$0 !=css.php [OR] RewriteCond %{REQUEST_URI} =/css.php RewriteCond %{ENV:REDIRECT_STATUS} ="" RewriteRule .* index.php кроме того, непонятно, зачем NC. Непонятно, зачем нужен NE, он предотвращает экранирование специальных символов (?, &, #) в замещающей строке (до подстановки переменных), причем я не придумал других вариантов использования кроме как для #: RewriteRule ^f success#f [R,NE] # без NE будет так: success%23f Непонятно, зачем QSA. Он нужна, когда в замещающей строке указаны параметры и надо к ним добавить параметры из запроса: RewriteRule .* index.php?rewrite [QSA] # index.php?rewrite&a=1&b=2... по умолчанию, если в замещающей строке присутствуют параметры, параметры запроса не добавляются. Если же параметры отсутствуют в замещающей строке - используются параметры запроса. Т.е. указывая параметры в замещающей строке, мы переопределяем параметры запроса, если не добавлять QSA :) добавление L на автомате - дурная привычка зачем нужны эти внутренние перенаправления, насколько я понимаю... Во-первых они происходят только для правил в .htaccess, когда они изменяют URL. Во-вторых, правила в httpd.conf и в .htaccess выполняются на разных этапах обработки запроса. Первые - при преобразовании url в имя файла, потом на основе этого имени файла выполняются директивы в соответствующих .htaccess-файлах. Поэтому, если мы изменили имя файла, надо выполнить для него директивы из соответствующих ему .htaccess-файлов, для этого делается подзапрос. |
Почему не кинуть свой .htaccess в директорию css и не городить "трехэтажные Rewrite маты"?
|
Цитата:
|
За счет разбивки инструкций. Всё как в больших проектах, делим на файлы и т.д. в папке css инструкция будет считай одна в основной папке не нужно писать инструкции для css, да ещё так чтобы они не мешали друг другу.
|
на всякий случай повторю задачу: нужно файлы из папки css перенаправлять на css.php, остальные запросы (включая запрос css.php) на index.php. Добавляем в папку css:
RewriteRule ^\w+\.css$ /css.php в результате apache сделает внутренний подзапрос для css.php, который надо будет отличить от реального запроса css.php. Т.е. ничего не поменяется, сэкономим только на ^css/\w+\.css$ -> ^\w+\.css$ |
собственно поэтому я и спросил, почему нужно именно так. И возвращаясь к "как вам подобное решение", лучше изменить задачу и упростить правила
|
Часовой пояс GMT +3, время: 19:54. |