mod_rewrite - проблема

berkut

Новичок
mod_rewrite - проблема

Есть .htaccess
Код:
RewriteEngine on
RewriteBase /
RewriteRule catalogue/(.*) catalogue/index.php?m=$1
В брузере обращаюсь к http://server/catalogue/, либо http://server/catalogue/1.html
и всегда получаю в _GET, и _REQUEST - m=index.php - и всё. Откуда берётся в _GET['m']=='index.php' - вообще непонятно, также как и куда пропадает 1.html
 

Jahont

Новичок
у вас в первом варианте catalogue/(.*) заменяется на:

catalogue/index.php?m=

а во втором на:

catalogue/index.php?m=1.html

и всё.
 

berkut

Новичок
Jahont в том-то и дело, что не заменяется. Если изменить имя файла, допустим на test.php, и переписать правило так: RewriteRule catalogue/(.*) catalogue/test.php?m=$1
то в get['m'] будет лежать test.php.
 

Jahont

Новичок
В .htaccess ещё какие директивы есть? И для чего такое правило?
 

berkut

Новичок
нет больше директив, упростил всё до минимума. А для чего такое правило - вопрос по-моему вообще не в тему. Что-бы было. Что-бы перехватить обращения /catalogue/1/2/15.html
 

Gorynych

Посетитель PHP-Клуба
berkut

ваше правило делает переброску для всех обращений вида catalogue/все_что_дальше на catalogue/index.php, передавая в качестве значения GET параметра "m" (вот это $1 заменяется на область, попавшую в скобки)

при обращении к каталогу (например httpd://host/catalogue/) веб-сервер пытается найти первый подходящий индексный файл и находит (в вашем случае) index.php.

так что с одной стороны, запрос /catalogue/ перенаправляется на /catalogue/index.php, но срабатывает правило (потому как /catalogue/index.php под него тоже подходит) и происходит еще раз редирект с добавлением параметра m=index.php

этот ужас мог бы выполняться рекурсивно вплоть до выхода аварийного завершения по таймауту, но разработчики в какой-то момент поняли, что заставить вас читать и понимать прочитанное очень сложно, поэтому еще часть ресурсов веб-сервера тратиться на то, чтобы понять что это бесконечная рекурсия от кривых рук и таки вызвать /catalogue/index.php?m=index.php

советы:

1) вынесете скрипт, обрабатывающий запросы к catalogue/что-то_там из этого каталога, не мучайте сервер понапрасну, он же не железный

2) второй вариант сложнее - Вам придеться разобраться в руководстве и написать предваряющее условие (RewriteCond) которое будет исключать из действия правила файл catalogue/index.php
 

baev

‹°°¬•
Команда форума
при обращении к каталогу (например httpd://host/catalogue/) веб-сервер пытается найти первый подходящий индексный файл и находит (в вашем случае) index.php
— зачем «умножать сущности»?
Если веб-сервер не будет «пытаться найти индексный файл», то всё равно пойдёт зацикливание. Или нет?
 

Jahont

Новичок
Автор оригинала: berkut
А для чего такое правило - вопрос по-моему вообще не в тему. Что-бы было. Что-бы перехватить обращения /catalogue/1/2/15.html
Допустим ссылка имеет вид:
/catalogue/1/2/15.html,
так к какому виду её надо преобразовать?
 

berkut

Новичок
Gorynych спасибо за пинок. Давно не возился с мод_реврайтом, совсем забыл, что он рекурсивно правила применяет.
Код:
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME}  !-f
RewriteRule catalogue/(.*) catalogue/index.php?m=$1
 

bzik

Новичок
Тоже вопросик. Все картинки кормятся скрипту для защиты водяными знаками, но надо сделать отдельно свободный доступ к этим картинками. Имеем:
RewriteRule ^free-access/(.*)$ $1 [L]
RewriteRule ^(img.*)$ watermark.php?f=$1 [L]
Однако в любом случае срабатывает второе правило, даже если первое сработало. "L" почему-то не останавливает процесс... Или оно по-другому работает?

Пробовал даже такую конструкцию, все равно водяные знаки вылазят....
RewriteCond %{REQUEST_URI} !free-access
RewriteRule ^(img.*)$ watermark.php?f=$1 [L]
RewriteRule ^free-access/(.*)$ $1 [L]
 
Сверху