URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID8
Нить номер: 6120
[ Назад ]

Исходное сообщение
"mod_rewrite и серверные переменные %{VAR}"

Отправлено Pahanivo , 12-Дек-08 17:15 
хай все!

Хочу создать сайт следующей структуры:
/ - корень
/usr/user1
/usr/user2
/usr/user3
...
те набор пользовательских диров
Юзеры ходят через авторизацию апача (htpasswd) - имя авторизованного юзера я
вижу в переменной %{REMOTE_USER}

Пишу в корне такой .htaccess:
RewriteBase /
RewriteCond %{REMOTE_USER} !^$
RewriteRule !^usr/%{REMOTE_USER}/.*$ usr/%{REMOTE_USER}/

В условии (Cond) на всякий случай проверяю авторизацию,
суть правила (Rule) в том, что если юзер идет не в свой дир, (а диры соответствуют именам), то сервак принудительно его редиректит.

Все вроде бы логично, но на практике это приводит к зацикливанию редиректа. После
долгих танцев с бубном и просмотра rewritelog до меня доперло, что mod_rewrite не хавает подсовыемые переменные в паттерны*, причем как для RewriteRule так и для RewriteCond.
Если в паттерне я пропишу фиксированные строки (реальные диры) - то все замечательно.

Из мана:
RewriteRule Pattern Substitution
RewriteCond TestString CondPattern
В обоих случаях паттерны перловские регексы, и вот тут то непонятка, толи я экранирую неправильно (пробовал всяко экранировать, вдоль и поперек) серверные переменне, толи реврайт реально их и не воспринимает в регулярных выражениях. Порылся по примерам всяких, нигде не вижу примера использования переменных в регулярном выражении шаблона.

ЧТО ДЕЛАТЬ????


Содержание

Сообщения в этом обсуждении
"mod_rewrite и серверные переменные %{VAR}"
Отправлено 0dmin , 12-Дек-08 23:45 
>RewriteRule !^usr/%{REMOTE_USER}/.*$ usr/%{REMOTE_USER}/

              ^^^^^^^^^^^^^^^^^^^     ^^^^^^^^^^^^^^^^^^
>суть правила (Rule) в том, что если юзер идет не в свой дир,
>(а диры соответствуют именам), то сервак принудительно его редиректит.

Неее-а!
Смысл твоего руля в том чтобы если юзер идёт в _свою_ директорию - повиснуть в рекурсии ,)
Переписывай первую часть на звезду ,)


"mod_rewrite и серверные переменные %{VAR}"
Отправлено terr0rist , 13-Дек-08 15:45 
>[оверквотинг удален]
>
>            
>  ^^^^^^^^^^^^^^^^^^^     ^^^^^^^^^^^^^^^^^^
>>суть правила (Rule) в том, что если юзер идет не в свой дир,
>>(а диры соответствуют именам), то сервак принудительно его редиректит.
>
>Неее-а!
>Смысл твоего руля в том чтобы если юзер идёт в _свою_ директорию
>- повиснуть в рекурсии ,)
>Переписывай первую часть на звезду ,)

Имхо нужно просто добавить после RewriteRule флаг [L]
т.е.

RewriteRule !^usr/%{REMOTE_USER}/.*$ usr/%{REMOTE_USER}/ [L]

сигнализируя о том, что это правило последнее, иначе все правила прогоняются заново после этого.

И кстати зачем в регекспе на конце .*$ ?
Я бы написал проще -

RewriteRule !^usr/%{REMOTE_USER}/ usr/%{REMOTE_USER}/ [L]



"mod_rewrite и серверные переменные %{VAR}"
Отправлено Pahanivo , 13-Дек-08 15:58 
>Имхо нужно просто добавить после RewriteRule флаг [L]
>т.е.

Флаг L тут не решает, потому что мне нужно сделать редирект, что я и делаю добавляя флаг R. Но при редиректе этот htacceess обрабатывается повторно, поскольку делается новый запрос - и пошло поехало по циклу бесконечному.
L флаг вообще не принципиален для одного правила.
>
>RewriteRule !^usr/%{REMOTE_USER}/.*$ usr/%{REMOTE_USER}/ [L]
>
>сигнализируя о том, что это правило последнее, иначе все правила прогоняются заново
>после этого.
>
>И кстати зачем в регекспе на конце .*$ ?
>Я бы написал проще -
>RewriteRule !^usr/%{REMOTE_USER}/ usr/%{REMOTE_USER}/ [L]

ничего плохого в этом нет - я просто явно прописаваю полный регекс.

