Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|

12.01.2009, 22:59
|
|
Постоянный
Регистрация: 29.05.2007
Сообщений: 852
Провел на форуме: 4832771
Репутация:
1916
|
|
Базар свой прекращаем, бабки! Сидят тут пальцы гнут друг перед другом.
Вы оба не отличаетесь особым профессионализмом.
Так что переносим споры в пм, аську, куда угодно, а тему оставляем для регулярок)
|
|
|

12.01.2009, 22:59
|
|
Динозавр
Регистрация: 10.01.2008
Сообщений: 2,841
Провел на форуме: 9220514
Репутация:
3338
|
|
delete
Последний раз редактировалось Pashkela; 16.01.2009 в 18:31..
|
|
|
MultiViews и mod_rewrite — два вопроса |

16.01.2009, 18:18
|
|
Новичок
Регистрация: 16.01.2009
Сообщений: 3
Провел на форуме: 2080
Репутация:
3
|
|
MultiViews и mod_rewrite — два вопроса
Постигая мудрость фреймворков, обнаружил невиданную ранее особенность:
URL вида
http://localhost/222/front .php
работал также при добавлении в конец слеша и любого мусора
http://localhost/222/front .php/dfojdofjso
В моём представлении такой URL мог соответствовать исключительно одной ситуации — наличии каталога с именем front.php и файла без расширения с именем dfojdofjso.
Озадаченный подобным казусом я полез на форум с вопросом «как такое может быть?». Мне сказали что дело в некой неизвестной мне тогда директиве MultiViews. Я обрадовался и закрыл тему, но поспешил. Оказалось, что эта директива всего лишь разрешает писать URL вида (1) вместо (2):
1) http://localhost/222/front
2) http://localhost/222/front .php
А ссылка вида
http://localhost/222/front .php/dfojdofjso
cпокойно работает при отключённом MultiViews!!! Вот что печатает этот скрипт:
REQUEST_URI => /222/front.php/dfdf
SCRIPT_NAME => /222/front.php
PHP_SELF => /222/front.php/dfdf
SCRIPT_FILENAME => z:/home/localhost/www/222/front.php
Я успокоил себя тем, что апач находит файл front.php и, рассудив, что это и есть его цель, выдаёт страницу. Т.е. поместил проблему в чёрный ящик.
Далее я создал .htaccess с таким содержимым:
RewriteEngine on
RewriteRule ^(.*)$ front\.php/dfojdofjso [L]
Т.е полагается переадресовывать любой запрос на front.php с мусором после слеша. Я ожидал один из двух вариантов:
1) сработает, как и при вводе URL http://localhost/222/front.php/dfojdofjso
2) не сработает и выдаст ошибку 404
Далее я проверил URL:
http://localhost/222/dfojdofjso.php
но результат оказался иным — произошла 500-я ошибка, а по логам — зацикливание.
Тут можно было бы обложится мануалами и разбираться в чём суть, но я продолжил эксперименты и получил во много раз более парадоксальную ситуацию. Изменённый .htaccess
RewriteEngine on
RewriteCond $1 !^front\.php
RewriteRule ^(.*)$ front\.php/sdfsdf [L]
И... это заработало. Заработало как в случае совпадения с front\.php, так и в случае несовпадения!
1) http://localhost/222/front.php
REQUEST_URI => /222/front.php
SCRIPT_NAME => /222/front.php
PHP_SELF => /222/front.php
SCRIPT_FILENAME => z:/home/localhost/www/222/front.php
2) http://localhost/222/dfojdofjso .php
REQUEST_URI => /222/dfojdofjso.php
SCRIPT_NAME => /222/front.php
PHP_SELF => /222/front.php/sdfsdf
SCRIPT_FILENAME => z:/home/localhost/www/222/front.php
Т.е добавление условия заставило нерабочее правило работать как в случае выполнения условия (1), так и в случае невыполнения условия (2), чего, по идее, быть не может. Вообще, я предпочитаю разбираться во всём самостоятельно, однако данная ситуация разорвала мой мозг поэтому приходится просить помощи снова. Общее представление как работает mod rewrite я имею, поэтому прошу не отсылать меня к абстрактной документации.
На всякий случай сформулирую вопросы:
1) Как же всё-таки URL вида
http://localhost/222/front.php/dfojdofjso
при наличии файла front.php работает при отключённом MultiViews?
2) Самый главный вопрос — почему правило
RewriteEngine on
RewriteRule ^(.*)$ front\.php/sdfsdf [L]
вызывает зацикливание независимо от URL, а правило
RewriteEngine on
RewriteCond $1 !^front\.php
RewriteRule ^(.*)$ front\.php/sdfsdf [L]
не вызывает зацикливания, опять таки независимо от URL?
Прошу прощения за длинный пост 
|
|
|

