IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Веб-программирование (http://www.imho.ws/forumdisplay.php?f=29)
-   -   ModRewrite? Или как-то еще? (http://www.imho.ws/showthread.php?t=63399)

Sinker 05.07.2004 17:40

ModRewrite? Или как-то еще?
 
Идея такова.
Есть "рыба" сайта, лежащая на www.site.ru/users/
Есть домены вида www.name.site.ru.
Нужно, чтоб при заходе на www.name.site.ru клиенту выдавался контент из www.site.ru/users/ с параметром n=name, т.е вводит чел в эксплорер www.name.site.ru/index.htm, а ему показывается файл из www.site.ru/users/index.php?n=name. Ну и ссылки чтоб так же прозрачно работали. Вобщем если кто такое уже вытворял - help me please.

ЗЫ. Нарыл вот такой пример: RewriteRule ^([a-zA-Z_0-9]+)\.htm?(.*)$ http://www.site.ru/users/index.php?c=$1&$2 [L]
Т.е. чел нажимает на ссылку www.site.ru/123.htm и его перекидывает на http://www.site.ru/users/index.php?c=123. Но именно перекидывает (как редирект), а нужно чтоб в строке адреса оставался www.site.ru/123.htm, а вот данные брались из другого места.
ЗЗЫ. Надеюсь, внятно растолковал. :-)

Ghost 05.07.2004 17:57

Чтобы ModRewrite не показывал, на что именно происходит редирект, нужно в RewriteRule писать локальные адреса, например
Код:

RewriteRule ^/guest/(.*)$              /sg.pl$1          [NE]
Т.е. в твоем случае, должно быть описано перенаправление:
Код:

RewriteRule ^(.*)\.html$ /index.php?url=$1 [NE]
А скрипт index.php должен сам определять, с какого именно хоста произошло перенаправление, анализируя $ENV{'HTTP_HOST'}. Т.е. в него (скрипт) имя пользователя не передается, а он сам выковыривает его из имени хоста name.site.ru (=~s/(.*)([^\.]+)(\.site\.ru)/$2/).

RaZEr 05.07.2004 19:01

Главное чтобы этот Http_host доходил до апача. На шареде это обычно непреодолимое препятствие.

Sinker 05.07.2004 19:17

Ghost
Что-то я ничего не понял (чайник, блин).
2 вопроса.
1. Что значат буквы [L] и [NE]?
2. Попробовал поправить под себя оба твоих примера, но ничего не получается.

Попробую конкретизировать.
Есть "рыба" - 5-10 страниц обычного html. Нужно иметь возможность менять эту "рыбу", чтобы все изменения происходили и на сайтах клиентов (которые www.name.site.ru. они постоены на основе этой рыбы). Различия только в мелких деталях (типа email и телефона), которые и должны подставляться в зависимости от name.
Да, как ты и сказал, есть www.name.site.ru и он прописан как www.site.ru/name.

Сейчас приходится лазить по всей "рыбе" и менять там нужные вещи, после чего заливать её в www.site.ru/name и фактически терять над ней контроль, т.к. таких мини-сайтов на основе этой "рыбы" сделано очень много и во всех что-то менять очень муторно.

Повторюсь:
1. "рыба" в единственном экземпляре лежит где-то на сервере
2. Для посетителей все перенаправление прозрачно, т.е. в строке браузера он видит www.name.site.ru, а не www.site.ru/name

Ghost 05.07.2004 19:32

Если не пройдет $env{'http_host'}, можно анализировать $env{'server_name'} - он также тодержит имя хоста, а именно оно и нужно.

Я так понимаю, что
1. есть сервер site.ru, а все вызовы username.site.ru все равно фактически обращаются к нему (т.е. это как бы дополнительные имеа того же сервера, алиасы).
2. при обращении к username.site.ru/... должно загружаться содержимое /users/username/..., но не простое перенаправление, а на скрипт, который будет выводить страницу.

Настраиваем MOD_Rewrite:
Код:

RewriteRule ^(.*)\.html$ /index.php?url=$1 [NE]
которое будет перенаправлять, например vasja.site.ru/1/a.html на vasja.site.ru/index.php?url=1/a, при этом имя скрипта показываться не будет. Поскольку vasja.site.ru и site.ru это фактически один хост, файл index.php - один для всех и лежит в его корне. В этот скрипт передается параметр url - открываемая страница (обозначим $pagepath). Скрипт смотрит на запрос (ентот самый vasja.site.ru/1/a.html, отобаражаемый в адресоной строке браузера), выковыривает из него имя пользователя, т.е. "vasja" (обозначим $username). Потом скрипт открывает файл "/users/$username/$pagepath.html" (в нашем случае /users/vasja/1/a.html) и выводит его. Кажись, я все правильно понял...

Что обозначает параметр [NE] уже, честно говоря, не помню - выковырял строку из конфига своего сервера.

RaZEr 05.07.2004 19:58

NE - No Escape. В данном случае, думаю, не нужен.

Sinker 06.07.2004 13:25

Ghost
Спасибо. То, что нужно. (ну почти. пришлось доработать напильником :-) )
Вот только еще один вопрос
RewriteRule ^(.*)\.htm$ /users/index.php?url=$1 [NE] передаёт только название файла, а мне нужно в index.php получать еще и name из www.name.site.ru.
Т.е. из http://www.name.site.ru/file.ext передать в http://www.site.ru/users/index.php?file=file&name=name
Просто не силен я в ерегах...

Ghost 06.07.2004 14:07

Sinker
Передавать имя не надо. Его можно выковырять скриптом: сперва получаешь имя хоста из HTTP_HOST:
Код:

my $s = $ENV{'HTTP_HOST'};
потом вычленяешь из него имя юзера:
Код:

$s =~ s/(.+)\.site.ru(.*)/$1/;
$s =~ s/(.*)[\/:\.]([^\.]+)/$2/;

Теперь в переменной $s записано имя пользователя.
Эти примеры я написал для перла; как это будет в PHP не знаю, но, не думаю, что будет сильно отличаться.

Sinker 06.07.2004 15:30

Все. Спасибо. Сделал так:
Код:

RewriteRule ^(.*)\.htm$ /users/index.php?file=$1 [NE] //в .htaccess
Код:

if (preg_match ("/www\.(.*)\.site\.ru/i",$HTTP_X_FORWARDED_HOST,$match))
        {
            $name=$match[1];
            include ("$file.htm");
        }

Вроде, работает как надо. Спасибо всем.

Sinker 03.08.2004 11:23

Итак, по новой. Все работало, пока сайт не переехал на новый хостинг. И начались проблемы.
На новом месте поддомены лежат выше корня основного домена и такие правила не срабатывают. Т.е. если раньше поддомен www.name.site.ru фактически был папкой www.site.ru/name, то сейчас www.site.ru и www.name.site.ru находятся на одном уровне (а уже внутри них есть свои tmp, cgi-bin и www)
Подскажите, PLZ, как быть в этом случае?
ЗЫ. Если поможет, то хостинг .Masterhost.


Часовой пояс GMT +4, время: 04:22.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.