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

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

Skipp 03.11.2011 09:36

Цитата:

Сообщение от x-yuri
кроме того, непонятно, зачем NC.

Цитата:

Сообщение от x-yuri
Непонятно, зачем нужен NE

Цитата:

Сообщение от x-yuri
Непонятно, зачем QSA

Это остатки с прошлых наработак, я их уже убрал и они действительно не нужны
Цитата:

Сообщение от Gozar
Почему не кинуть свой .htaccess в директорию css

Потому что её нету и только ради .htaccess не хочется создавать её)

Я сделал ЧПУ, а файлы css, js и т.д. обрабатываю через php, сжимаю, убираю из них ненужное, некоторые конечно не трогаю.

Цитата:

Сообщение от x-yuri
лучше изменить задачу и упростить правила

Можно узнать почему?

x-yuri 03.11.2011 13:18

Цитата:

Сообщение от Skipp
Можно узнать почему?

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

Цитата:

Сообщение от x-yuri
Почему css.php перенаправляется в index.php, а *.css в css.php?


Skipp 03.11.2011 13:57

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

Такой способ нагружает сервер, но так как большинство данных будет получатся асинхронным методом, и только при смене шаблона все стили и js будут подгружаться снова, я надеюсь больших нагрузок избежать.

Gozar 03.11.2011 14:23

Цитата:

Сообщение от Skipp (Сообщение 134200)
Потому что её нету
...
Я сделал ЧПУ

Я уже понял, перечитав задачу.
...
Я тоже сделал ЧПУ, но не отдаю клиенту статику- css файлы через динамику- php, а надежда, она умирает последней, после обрушения сервера. ;)

Из шаблона нельзя вызвать и подгрузить css файл относящийся к этому шаблону?

Skipp 03.11.2011 16:03

Ну я думаю облачный хост будет сложно уронить, да и за безопасностью я жёстко слежу, конечно шансы на дырявость всегда есть, но я стараюсь не оставлять никаких, даже возможных, проблем.
Цитата:

Сообщение от Gozar
Из шаблона нельзя вызвать и подгрузить css файл относящийся к этому шаблону?

Ну если взять немного другой подход к решению всей задачи, то можно, но я уже выбрал путь в котором это не совсем легко:), да и ненужно.

Мне вот интересно, что сейчас более важнее по вашему мнению размер файла или скорость его обработки? В моём случаи общий размер я сократил примерно на 50кб но увеличил время загрузки на 150мс, что лучше?

x-yuri 03.11.2011 17:44

Цитата:

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

ты не понял либо я... почему иногда css.php выполняется сам, а иногда через index.php? Это значительно усложняет правила.

Цитата:

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

а расскажи, в чем он заключается?

Цитата:

Сообщение от Skipp
Мне вот интересно, что сейчас более важнее по вашему мнению размер файла или скорость его обработки? В моём случаи общий размер я сократил примерно на 50кб но увеличил время загрузки на 150мс, что лучше?

во-первых, как ты этого добился и во-вторых, разве есть разница, кроме суммарного времени?


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