Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   Ошибка перенаправления в субдоменах (http://forum.oszone.net/showthread.php?t=148033)

blacks2 15-08-2009 09:07 1194012

Ошибка перенаправления в субдоменах
 
Ищутся добрые люди готовые помочь!

3и или 4е сутки не могу собрать следу штуку :( :


ЗАДАЧА:
При заходе на site.spb.ru по установленным кукам посетитель перенаправлялся
на один из субдоменов и там оставался. Позже добавить на весь сайт редиект
«с www» на «без www».


ПОДРОБНЕЙ:
Пользователь заходит на site.spb.ru
В корне сайта лежит htaccess

Код:

RewriteEngine On
RewriteBase /

# субдомены – построены по правилам моего хостера
        RewriteCond %{HTTP_HOST} (www\.)?sub1\.site.\spb\.ru$
        RewriteCond %{REQUEST_URI} !^(/)? sub1/
        RewriteRule ^(.*)$ sub1/$1

        RewriteCond %{HTTP_HOST} (www\.)? sub2\.site.\spb\.ru$
        RewriteCond %{REQUEST_URI} !^(/)? sub2/
        RewriteRule ^(.*)$ sub2/$1

# прочитать значение куки и перенаправить на субдомен указанный в куки
        RewriteCond %{HTTP_COOKIE} setting=([^;]+) [NC]
        RewriteRule ^(.*)$ http://%1.site.spb.ru/ [R=302,QSA,L]


1. Если куки установлены то в зависимости от них идет перенаправление на
sub1.site.spb.ru или sub2.site.spb.ru

2. Если куков нет то ждется переход от пользователя на sub1.site.spb.ru или sub2.site.spb.ru
Где и ставятся куки.



ПРОБЛЕМА:
Редирект по куки на на субдомены идет но с ошибкой:

«Firefox определил, что сервер перенаправляет запрос на этот адрес таким образом, что он никогда не завершится.»
«Эта проблема может возникать при отключении или запрещении принятия cookies.»



Все вышесказанное работает на
виртуальном хостинге, PHP не используется, JavaScript тоже, остальные скрипты тоже
- Только META теги, htaccess, html !



Саппорт хостинга предложил что-то непонятное но вроде правдивое:

«Объясняю на примере
Итак, посетитель заходит на site.spb.ru, оттуда идет на страницу /sub1
Сейчас по умолчаню ему выдается cookie, а надо бы проверить реферер
Если реферрер НЕ sub1.site.spb.ru, то выдаем cookie и редиректим на поддомен

Поскольку посетитель новый, его перенаправили на поддомен
Итак, мы попадаем на ту же самую страницу. Но повторного редиректа не происходит,
поскольку этому мешает реферрер.»


= Пробовал закрывать по рефералу - не сработало :(
Код:

RewriteCond %{HTTP_REFERER} ^http://(www\.)?en\.site\.spb\.ru/index.html$ [NC,OR]


Кто может, помогите решением!
Если необходимо могу приаттачить в zip весь пример.

Помогите пожалуйста!

Sham 16-08-2009 12:58 1194734

если кукис отсылается с каждым запросом, то у вас вечный редирект будет... нужно добавить дополнительную проверку (нпр по %{HTTP_HOST}), и уточнить, на какой домен ставится кукис (может на все субдомены)...
реферер может и не отсылаться вовсе (регулируется в браузере), впрочем, как и кукисы...
Цитата:

Цитата blacks2
RewriteCond %{HTTP_HOST} (www\.)? sub2\. site.\spb\.ru$
RewriteCond %{REQUEST_URI} !^(/)? sub2/ »

уберите лишние пробелы из условий, и экранируйте спец-символы

blacks2 16-08-2009 18:48 1194954

Цитата:

Цитата Sham
если кукис отсылается с каждым запросом, то у вас вечный редирект будет... нужно добавить дополнительную проверку (нпр по %{HTTP_HOST}), и уточнить, на какой домен ставится кукис (может на все субдомены)...
реферер может и не отсылаться вовсе (регулируется в браузере), впрочем, как и кукисы...

Спасибо!

Кукис ставится на только на корень сайта
Ставится из субдоменов
Подскажите пожалуйста код для проверки
(пробавал по совету одного хорошего человека с другого форума поставить
RewriteCond %{HTTP_HOST} !^(en|ru) [NC] но не помогло :(
)

Цитата:

Цитата Sham
уберите лишние пробелы из условий, и экранируйте спец-символы

пробелы появились случайно во время поста.
в оригинале их нет. пост исправлю.

Что еще необходимо экранировать?

Sham 17-08-2009 10:21 1195430

т.е. если в наличии кука setting и НЕ субдомен sub1-2 то редиректим на субдомен 4 уровня

Код:

RewriteCond %{HTTP_COOKIE} setting\=([^\;]+) [NC]
RewriteCond %{HTTP_HOST} !^(www\.)?sub[12]\.site\.spb\.ru$
RewriteRule . http://%1.site.spb.ru/ [R,QSA,L]

или если нужно условие, что при наличии куки setting хост должен быть site.spb.ru (без sub1-2)

Код:

RewriteCond %{HTTP_COOKIE} setting\=([^\;]+) [NC]
RewriteCond %{HTTP_HOST} ^(www\.)?site\.spb\.ru$
RewriteRule . http://%1.site.spb.ru/ [R,QSA,L]

если куки не шлются, то редиректа не будет

вообще тут использование куков непонятно (в зависимости от чего ставятся куки, и на домен какого уровня)

blacks2 17-08-2009 11:04 1195464

Спасибо. Сегодня ночью как проснусь проверю код.


Код:

RewriteCond %{HTTP_HOST} !^(www\.)?sub[12]\.site\.spb\.ru$
- в этой строке не должно стоять разелителя между 1 и два ?
- навроде (en|ru)


Цитата:

Цитата Sham
вообще тут использование куков непонятно (в зависимости от чего ставятся куки, и на домен какого уровня)

- куки ставятся в зависимости захода в тот или иной sub1 / sub2
- ставятся на корень сайта - там где лежит htaccess который и перенаправляет...

Sham 17-08-2009 11:16 1195483

Цитата:

Цитата blacks2
в этой строке не должно стоять разелителя между 1 и два ? »

это символьный класс
Цитата:

Цитата blacks2
ставятся на корень сайта »

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

blacks2 17-08-2009 14:26 1195639

Цитата:

Цитата Sham
Цитата blacks2:
в этой строке не должно стоять разелителя между 1 и два ? »
это символьный класс

Тоесть в случае с именами а не цифрами всетаки разделитель необходимо поставить?

Цитата:

Цитата Sham
Цитата blacks2:
кукисы на домен ставятся... и браузер при запросе на конкретный домен шлет те кукисы, которые записаны на этот домен/субдомены (не важно какого уровня).
разберитесь с матчастью...

При работе на суб папки вида site.spb.ru/sub2 все хорошо работает
А вот на субдомены нет :(

С матчастью воевать уже не готов - достала - 4или 5тые сутки.

Sham 17-08-2009 14:55 1195660

Цитата:

Цитата blacks2
Тоесть в случае с именами а не цифрами всетаки разделитель необходимо поставить? »

ну да, типа
Код:

!^(www\.)?(en|ru)\.site\.spb\.ru$
если нужно редиректить в зависимости от языка браузера, так и скажите...

blacks2 17-08-2009 22:40 1196115

Српасибо.

Цитата:

Цитата Sham
если нужно редиректить в зависимости от языка браузера, так и скажите...

Эх... если бы :(
Для редиректа в зависимости от языка браузера есть вроде как специальная директива
Даже "калькулятор htaccess" в нете видел который строет такое перенаправление.
2 или 3 строки.

Задача в том что
Пользователь один раз зайдет с site.spb.ru на ru.site.spb.ru и ему запишутся куки
И в следующий раз заходя на site.spb.ru будет перенаправление по куки на ru.site.spb.ru

Только что-то заело :drug:
Буду пробовать ваше предложение сегодня ночью :tomato2:

Sham 17-08-2009 23:38 1196162

Цитата:

Цитата blacks2
Пользователь один раз зайдет с site.spb.ru на ru.site.spb.ru и ему запишутся куки
И в следующий раз заходя на site.spb.ru будет перенаправление по куки на ru.site.spb.ru »

в этом случае кукис нужно ставить на домен site.spb.ru, иначе по дефолту запишется на ru.site.spb.ru и ваш вариант не прокатит....

кукис можно через флаг в правиле поставить...

blacks2 18-08-2009 00:28 1196195

Цитата:

Цитата Sham
в этом случае кукис нужно ставить на домен site.spb.ru, иначе по дефолту запишется на ru.site.spb.ru и ваш вариант не прокатит....

Да. Кукисы выставляются с помощью METА в ru.site.spb.ru/index.html



Цитата:

Цитата Sham
кукис можно через флаг в правиле поставить...

Мне знаком только такой способ:
Код:

RewriteRule ^(.*)(ru|en)/$ - [co=lang:$2:.site.spb.ru:7200:/]
но н не работает на моем хостинге:
Цитата:

Тут даже дело не в nginx, а в версии Apache. Флаг cookie доступен в Apache 2.0.40
и более поздних. У нас 1-я ветка Apache (1.3.41).
:(


Может еще какой есть... или я не понял о чем вы ;)?

Sham 18-08-2009 01:05 1196220

остается javascript: вешать на ссылки перехода ru\en события onclick, по которым ставить кукис...

blacks2 18-08-2009 01:29 1196230

Цитата:

Цитата Sham
остается javascript: вешать на ссылки перехода ru\en события onclick, по которым ставить кукис... »

Нет. :) Метой все ок получается.

Вот странная штука: все нижеследующие примеры рабочие
Может хочтер что-то вписал без моего ведома.. может я по недосыпу навалял дурака.

Посмотрите пожалуйста - на каком варианте лучше остановить выбор?

Код:

RewriteEngine On
RewriteBase /

# PETERHOST 2009 + MY
        RewriteCond %{HTTP_HOST} (www\.)?en\.site.\spb\.ru$
        RewriteCond %{REQUEST_URI} !^(/)?en/
        RewriteRule ^(.*)$ en/$1

        RewriteCond %{HTTP_HOST} (www\.)?ru\.site.\spb\.ru$
        RewriteCond %{REQUEST_URI} !^(/)?ru/
        RewriteRule ^(.*)$ ru/$1


# ANTICHAT v1
#        RewriteCond %{HTTP_COOKIE} lang=([^;]+) [NC]
#        RewriteCond %{HTTP_HOST} !^(en|ru) [NC]
#        RewriteRule ^(.*)$ http://%1.site.spb.ru/ [R=302,QSA,L]


# OS zone v3
#        RewriteCond %{HTTP_COOKIE} lang\=([^\;]+) [NC]
#        RewriteCond %{HTTP_HOST} !^(www\.)?(ru|en)\.site\.spb\.ru$
#        RewriteRule . http://%1.site.spb.ru/ [R,QSA,L]


# My v1
#        RewriteCond %{HTTP_COOKIE} lang=([^;]+) [NC]
#        RewriteRule ^$ http://%1.site.spb.ru/ [R=302,QSA,L]


# My v2
#        RewriteCond %{HTTP_COOKIE} lang=([^;]+) [NC]
#        RewriteRule ^$ http://%1.site.spb.ru/ [R,QSA,L]

Спасибо.

Sham 18-08-2009 22:13 1197010

там где с проверкой домена (как страховка от зацикливания), а про регулярное выражение с доменом вам лучше знать...
Код:

RewriteCond %{HTTP_COOKIE} lang\=([^\;]+) [NC]
RewriteCond %{HTTP_HOST} !^(www\.)?(ru|en)\.site\.spb\.ru$ [NC]
RewriteRule .? http://%1.site.spb.ru/ [R,QSA,L]

просто в первом варианте лишняя подмаска, которая не используется, и лишний квантификатор * (достаточно ".?", ибо иначе для проверки захватывается вся строка, что непроизводительно, но не критично).

blacks2 18-08-2009 23:14 1197059

Огромное спасибо!!!! :yahoo:
(жаль нет кнопочки спасибо, а "полезное сообщение" столь мала ;)

Цитата:

Цитата Sham
а про регулярное выражение с доменом вам лучше знать... »

Не пойму о чем Вы?

Sham 18-08-2009 23:21 1197066

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

blacks2 19-08-2009 04:21 1197172

Пробовал добавить условие:

с
www.sub1.site.spb.ru (длинновато... но думаю пригодится для субдоменов)
на
sub1.site.spb.ru
- тобешь убираем www

Попробовал два нижеследующих вариант (min www v2 и min www v2)
Но они не сработали :(
Подскажите пожалуйста как можно подправить?

Код:

# OS zone v3
        RewriteCond %{HTTP_COOKIE} lang\=([^\;]+) [NC]
        RewriteCond %{HTTP_HOST} !^(www\.)?(sub1|sub2)\.site\.spb\.ru$
        RewriteRule . http://%1.site.spb.ru/ [R,QSA]

# min www v1
        RewriteCond %{HTTP_HOST} ^www\.%1.\site\.spb\.ru\ [NC]
        RewriteRule (.*) http://%1.site.spb.ru/$1 [R=301,L]

# min www v2
#        RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
#        RewriteRule ^(.*)$ http://%1/$1 [R=301,QSA,]

Спасибо

Sham 19-08-2009 23:15 1197854

Цитата:

Цитата blacks2
RewriteRule . http://%1.site.spb.ru/ [R,QSA] »

знак точка - любой символ, и если пусто, то не сработает. Надо добавить "?"...
Код:

RewriteRule .? http://%1.site.spb.ru/ [R,QSA]
Цитата:

Цитата blacks2
RewriteCond %{HTTP_HOST} ^www\.%1.\site\.spb\.ru\ [NC] »

не понятно, откуда %1 в условии и правиле, ибо если подмаски нет, то пусто... + лишний экранирующий слеш в конце (ошибка)..
Цитата:

Цитата blacks2
[R=301,QSA,] »

лишняя запятая где флаги

blacks2 20-08-2009 01:13 1197947

Цитата:

Цитата Sham
знак точка - любой символ, и если пусто, то не сработает. Надо добавить "?"... »

Огромное спасибо!

Код:

# OS zone
        RewriteCond %{HTTP_COOKIE} lang\=([^\;]+) [NC]
        RewriteCond %{HTTP_HOST} !^(www\.)?(ru|en)\.justplan\.spb\.ru$
        RewriteRule .? http://%1.justplan.spb.ru/ [R,QSA]

# убираем www
        RewriteCond %{HTTP_HOST} ^www\?(ru|en)\site\.spb\.ru [NC] »
        RewriteRule (.*) http://(ru|en).justplan.spb.ru/$1 [R=301,L]

Смею предположить методом "анализа и тыка" что последние две строки наверно должны
выглядеть так?

Sham 20-08-2009 03:18 1198009

Код:

RewriteCond %{HTTP_HOST} ^www\.(ru|en)\.site\.spb\.ru [NC]
RewriteRule ^(.*)$ http://%1.site.spb.ru/$1 [R,L]


blacks2 20-08-2009 06:32 1198030

Код:

        RewriteCond %{HTTP_HOST} ^www\.(ru|en)\.site\.spb\.ru [NC]
        RewriteRule ^(.*)$ http://%1.site.spb.ru/$1 [R,L]

При заходе на
http://www.ru.site.spb.ru/
идет переход на
http://ru.justplan.spb.ru/ru//

Удалил в второй строке /$1 переход идет на http://ru.justplan.spb.ru/ - как и нужно...

Но мне кажется или нет что /$1 удалять неправильно?

Sham 20-08-2009 13:24 1198282

$1 - это содержимое первой подмаски правила (что в скобках). если подмаски не нужно, то достаточно ".?" и без $1

blacks2 20-08-2009 14:48 1198380

Цитата:

Цитата Sham
$1 - это содержимое первой подмаски правила (что в скобках). если подмаски не нужно, то достаточно ".?" и без $1 »

Нет подмаска важна :)
Примеров без под маски много - нашел бы.
Спасибо что помогли, подсказали с подмаской!
Получается последнее /$1 или точнее $1 можно удалить?

Sham 20-08-2009 15:40 1198435

подмаска из условия - это %1, а $1 - из текущего правила... вам виднее, что удалять...

blacks2 21-08-2009 00:31 1198903

Цитата:

Цитата Sham
подмаска из условия - это %1, а $1 - из текущего правила... вам виднее, что удалять... »

Спасибо.
Буду тестировать.

blacks2 24-08-2009 17:58 1202079

Вложений: 1
В продолжение тестирования появился вопрос:

В какой последовательности лучше выставлять следующие директивы?
:

Не будет ли проблем с такой структурой?
- боюсь мало ли что-то в директивах пересечется и потом боком выйдет


# 01 SUBDOMEN REDIRECT
перенаправление из site.com/sub1/ в sub1.site.com

# 02 COOKIE
если есть куки перенаправление в sub1.site.com или sub2.site.com

# 03 Accept-Language
перенаправление в зависимости от языка браузера

# 04 NO-WWW
удаление www перед доменами и субдоменами


Полную версию приложил в аттаче (20-25строк)

Спасибо.

Sham 25-08-2009 03:17 1202395

01 имхо лучше в конец, ибо самые первые дб внешние редиректы R... (остальное по сути не редиректы а перезапись урла url rewrite)...

blacks2 25-08-2009 03:50 1202403

Цитата:

Цитата Sham
дб внешние редиректы R. »

извините меня но я не понял что значит "..первые дб внешние.."?

Sham 25-08-2009 04:38 1202411

первыми правилами лучше ставить внешние редиректы (где флаг R или полный урл в правиле)

blacks2 26-08-2009 03:25 1203366

Один из последних вопросов :/
В конце концов получилось подобное:

Код:

# COOKIE
        RewriteCond %{HTTP_COOKIE} lang\=([^\;]+) [NC]
        RewriteCond %{HTTP_HOST} !^(www\.)?(ru|en)\.site\.ru$
        RewriteRule .? http://%1.site.ru/ [R,QSA]

# Accept-Language

        RewriteCond %{HTTP:Accept-Language} ^ru [NC]
        RewriteRule ^$ http://ru.site.ru/ [L,R=301]

        RewriteCond %{HTTP:Accept-Language} ^en [NC]
        RewriteRule ^$ http://en.site.ru/ [L,R=301]

        #For every other language (including English :)) use English
        RewriteRule ^$ http://site.ru/ [L,R=301]

Задумался вот над чем:
1. опятьже стоит ли ставить такую последовательность? - но это не главный...
2. подумываю - не будет ли правильно поставить в данный код некий переключатель который бы:
куки есть - Accept-Language не читаем
куов нет - Accept-Language читаем

- стоит такое ставить или все нормально должно работать и так?

Спасибо.

Sham 26-08-2009 04:26 1203373

и при запросе на http://site.ru/ будет вечный цикл (последнее правило без условия)...
Цитата:

Цитата blacks2
RewriteRule ^$ »

^$ сработает только для индексных запросов (только домен), поэтому лучше .?
Порядок не важен... если уж расставлять, то на основе вероятности (первым ставить наиболее вероятное)...

blacks2 26-08-2009 04:35 1203377

Цитата:

Цитата Sham
Порядок не важен... если уж расставлять, то на основе вероятности (первым ставить наиболее вероятное)... »

Спасибо :) !

Код:

        #For every other language (including English :)) use English
        RewriteRule ^$ http://site.ru/ [L,R=301]

Думаю может вообще без нее обойтись - будет просто index.html из корня открыт и все.
Так же ничего страшно не будет :) ?


В будущем когда хостинг сменю думаю GeoIP прикрутить


Время: 21:48.

Время: 21:48.
© OSzone.net 2001-