Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.11.2011, 16:06
Аватар для Skipp
.
Отправить личное сообщение для Skipp Посмотреть профиль Найти все сообщения от Skipp
 
Регистрация: 30.03.2010
Сообщений: 1,813

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 проблем нет.

Помогите найти ошибку или возможно другое решение.
__________________
.
Ответить с цитированием
  #2 (permalink)  
Старый 01.11.2011, 16:41
Аватар для Serg_pnz
Сам по себе
Отправить личное сообщение для Serg_pnz Посмотреть профиль Найти все сообщения от Serg_pnz
 
Регистрация: 09.06.2009
Сообщений: 963

м.б. тормознуть поиск, если есть совпадение в той строке?
Цитата:
RewriteRule ^css/\w+\.css$ css.php [NC,NE,S=1,L]
Ответить с цитированием
  #3 (permalink)  
Старый 01.11.2011, 17:47
Аватар для Skipp
.
Отправить личное сообщение для Skipp Посмотреть профиль Найти все сообщения от Skipp
 
Регистрация: 30.03.2010
Сообщений: 1,813

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

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

Просто правила обходятся три раза, в первый ставиться css.php далее апач снова запускает его и уже меняет на index.php, далее проходит ещё раз, но уже ничего не меняет и останавливается.
__________________
.
Ответить с цитированием
  #4 (permalink)  
Старый 01.11.2011, 17:54
Аватар для Skipp
.
Отправить личное сообщение для Skipp Посмотреть профиль Найти все сообщения от Skipp
 
Регистрация: 30.03.2010
Сообщений: 1,813

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

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

Код:
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]
Ещё не идеален, но главная проблема решена.

Остался самый главный вопрос, как вам подобное решение, говнокод или нет и что посоветуете изменить?
__________________
.
Ответить с цитированием
  #5 (permalink)  
Старый 02.11.2011, 10:23
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Сообщение от 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-файлов, для этого делается подзапрос.
Ответить с цитированием
  #6 (permalink)  
Старый 02.11.2011, 11:47
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

Почему не кинуть свой .htaccess в директорию css и не городить "трехэтажные Rewrite маты"?
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Ответить с цитированием
  #7 (permalink)  
Старый 02.11.2011, 14:54
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Сообщение от Gozar
Почему не кинуть свой .htaccess в директорию css и не городить "трехэтажные Rewrite маты"?
А за счет чего маты станут менееэтажные?
Ответить с цитированием
  #8 (permalink)  
Старый 02.11.2011, 15:18
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

За счет разбивки инструкций. Всё как в больших проектах, делим на файлы и т.д. в папке css инструкция будет считай одна в основной папке не нужно писать инструкции для css, да ещё так чтобы они не мешали друг другу.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Ответить с цитированием
  #9 (permalink)  
Старый 02.11.2011, 15:27
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

на всякий случай повторю задачу: нужно файлы из папки 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.
Ответить с цитированием
  #10 (permalink)  
Старый 02.11.2011, 20:24
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Суммирование значений всех элементов div frolvict jQuery 1 11.07.2011 17:05
Как изменить свойство css у всех элементов одного класса AlexJ Events/DOM/Window 7 19.03.2011 06:25
Установка кнопкой всех значений SELECT одинаково Лавсановые Волокна Элементы интерфейса 3 28.12.2010 13:28
Полный список всех цветов html? Бобр Оффтопик 4 13.04.2009 14:11