Дело не в флагах и тд - дело в том, что в регулярные выражения не вставляются значения переменных. Причем именно в регулярные выражения. В строки подстановки они прекрасно вставляются. Включая лог я вижу, что мод_реврайт стравнивает выражение usr/user1/file.dat
c шаблоном usr/%{REMOTE_USER}/, а не с usr/user1/.


"mod_rewrite и серверные переменные %{VAR}"
Отправлено Pahanivo , 13-Дек-08 15:50 
>[оверквотинг удален]
>
>            
>  ^^^^^^^^^^^^^^^^^^^     ^^^^^^^^^^^^^^^^^^
>>суть правила (Rule) в том, что если юзер идет не в свой дир,
>>(а диры соответствуют именам), то сервак принудительно его редиректит.
>
>Неее-а!
>Смысл твоего руля в том чтобы если юзер идёт в _свою_ директорию
>- повиснуть в рекурсии ,)
>Переписывай первую часть на звезду ,)

Видимо для тебя регексы:
!^usr/%{REMOTE_USER}/.*$
^usr/%{REMOTE_USER}/.*$
одинаковые - смотри внимательно.


"mod_rewrite и серверные переменные %{VAR}"
Отправлено 0dmin , 15-Дек-08 23:58 
>Видимо для тебя регексы:
>!^usr/%{REMOTE_USER}/.*$
>^usr/%{REMOTE_USER}/.*$
>одинаковые - смотри внимательно.

Я просто очень быстрый 0дмин! Вначале отвечаю на вопросы а потом их читаю (если время есть!) :-)  Вобщем звиняйте - лопухнулси.


"mod_rewrite и серверные переменные %{VAR}"
Отправлено Pahanivo , 16-Дек-08 09:36 
В рассылке апача подсказали как сделать.

RewriteCond $1<>%{REMOTE_USER} !^([^<]+)<>\1$
RewriteRule ^usr/([^/]+)/ /usr/%{REMOTE_USER}/ [R,L]
RewriteRule !^usr/[^/]+/ /usr/%{REMOTE_USER}/ [R,L]

мож кому пригодится )


"mod_rewrite и серверные переменные %{VAR}"
Отправлено terr0rist , 17-Дек-08 20:05 
>В рассылке апача подсказали как сделать.
>
>RewriteCond $1<>%{REMOTE_USER} !^([^<]+)<>\1$
>RewriteRule ^usr/([^/]+)/ /usr/%{REMOTE_USER}/ [R,L]
>RewriteRule !^usr/[^/]+/ /usr/%{REMOTE_USER}/ [R,L]
>
>мож кому пригодится )

Принцип ясен - просто %{VAR} не подставляется в первый регекс и его нужно получить из RewriteCond.
Но флажки R,L все равно нужны, т.е. я был частично прав =)


"mod_rewrite и серверные переменные %{VAR}"
Отправлено Pahanivo , 18-Дек-08 08:08 
>>В рассылке апача подсказали как сделать.
>>
>>RewriteCond $1<>%{REMOTE_USER} !^([^<]+)<>\1$
>>RewriteRule ^usr/([^/]+)/ /usr/%{REMOTE_USER}/ [R,L]
>>RewriteRule !^usr/[^/]+/ /usr/%{REMOTE_USER}/ [R,L]
>>
>>мож кому пригодится )
>
>Принцип ясен - просто %{VAR} не подставляется в первый регекс и его
>нужно получить из RewriteCond.

неугадал )))
>Но флажки R,L все равно нужны, т.е. я был частично прав =)

возможны варианты и без флагов )


"mod_rewrite и серверные переменные %{VAR}"
Отправлено yo , 25-Янв-09 01:41 
>[оверквотинг удален]
>>>
>>>мож кому пригодится )
>>
>>Принцип ясен - просто %{VAR} не подставляется в первый регекс и его
>>нужно получить из RewriteCond.
>
>неугадал )))
>>Но флажки R,L все равно нужны, т.е. я был частично прав =)
>
>возможны варианты и без флагов )

Можно подробнее рассказать в чем суть, а то у меня почему-то еще добавляет полный путь до корня перед http:xxx.ddd\usr\\etc\...\usr\...


"mod_rewrite и серверные переменные %{VAR}"
Отправлено Pahanivo , 25-Янв-09 15:37 
>[оверквотинг удален]
>>>Принцип ясен - просто %{VAR} не подставляется в первый регекс и его
>>>нужно получить из RewriteCond.
>>
>>неугадал )))
>>>Но флажки R,L все равно нужны, т.е. я был частично прав =)
>>
>>возможны варианты и без флагов )
>
>Можно подробнее рассказать в чем суть, а то у меня почему-то еще
>добавляет полный путь до корня перед http:xxx.ddd\usr\\etc\...\usr\...

мож для начала изложишь свою задачу и свои варианты