16.01.2009, 18:43
|
|
Динозавр
Регистрация: 10.01.2008
Сообщений: 2,841
Провел на форуме: 9220514
Репутация:
3338
|
|
RewriteRule обратные_связи: Это обратные связи вида
$N
(0 <= N <= 9) предоставляющие доступ к сгруппированным частям (в круглых скобках!) шаблона из соответствующей директивы RewriteRule (единственной, следующей сразу за текущим набором директив RewriteCond).
.........
Условие это шаблон условия, т.е., какое-либо регулярное выражение применяемое к текущему экземпляру СравниваемаяСтрока, т.е., СравниваемаяСтрока просматривается на поиск соответствия Условие.
Помните: Условие это perl совместимое регулярное выражение с некоторыми дополнениями:
Вы можете предварять строку шаблона префиксом '!' (восклицательный знак) для указания несоответствия шаблону.
http://htaccess.net.ru/doc/mod_rewrite/RewriteCond.php
т.е. у тебя типо получается если НЕ " ^front\.php", то
"^(.*)$" из строки "RewriteRule ^(.*)$ front\.php/sdfsdf [L]"
а то, что справа от "^(.*)$" - просто игнорируется, я так понял
ЗЫЖ Потому то, что справа от "^(.*)$" - ерунда какая-то 
|
|
|

16.01.2009, 19:26
|
|
Новичок
Регистрация: 16.01.2009
Сообщений: 3
Провел на форуме: 2080
Репутация:
3
|
|
а то, что справа от "^(.*)$" - просто игнорируется, я так понял
Думаю не игнорируется. Переменная PHP_SELF меняется в зависимости от выполнения, невыполнения условия.
Я, пожалуй, переформулирую вопрос:
Вот .htaccess фреймворка codeigniter
RewriteEngine on
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ index\.php/$1 [L]
Т.е. всё кидаем на фронт контроллер кроме картинок, цсс-стилей и т.д. а также кроме самого фронт контроллера.
Я не могу понять почему при удалении из RewriteCond составляющей "index\.php" происходит зацикливание на уровне Апача.
Для чего это всё нужно. Обычно CMS/CMF перенаправляют составляющие URL в GET-параметры, но некоторые устроены иначе — к контроллерам доступаешься так:
http://somehost.ru/index.php/somecontroller/action/param1/param2
а чтобы не писать index.php, а писать так:
http://somehost.ru/somecontroller/action/param1/param2
в .htaccess и добавляют такое правило.
Как оно распарсивается внутри, я пока не могу найти, там код мивина-стайл.
Последний раз редактировалось jabber; 16.01.2009 в 19:34..
|
|
|

16.01.2009, 19:57
|
|
Reservists Of Antichat - Level 6
Регистрация: 25.04.2008
Сообщений: 827
Провел на форуме: 2769640
Репутация:
1304
|
|
jabber Как бы все интуитивно понятно должно быть:
RewriteCond проверяет, чтобы первая подмаска не начиналась на index.php images или robots.txt. Если выполнено - вступает в силу RewriteRule - меняем http://someshit.ru/sdsadsadasd на http://someshit.ru/index.php/sdsadsadasd
Так как произошел внутренний редирект, то данные условия проверяются еще раз, но уже для нового пути. Вот и получается бесконечное добавление index.php.
Чтобы все было более явно - поставьте флаг для внешнего редиректа - R и посмотрите на урл в браузере после захода на страницу с RewriteRule и без оного
Код:
RewriteEngine on
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ index\.php/$1 [L,R]
|
|
|

16.01.2009, 20:10
|
|
Познающий
Регистрация: 03.06.2007
Сообщений: 31
Провел на форуме: 163026
Репутация:
3
|
|
Есть несколько сторок текста:
class="blu"><b>DATA</b></a>
class="blu">DATA</a>
class="blu"><b>DATA</b></a>
class="blu">DATA</a>
Нужно составить регулярку которая вытаскивает данные между тегами, в данном случае DATA.
|
|
|

16.01.2009, 20:13
|
|
Reservists Of Antichat - Level 6
Регистрация: 25.04.2008
Сообщений: 827
Провел на форуме: 2769640
Репутация:
1304
|
|
Fak1r
PHP код:
preg_match_all('~class="blu">([^<])*</a>~i',$in,$out);
print_r($out);
|
|
|

16.01.2009, 20:55
|
|
Познающий
Регистрация: 03.06.2007
Сообщений: 31
Провел на форуме: 163026
Репутация:
3
|
|
Gifts
Чет не работает, проверял ругулярку на http://www.regexpr.ru/
Возвращается только буква A, и только из двух сторочек в которых нет тэга <b>.
|
|
|

16.01.2009, 21:00
|
|
Reservists Of Antichat - Level 6
Регистрация: 25.04.2008
Сообщений: 827
Провел на форуме: 2769640
Репутация:
1304
|
|
Fak1r * внутрь скобок надо ^^
PHP код:
preg_match_all('~class="blu">([\s\S]*?)</a>~i',$in,$out);
print_r($out);
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|