Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   mod_Rewrite - наверное всех задолбал) (https://javascript.ru/forum/server/22809-mod_rewrite-navernoe-vsekh-zadolbal.html)

Skipp 01.11.2011 16:06

mod_Rewrite - наверное всех задолбал)
 
Всем привет, передо мной встала одна задачка и я пытался её решить так:

Код:

RewriteEngine on
RewriteBase /
RewriteRule ^css/\w+\.css$ css.php [NC,NE,S=1]
RewriteRule ^(.*)$ index.php [QSA,NC,NE,L]

Мне нужно при запросе на css файлы в папке css выполнять css.php в остальных случая index.php, но почему то index.php запускается всегда, если убрать 4 строку то с css проблем нет.

Помогите найти ошибку или возможно другое решение.

Serg_pnz 01.11.2011 16:41

м.б. тормознуть поиск, если есть совпадение в той строке?
Цитата:

RewriteRule ^css/\w+\.css$ css.php [NC,NE,S=1,L]

Skipp 01.11.2011 17:47

Нет не получится.

Я понял почему всеравно выполняется index.php, но не допру как решить, как я понимаю нада улучшить регулярку для второго выражения и исключить первое, но в таком случаи при прямом запросе на css.php он будет его выполнять:(

Просто правила обходятся три раза, в первый ставиться css.php далее апач снова запускает его и уже меняет на index.php, далее проходит ещё раз, но уже ничего не меняет и останавливается.

Skipp 01.11.2011 17:54

теперь можно вздохнуть спокойно:)

Я решил свою проблему, остановив цикл с помошью переменной окружения и получилось вот так:

Код:

RewriteEngine on
RewriteBase /
RewriteCond %{ENV:REDIRECT_FINISH} !^$
RewriteRule ^ - [L]
RewriteRule ^css/\w+\.css$ css.php [NC,S=2,E=FINISH:1]
RewriteRule ^js/\w+\.js$ js.php [NC,S=1,E=FINISH:1]
RewriteRule ^(.*)$ index.php [QSA,NC,NE]

Ещё не идеален, но главная проблема решена.

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

x-yuri 02.11.2011 10:23

Цитата:

Сообщение от Skipp
Остался самый главный вопрос, как вам подобное решение, говнокод или нет и что посоветуете изменить?

а ты объясни, почему именно так надо сделать? Почему css.php перенаправляется в index.php, а *.css в css.php?

а вообще, так можно еще сделать (помимо копирования переменных в подзапрос с префиксом 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-файлов, для этого делается подзапрос.

Gozar 02.11.2011 11:47

Почему не кинуть свой .htaccess в директорию css и не городить "трехэтажные Rewrite маты"?

x-yuri 02.11.2011 14:54

Цитата:

Сообщение от Gozar
Почему не кинуть свой .htaccess в директорию css и не городить "трехэтажные Rewrite маты"?

А за счет чего маты станут менееэтажные?

Gozar 02.11.2011 15:18

За счет разбивки инструкций. Всё как в больших проектах, делим на файлы и т.д. в папке css инструкция будет считай одна в основной папке не нужно писать инструкции для css, да ещё так чтобы они не мешали друг другу.

x-yuri 02.11.2011 15:27

на всякий случай повторю задачу: нужно файлы из папки css перенаправлять на css.php, остальные запросы (включая запрос css.php) на index.php. Добавляем в папку css:
RewriteRule   ^\w+\.css$   /css.php

в результате apache сделает внутренний подзапрос для css.php, который надо будет отличить от реального запроса css.php. Т.е. ничего не поменяется, сэкономим только на ^css/\w+\.css$ -> ^\w+\.css$

x-yuri 02.11.2011 20:24

собственно поэтому я и спросил, почему нужно именно так. И возвращаясь к "как вам подобное решение", лучше изменить задачу и упростить правила


Часовой пояс GMT +3, время: 19:54.