Войти

Показать полную графическую версию : Ошибка перенаправления в субдоменах


Страниц : [1] 2

blacks2
15-08-2009, 09:07
Ищутся добрые люди готовые помочь!

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
если кукис отсылается с каждым запросом, то у вас вечный редирект будет... нужно добавить дополнительную проверку (нпр по %{HTTP_HOST}), и уточнить, на какой домен ставится кукис (может на все субдомены)...
реферер может и не отсылаться вовсе (регулируется в браузере), впрочем, как и кукисы...
RewriteCond %{HTTP_HOST} (www\.)? sub2\. site.\spb\.ru$
RewriteCond %{REQUEST_URI} !^(/)? sub2/ »
уберите лишние пробелы из условий, и экранируйте спец-символы

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

Спасибо!

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

уберите лишние пробелы из условий, и экранируйте спец-символы
пробелы появились случайно во время поста.
в оригинале их нет. пост исправлю.

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

Sham
17-08-2009, 10:21
т.е. если в наличии кука 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
Спасибо. Сегодня ночью как проснусь проверю код.


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


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

Sham
17-08-2009, 11:16
в этой строке не должно стоять разелителя между 1 и два ? »
это символьный класс
ставятся на корень сайта »
кукисы на домен ставятся... и браузер при запросе на конкретный домен шлет те кукисы, которые записаны на этот домен/субдомены (не важно какого уровня).
разберитесь с матчастью...

blacks2
17-08-2009, 14:26
Цитата blacks2:
в этой строке не должно стоять разелителя между 1 и два ? »
это символьный класс

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

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

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

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

Sham
17-08-2009, 14:55
Тоесть в случае с именами а не цифрами всетаки разделитель необходимо поставить? »
ну да, типа !^(www\.)?(en|ru)\.site\.spb\.ru$
если нужно редиректить в зависимости от языка браузера, так и скажите...

blacks2
17-08-2009, 22:40
Српасибо.

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

Эх... если бы :(
Для редиректа в зависимости от языка браузера есть вроде как специальная директива
Даже "калькулятор 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
Пользователь один раз зайдет с 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
в этом случае кукис нужно ставить на домен site.spb.ru, иначе по дефолту запишется на ru.site.spb.ru и ваш вариант не прокатит....
Да. Кукисы выставляются с помощью METА в ru.site.spb.ru/index.html



кукис можно через флаг в правиле поставить...
Мне знаком только такой способ:
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
остается javascript: вешать на ссылки перехода ru\en события onclick, по которым ставить кукис...

blacks2
18-08-2009, 01:29
остается 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
там где с проверкой домена (как страховка от зацикливания), а про регулярное выражение с доменом вам лучше знать...
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
Огромное спасибо!!!! :yahoo:
(жаль нет кнопочки спасибо, а "полезное сообщение" столь мала ;)

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

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

blacks2
19-08-2009, 04:21
Пробовал добавить условие:

с
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
RewriteRule . http://%1.site.spb.ru/ [R,QSA] »
знак точка - любой символ, и если пусто, то не сработает. Надо добавить "?"...
RewriteRule .? http://%1.site.spb.ru/ [R,QSA]
RewriteCond %{HTTP_HOST} ^www\.%1.\site\.spb\.ru\ [NC] »
не понятно, откуда %1 в условии и правиле, ибо если подмаски нет, то пусто... + лишний экранирующий слеш в конце (ошибка)..
[R=301,QSA,] »
лишняя запятая где флаги

blacks2
20-08-2009, 01:13
знак точка - любой символ, и если пусто, то не сработает. Надо добавить "?"... »
Огромное спасибо!

# 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
RewriteCond %{HTTP_HOST} ^www\.(ru|en)\.site\.spb\.ru [NC]
RewriteRule ^(.*)$ http://%1.site.spb.ru/$1 [R,L]




© OSzone.net 2001-2012