"mod_rewrite и серверные переменные %{VAR}"
Отправлено Владислав , 20-Май-09 03:06 
>[оверквотинг удален]
>>>
>>>неугадал )))
>>>>Но флажки R,L все равно нужны, т.е. я был частично прав =)
>>>
>>>возможны варианты и без флагов )
>>
>>Можно подробнее рассказать в чем суть, а то у меня почему-то еще
>>добавляет полный путь до корня перед http:xxx.ddd\usr\\etc\...\usr\...
>
>мож для начала изложишь свою задачу и свои варианты

Привет! Попробовал сделать как Вы говорите, но ничего не выходит. Ситуация аналогичная. Есть корень сайта /. Надо, чтобы на странице /client по итогам авторизации юзера редиректило на /client/1, /client/2 и т.д.

Вот .htaccess в дире /client

require valid-user
RewriteEngine on
RewriteBase /

RewriteCond %{REMOTE_USER} !^$
RewriteCond $1<>%{REMOTE_USER} !^([^<]+)<>\1$
RewriteRule ^client/([^/]+)/ /client/%{REMOTE_USER}/ [R,L]
RewriteRule !^client/[^/]+/ /client/%{REMOTE_USER}/ [R,L]

Падает в рекурсию и всё тут. В чем дело?


"mod_rewrite и серверные переменные %{VAR}"
Отправлено Pahanivo , 20-Май-09 07:53 
>[оверквотинг удален]
>require valid-user
>RewriteEngine on
>RewriteBase /
>
>RewriteCond %{REMOTE_USER} !^$
>RewriteCond $1<>%{REMOTE_USER} !^([^<]+)<>\1$
>RewriteRule ^client/([^/]+)/ /client/%{REMOTE_USER}/ [R,L]
>RewriteRule !^client/[^/]+/ /client/%{REMOTE_USER}/ [R,L]
>
>Падает в рекурсию и всё тут. В чем дело?

хм, оч странно
у меня правда .htaccess лежит в корне (хотя сомнительно - разницы в этом не вижу)
мозг с утра не робит поэтому вспомнить как все это робит не получилось ))

мой рабочий htaccess:

AuthType Basic
AuthName "....my some realm..."
AuthUserFile /my_path/to/passwd
Require valid-user
Satisfy All

RewriteEngine On

RewriteBase /
RewriteCond %{REMOTE_USER} !^$
RewriteCond %{REMOTE_USER} !^!.+$
RewriteCond $1<>%{REMOTE_USER} !^([^<]+)<>\1$
RewriteRule ^usr/([^/]+)/ /usr/%{REMOTE_USER}/ [R,L]
RewriteCond %{REMOTE_USER} !^$
RewriteCond %{REMOTE_USER} !^!.+$
RewriteRule !^usr/[^/]+/ /usr/%{REMOTE_USER}/ [R,L]
RewriteCond %{REMOTE_USER} ^!.+$
RewriteRule !^usr /usr/ [R,L]

(отличие от приведенного ранее в том, что у меня еще есть супер юзеры, имена которых начинаются с восклицательного знака, они могут видеть usr (ваш client) целиком.)

гипотетически:
1) при ваших /client/1 /client/2 - 1 и 2 соответствуют именам реальных юзеров в htaccess?
2) в вашем htaccess нет больше реврайтов?
3) внутри подпапок нет своих htaccess и редиректов?
4) включайте реврайт лог и смотрите что и как он пишет, ищите правило которое работает не так как надо.

PS мож к обеду мозг включится и я вспомню как все это робит ))


"mod_rewrite и серверные переменные %{VAR}"
Отправлено Pahanivo , 20-Май-09 07:57 
написал потом заметил:

попробуйте во так

RewriteCond %{REMOTE_USER} !^$
RewriteCond $1<>%{REMOTE_USER} !^([^<]+)<>\1$
RewriteRule ^client/([^/]+)/ /client/%{REMOTE_USER}/ [R,L]
RewriteCond %{REMOTE_USER} !^$
RewriteRule !^client/[^/]+/ /client/%{REMOTE_USER}/ [R,L]


"mod_rewrite и серверные переменные %{VAR}"
Отправлено Владислав , 20-Май-09 09:12 
>написал потом заметил:
>
>попробуйте во так
>
>RewriteCond %{REMOTE_USER} !^$
>RewriteCond $1<>%{REMOTE_USER} !^([^<]+)<>\1$
>RewriteRule ^client/([^/]+)/ /client/%{REMOTE_USER}/ [R,L]
>RewriteCond %{REMOTE_USER} !^$
>RewriteRule !^client/[^/]+/ /client/%{REMOTE_USER}/ [R,L]

Так не работает. Циклится. На этой (последней) строчке:
RewriteRule !^client/[^/]+/ /client/%{REMOTE_USER}/ [R,L]

