Проблема с правилом mod_rewrite!

Ямерт

The Old One
Проблема с правилом mod_rewrite!

:confused:

Сделал правило RewriteRule для переписи УРЛов типа
mysite/foo/ в mysite/index.php?page=foo:

RewriteRule ^([^/]+)(/?)$ index.php?page=$1 [L]

Загвоздка в том, что вместо ожидаемого page=foo скрипт всегда получает page=index.php. А ведь первый backreference по идее именно foo. Откуда вообще берётся этот index.php, которого в переписываемом УРЛе и в помине нет - не пойму.

В чём может быть дело??
 

.des.

Поставил пиво кому надо ;-)
Хм..по моему не все правильно в этом правиле?
ЧТо такое (/?)
Вот так должно работать.
RewriteRule ^(.*)/(.*)$ index.php?page=$2 [L]

Вообще можно добиться еще разными способами например ты хочешь чтобы имя страницы было только из англ.букв
пишем
RewriteRule ^(.*)/([A-Za-z]+)$ index.php?page=$2 [L]

Кстати возвращаясь к твоему первоначальному варианту
RewriteRule ^([^/]+)/([^/]+)$ index.php?page=$2 [L]
 

Ямерт

The Old One
(/?) - это чтобы правило работало в обоих случаях: когда в конце УРЛа есть слэш, и когда его нет.
.des. - сам паттерн-то подходит, а вот с backreference $1 - проблема.

Пока же я обнаружил вот что: index.php этот берётся из заменяемой строки - т.е. скрипт myscript получает данные page=myscript. Получается, шаблон обрабатывается ещё раз? Однако в конце RewriteRule стоит флаг [L]...
 

Ямерт

The Old One
Кстати возвращаясь к твоему первоначальному варианту
RewriteRule ^([^/]+)/([^/]+)$ index.php?page=$2 [L]
Тогда я получу index.php?page=foo не при обработке
myhost.com/foo/, а при обработке myhost.com/symbol_set/foo/ - впрочем, это не столь важно. Потому что когда я убираю вторую часть твоего выражения, и меняю $2 на $1
(RewriteRule ^([^/]+)$ index.php?page=$1 [L]),
то получаю то же самое: index.php?page=index.php.
Очевидно, есть нечто концептуальное в принципе работы модуля, что я упустил.
Поеду домой.

.des., спасибо за помощь!
 

.des.

Поставил пиво кому надо ;-)
ага точно бред какой то... эти реги на rewrite работают как то странно
RewriteRule ^([A-Za-z]+)$ index.php?page=$1
так все работает.. ну понятно если только из англ букв.
а почему же не работает так не понятно..
RewriteRule ^([^/]+)$ index.php?page=$1
отрицание как то все портит :)
 

Ямерт

The Old One
Я немного упростил решение задачи: всё, что идёт после myhost (где находится .htaccess с правилом), передаю параметром в index.php (находится там же, где и .htaccess).
Т.е. перепись такая: http://www.myhost.com/<everything> -> http://www.myhost.com/index.php?params=<everything>

Вот всё что есть в .htaccess:

RewriteEngine On
RewriteBase /webdevelopment/mp/

RewriteRule ^(.*)$ index.php?params=$1 [L]

В итоге получаю опять params=index.php.

Вот что пишет по этому поводу лог (уровень 9, при попытке зайти на myhost/webdevelopment/mp/one/two):

<host info>[rid#8134c84/initial] (3) [per-dir /projects/webdevelopment/mp/] add path-info postfix: /projects/webdevelopment/mp/one -> /projects/webdevelopment/mp/one/two
<host info>[rid#8134c84/initial] (3) [per-dir /projects/webdevelopment/mp/] strip per-dir prefix: /projects/webdevelopment/mp/one/two -> one/two
<host info>[rid#8134c84/initial] (3) [per-dir /projects/webdevelopment/mp/] applying pattern '^(.*)$' to uri 'one/two'
<host info>[rid#8134c84/initial] (2) [per-dir /projects/webdevelopment/mp/] rewrite one/two -> index.php?params=one/two

(переписалось как следовало)

<host info>[rid#8134c84/initial] (3) split uri=index.php?params=one/two -> uri=index.php, args=params=one/two
<host info>[rid#8134c84/initial] (3) [per-dir /projects/webdevelopment/mp/] add per-dir prefix: index.php -> /projects/webdevelopment/mp/index.php
<host info>[rid#8134c84/initial] (2) [per-dir /projects/webdevelopment/mp/] trying to replace prefix /projects/webdevelopment/mp/ with /webdevelopment/mp/
<host info>[rid#8134c84/initial] (5) strip matching prefix: /projects/webdevelopment/mp/index.php -> index.php
<host info>[rid#8134c84/initial] (4) add subst prefix: index.php -> /webdevelopment/mp/index.php
<host info>[rid#8134c84/initial] (1) [per-dir /projects/webdevelopment/mp/] internal redirect with /webdevelopment/mp/index.php [INTERNAL REDIRECT]

(а почему запускается нижеследующее, и как этого избежать, я не знаю:)

<host info>[rid#8136294/initial/redir#1] (3) [per-dir /projects/webdevelopment/mp/] strip per-dir prefix: /projects/webdevelopment/mp/index.php -> index.php
<host info>[rid#8136294/initial/redir#1] (3) [per-dir /projects/webdevelopment/mp/] applying pattern '^(.*)$' to uri 'index.php'
<host info>[rid#8136294/initial/redir#1] (2) [per-dir /projects/webdevelopment/mp/] rewrite index.php -> index.php?params=index.php
<host info>[rid#8136294/initial/redir#1] (3) split uri=index.php?params=index.php -> uri=index.php, args=params=index.php
<host info>[rid#8136294/initial/redir#1] (3) [per-dir /projects/webdevelopment/mp/] add per-dir prefix: index.php -> /projects/webdevelopment/mp/index.php
<host info>[rid#8136294/initial/redir#1] (1) [per-dir /projects/webdevelopment/mp/] initial URL equal rewritten URL: /projects/webdevelopment/mp/index.php [IGNORING REWRITE]
 

asman

Guest
запускается потому, что реврайт стоит на _всё_, включая index.php (получился бесконечный цикл).
надо либо исключить из правила файлы с расширением php, либо файл /index.php, либо положить его в папку, в которой выключить rewriteengine.
 

Ямерт

The Old One
Если я ничего не путаю, бесконечный цикл обычно не укладывается в 2 этапа, как это происходит в данном случае. Разве что в военное время.

Пришлось исключить все PHP из обработки:

RewriteCond %{REQUEST_URI} !^(.*)\.php$
RewriteRule ^(.*)$ index.php?params=$1 [L]

криво, но заработало.
 
Сверху