хай все!Хочу создать сайт следующей структуры:
/ - корень
/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
В обоих случаях паттерны перловские регексы, и вот тут то непонятка, толи я экранирую неправильно (пробовал всяко экранировать, вдоль и поперек) серверные переменне, толи реврайт реально их и не воспринимает в регулярных выражениях. Порылся по примерам всяких, нигде не вижу примера использования переменных в регулярном выражении шаблона.ЧТО ДЕЛАТЬ????
>RewriteRule !^usr/%{REMOTE_USER}/.*$ usr/%{REMOTE_USER}/^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^
>суть правила (Rule) в том, что если юзер идет не в свой дир,
>(а диры соответствуют именам), то сервак принудительно его редиректит.Неее-а!
Смысл твоего руля в том чтобы если юзер идёт в _свою_ директорию - повиснуть в рекурсии ,)
Переписывай первую часть на звезду ,)
>[оверквотинг удален]
>
>
> ^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^
>>суть правила (Rule) в том, что если юзер идет не в свой дир,
>>(а диры соответствуют именам), то сервак принудительно его редиректит.
>
>Неее-а!
>Смысл твоего руля в том чтобы если юзер идёт в _свою_ директорию
>- повиснуть в рекурсии ,)
>Переписывай первую часть на звезду ,)Имхо нужно просто добавить после RewriteRule флаг [L]
т.е.RewriteRule !^usr/%{REMOTE_USER}/.*$ usr/%{REMOTE_USER}/ [L]
сигнализируя о том, что это правило последнее, иначе все правила прогоняются заново после этого.
И кстати зачем в регекспе на конце .*$ ?
Я бы написал проще -RewriteRule !^usr/%{REMOTE_USER}/ usr/%{REMOTE_USER}/ [L]
>Имхо нужно просто добавить после 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/.
>[оверквотинг удален]
>
>
> ^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^
>>суть правила (Rule) в том, что если юзер идет не в свой дир,
>>(а диры соответствуют именам), то сервак принудительно его редиректит.
>
>Неее-а!
>Смысл твоего руля в том чтобы если юзер идёт в _свою_ директорию
>- повиснуть в рекурсии ,)
>Переписывай первую часть на звезду ,)Видимо для тебя регексы:
!^usr/%{REMOTE_USER}/.*$
^usr/%{REMOTE_USER}/.*$
одинаковые - смотри внимательно.
>Видимо для тебя регексы:
>!^usr/%{REMOTE_USER}/.*$
>^usr/%{REMOTE_USER}/.*$
>одинаковые - смотри внимательно.Я просто очень быстрый 0дмин! Вначале отвечаю на вопросы а потом их читаю (если время есть!) :-) Вобщем звиняйте - лопухнулси.
В рассылке апача подсказали как сделать.RewriteCond $1<>%{REMOTE_USER} !^([^<]+)<>\1$
RewriteRule ^usr/([^/]+)/ /usr/%{REMOTE_USER}/ [R,L]
RewriteRule !^usr/[^/]+/ /usr/%{REMOTE_USER}/ [R,L]мож кому пригодится )
>В рассылке апача подсказали как сделать.
>
>RewriteCond $1<>%{REMOTE_USER} !^([^<]+)<>\1$
>RewriteRule ^usr/([^/]+)/ /usr/%{REMOTE_USER}/ [R,L]
>RewriteRule !^usr/[^/]+/ /usr/%{REMOTE_USER}/ [R,L]
>
>мож кому пригодится )Принцип ясен - просто %{VAR} не подставляется в первый регекс и его нужно получить из RewriteCond.
Но флажки R,L все равно нужны, т.е. я был частично прав =)
>>В рассылке апача подсказали как сделать.
>>
>>RewriteCond $1<>%{REMOTE_USER} !^([^<]+)<>\1$
>>RewriteRule ^usr/([^/]+)/ /usr/%{REMOTE_USER}/ [R,L]
>>RewriteRule !^usr/[^/]+/ /usr/%{REMOTE_USER}/ [R,L]
>>
>>мож кому пригодится )
>
>Принцип ясен - просто %{VAR} не подставляется в первый регекс и его
>нужно получить из RewriteCond.неугадал )))
>Но флажки R,L все равно нужны, т.е. я был частично прав =)возможны варианты и без флагов )
>[оверквотинг удален]
>>>
>>>мож кому пригодится )
>>
>>Принцип ясен - просто %{VAR} не подставляется в первый регекс и его
>>нужно получить из RewriteCond.
>
>неугадал )))
>>Но флажки R,L все равно нужны, т.е. я был частично прав =)
>
>возможны варианты и без флагов )Можно подробнее рассказать в чем суть, а то у меня почему-то еще добавляет полный путь до корня перед http:xxx.ddd\usr\\etc\...\usr\...
>[оверквотинг удален]
>>>Принцип ясен - просто %{VAR} не подставляется в первый регекс и его
>>>нужно получить из RewriteCond.
>>
>>неугадал )))
>>>Но флажки R,L все равно нужны, т.е. я был частично прав =)
>>
>>возможны варианты и без флагов )
>
>Можно подробнее рассказать в чем суть, а то у меня почему-то еще
>добавляет полный путь до корня перед http:xxx.ddd\usr\\etc\...\usr\...мож для начала изложишь свою задачу и свои варианты
>[оверквотинг удален]
>>>
>>>неугадал )))
>>>>Но флажки 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]Падает в рекурсию и всё тут. В чем дело?
>[оверквотинг удален]
>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 AllRewriteEngine 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 мож к обеду мозг включится и я вспомню как все это робит ))
написал потом заметил:попробуйте во так
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]
>написал потом заметил:
>
>попробуйте во так
>
>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 AllRewriteEngine 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. Все верно?Еще идеи есть, что глючит? Я ваще не понимаю.
>[оверквотинг удален]
>
>
>
>>гипотетически:
>>1) при ваших /client/1 /client/2 - 1 и 2 соответствуют именам реальных юзеров в >htaccess?
>>2) в вашем htaccess нет больше реврайтов?
>>3) внутри подпапок нет своих htaccess и редиректов?
>>4) включайте реврайт лог и смотрите что и как он пишет, ищите правило которое работает >не так как надо.
>
>1) да, в .htaccess прописан юзер 1стоп стоп - что значит прописан в htaccess???
база юзеров создается и ведется отдельно в виде passwd файла при помощи тулзы htpasswd
покажите как у вас прописан юзер
>[оверквотинг удален]
>>>2) в вашем htaccess нет больше реврайтов?
>>>3) внутри подпапок нет своих htaccess и редиректов?
>>>4) включайте реврайт лог и смотрите что и как он пишет, ищите правило которое работает >не так как надо.
>>
>>1) да, в .htaccess прописан юзер 1
>
>стоп стоп - что значит прописан в htaccess???
>база юзеров создается и ведется отдельно в виде passwd файла при помощи
>тулзы htpasswd
>покажите как у вас прописан юзер))))) да это я опечатался)) юзер прописан в .htpasswd в том же каталоге.
>[оверквотинг удален]
>>>
>>>1) да, в .htaccess прописан юзер 1
>>
>>стоп стоп - что значит прописан в htaccess???
>>база юзеров создается и ведется отдельно в виде passwd файла при помощи
>>тулзы htpasswd
>>покажите как у вас прописан юзер
>
>))))) да это я опечатался)) юзер прописан в .htpasswd в том же
>каталоге.ну тода по логам смотрите авторизировал ли юзер
и реврайт лог придется таки изучать - если на чужом хосте - то вопрос вполне решает
>[оверквотинг удален]
>>>база юзеров создается и ведется отдельно в виде 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 чтобы чужой не зашел. А редирект работает.
Спасибо за помощь!