Вот весь .htaccess:

AuthName "..my realm..."
AuthType Basic
AuthUserFile /path/to
Require valid-user
Satisfy All

RewriteEngine on
RewriteBase /

RewriteCond %{REMOTE_USER} !^$
RewriteCond $1<>%{REMOTE_USER} !^([^<]+)<>\1$
RewriteRule ^client/([^/]+)/ /client/%{REMOTE_USER}/ [R,L]
RewriteCond %{REMOTE_USER} !^$
RewriteRule !^client/[^/]+/ /client/%{REMOTE_USER}/ [R,L]

>гипотетически:
>1) при ваших /client/1 /client/2 - 1 и 2 соответствуют именам реальных юзеров в >htaccess?
>2) в вашем htaccess нет больше реврайтов?
>3) внутри подпапок нет своих htaccess и редиректов?
>4) включайте реврайт лог и смотрите что и как он пишет, ищите правило которое работает >не так как надо.

1) да, в .htaccess прописан юзер 1
2) нет
3) нет
4) нету возможности залезть в httpd.conf, потому что сайт на обычном хостинге, но, похоже, что циклится на последней строчке.

Может, я что-то не понимаю? у меня есть домен mydomain.ru.
У хостера на сервере есть дир www/client, который доступен по mydomain.ru/client
в дире client есть поддиры 1, 2, etc. Все верно?

Еще идеи есть, что глючит? Я ваще не понимаю.


"mod_rewrite и серверные переменные %{VAR}"
Отправлено Pahanivo , 20-Май-09 10:11 
>[оверквотинг удален]
>
>
>
>>гипотетически:
>>1) при ваших /client/1 /client/2 - 1 и 2 соответствуют именам реальных юзеров в >htaccess?
>>2) в вашем htaccess нет больше реврайтов?
>>3) внутри подпапок нет своих htaccess и редиректов?
>>4) включайте реврайт лог и смотрите что и как он пишет, ищите правило которое работает >не так как надо.
>
>1) да, в .htaccess прописан юзер 1

стоп стоп - что значит прописан в htaccess???
база юзеров создается и ведется отдельно в виде passwd файла при помощи тулзы htpasswd
покажите как у вас прописан юзер


"mod_rewrite и серверные переменные %{VAR}"
Отправлено Владислав , 20-Май-09 10:16 
>[оверквотинг удален]
>>>2) в вашем htaccess нет больше реврайтов?
>>>3) внутри подпапок нет своих htaccess и редиректов?
>>>4) включайте реврайт лог и смотрите что и как он пишет, ищите правило которое работает >не так как надо.
>>
>>1) да, в .htaccess прописан юзер 1
>
>стоп стоп - что значит прописан в htaccess???
>база юзеров создается и ведется отдельно в виде passwd файла при помощи
>тулзы htpasswd
>покажите как у вас прописан юзер

))))) да это я опечатался)) юзер прописан в .htpasswd в том же каталоге.


"mod_rewrite и серверные переменные %{VAR}"
Отправлено Pahanivo , 20-Май-09 16:05 
>[оверквотинг удален]
>>>
>>>1) да, в .htaccess прописан юзер 1
>>
>>стоп стоп - что значит прописан в htaccess???
>>база юзеров создается и ведется отдельно в виде passwd файла при помощи
>>тулзы htpasswd
>>покажите как у вас прописан юзер
>
>))))) да это я опечатался)) юзер прописан в .htpasswd в том же
>каталоге.

ну тода по логам смотрите авторизировал ли юзер
и реврайт лог придется таки изучать - если на чужом хосте - то вопрос вполне решает


"mod_rewrite и серверные переменные %{VAR}"
Отправлено Владислав , 21-Май-09 16:39 
>[оверквотинг удален]
>>>база юзеров создается и ведется отдельно в виде passwd файла при помощи
>>>тулзы htpasswd
>>>покажите как у вас прописан юзер
>>
>>))))) да это я опечатался)) юзер прописан в .htpasswd в том же
>>каталоге.
>
>ну тода по логам смотрите авторизировал ли юзер
>и реврайт лог придется таки изучать - если на чужом хосте -
>то вопрос вполне решает

так и не поняли в чем дело. Остановились на таком конфиге

#RewriteCond %{REMOTE_USER} !^$
#RewriteCond $1<>%{REMOTE_USER} !^([^<]+)<>\1$
#RewriteRule ^([^/]+)/ /client/%{REMOTE_USER}/ [R,L]
RewriteCond %{REMOTE_USER} !^$
RewriteRule !^[^/]+/ /client/%{REMOTE_USER}/ [R,L]

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

Спасибо за помощь!