Forum Webscript.Ru

Программирование => Perl => Тема начата: hr1 от 24 Июня 2008, 11:11:19

Название: строка с условиями на perl
Отправлено: hr1 от 24 Июня 2008, 11:11:19
помогите написать оброботку строки с условиями для записи в .htaccess

имеется сайт например
site111.ru
и еще 4 доменных имени привязанных алиасом к нему:
site-111.ru
s111.ru
zite111.ru
site111.com

как прописать в .htaccess чтобы

1. все ссылки с второстепенными доменными именами 2 уровня переписывались на имя основного сайта
например: ( символ -> означает преобразование ссылки )
www.site-111.ru -> www.site111.ru
www.site111.com -> www.site111.ru
zite111.ru -> site111.ru или www.site111.ru
www.s111.ru/user/aa -> www.site111.ru/user/aa

site111.ru -> не преобразовывать
www.site111.ru -> не преобразовывать

2. сохраняя 1 условие перенаправлять все ссылки с доменом третего уровня на подкаталог с тем же именем
например:
123.site111.ru -> site111.ru/123
anna.site111.ru -> site111.ru/anna
v777g1.site111.ru -> site111.ru/v777g1

возможно v777g1.site111.ru/user/ss -> site111.ru/v777g1


выполняя условия обеих преобразований должно получится

zite111.ru -> site111.ru
www.zite111.ru -> www.site111.ru
www.zite111.ru/user/ss -> www.site111.ru/user/ss

222.site111.ru -> site111.ru/222
222.zite111.ru -> 222.site111.ru -> site111.ru/222
anton.zite111.ru/user/ss -> anton.site111.ru/user/ss -> site111.ru/user/ss

на данный момент использую в .htaccess


RewriteEngine on

RewriteCond %{HTTP_HOST} ^zite111.ru
RewriteRule ^(.*)$ http://www.site111.ru/$1 [R=301]

RewriteCond %{HTTP_HOST} ^site-111.ru
RewriteRule ^(.*)$ http://www.site111.ru/$1 [R=301]

RewriteCond %{HTTP_HOST} ^s111.ru
RewriteRule ^(.*)$ http://www.site111.ru/$1 [R=301]

RewriteCond %{HTTP_HOST} ^site111.com
RewriteRule ^(.*)$ http://www.site111.ru/$1 [R=301]

RewriteCond %{HTTP_HOST} ^123.site111.ru
RewriteRule ^(.*)$ http://site111.ru/123 [R=301]

со своей задачей пока справляется.
но мне нужно прописать правильные "условия"
нужна грамотная Perl строка с проверкой условий


Постараюсь описать алгоритм.
Я символически обозначил (на Perl языке это выглядит иначе):
%1 - строка домена 3 уровня
%2 - подкаталоги (все что следует после site111.ru/...)

1. Проверка HTTP_HOST
2. Если адрес %1.site111.ru/%2 перейти на пункт 4
3. Заменить ссылку на %1.site111.ru/%2
4. Если %1=""(пустой) или %1="www" перейти пункт 6
5. Заменить ссылку на site111.ru/%1
6. конец :)

В перл можно сделать выражение одной строкой (если не ошибаюсь)

ЗАДАЧКА ДЛЯ ПРОФЕССИОНАЛОВ!
Название: строка с условиями на perl
Отправлено: arto от 24 Июня 2008, 12:51:09
ПРОФЕССИОНАЛЫ ЗА РЕШЕНИЕ ЗАДАЧ ПОЛУЧААЮТ ДЕНЬГИ!
Название: строка с условиями на perl
Отправлено: hr1 от 24 Июня 2008, 14:14:01
arto > Я С ВАМИ ПОЛНОСТЬЮ СОГЛАСЕН!

Все профессионалы должны хорошо оплачиваться и надеюсь так и происходит! За что я очень рад!
Название: http://perldoc.perl.org/perlre.html
Отправлено: hr1 от 25 Июня 2008, 12:15:21
http://perldoc.perl.org/perlre.html

вот здесь нашел описания как на перле преобразовывать строку
но в PERL е я не силен и разобраться пока не смог, может кто подскажет,
Название: строка с условиями на perl
Отправлено: arto от 25 Июня 2008, 13:11:51
у вас пункт 3 непонятен.
Название: строка с условиями на perl
Отправлено: hr1 от 25 Июня 2008, 15:51:09
to arto

пункт 2 и 3

проверяется строка ссылки (запроса страницы)
если домен первого уровня не совпадает с с названием основного сайта, то в строке меняется ТОЛЬКО название сайта

например
www.site-111.ru -> www.site111.ru
www.site111.com -> www.site111.ru
zite111.ru -> site111.ru или www.site111.ru
www.s111.ru/user/aa -> www.site111.ru/user/aa

где site111.ru - основной сайт
а zite111.ru , s111.ru, site111.com - алиасы, то есть по этим названиям люди все равно попадают на сайт site111.ru
К сожалению в строке браузера остается именно то что они набрали...
вот и нужен редирект на основной сайт site111.ru что и пытаюсь сделать в алгоритме в пунктах 2 и 3
Название: строка с условиями на perl
Отправлено: Yaroslav от 30 Июня 2008, 01:52:06
Цитировать
hr1:
1. Проверка HTTP_HOST
2. Если адрес %1.site111.ru/%2 перейти на пункт 4
3. Заменить ссылку на %1.site111.ru/%2
4. Если %1=""(пустой) или %1="www" перейти пункт 6
5. Заменить ссылку на site111.ru/%1
6. конец :)

надеюсь мой пример тебе поможет:-)
$host="www.anton.site111.ru/user/aa";
$host =~ s/www.//;
if ($host =~ /(.*\\.)?site111.ru(.*)?/) {
  if ($1) { print $1; }
  if ($2) { print $2; }
}
Название: строка с условиями на perl
Отправлено: hr1 от 30 Июня 2008, 16:15:29
не работает
а как все это можно одной строкой написать?
Название: строка с условиями на perl
Отправлено: Yaroslav от 30 Июня 2008, 20:55:17
Цитировать
hr1:
не работает

оно и не будет работать в .htaccess :-)
там Перл не уместен :)
Название: строка с условиями на perl
Отправлено: hr1 от 01 Июля 2008, 13:55:02
зато там уместно "выражение" на перл :)
Perl regular expressions
http://perldoc.perl.org/perlre.html
на основе которого и производится проверка строки и замещение символов
Название: строка с условиями на perl
Отправлено: Yaroslav от 01 Июля 2008, 15:37:35
значит так, начнем, возможно кто то дополнит :-)
1. функция RewriteCond не позволяет использовать регулярные выражения, кроме как крышки. которая в свою очередь является (по правилам Перл) начала строчки, поэтому:
RewriteCond %{HTTP_HOST} site-111.ru [OR]
RewriteCond %{HTTP_HOST} s111.ru [OR]
RewriteCond %{HTTP_HOST} zite111.ru [OR]
RewriteCond %{HTTP_HOST} site111.com
RewriteRule ^(.*)$ http://www.site111.ru/$1 [R=301]

Таким образом с адреса http://www.anton.site111.ru, самого Антона вытащить не удается...
Зато все остальное удачно подставляется в конце :))
Название: строка с условиями на perl
Отправлено: Yaroslav от 01 Июля 2008, 15:47:06
Цитировать
Yaroslav:
функция RewriteCond не позволяет использовать регулярные выражения

забираю свои слова обратно! вроде что то нарыл
Название: строка с условиями на perl
Отправлено: Yaroslav от 01 Июля 2008, 16:00:34
Тут была полная бредятена, вместо нее

RewriteCond %{HTTP_HOST} ^www\\.(.*)\\..*111.ru\\/(.*) [OR]
RewriteCond %{HTTP_HOST} ^[url]www..*111.ru\\/[/url](.*) [OR]
RewriteCond %{HTTP_HOST} ^www\\.(.*)\\..*111.com\\/(.*) [OR]
RewriteCond %{HTTP_HOST} ^[url]www..*111.com\\/[/url](.*)
RewriteRule ^(.*)$ [url]http://www.site111.ru/[/url]$1/$2 [R=301]

интересно заработает ли :-))
Название: Я ЭТО СДЕЛАЛ!!!
Отправлено: hr1 от 02 Июля 2008, 17:51:13
После долгих экспериментов и изучения документации
Я ЭТО СДЕЛАЛ!!!

Итак готовый "скрипт" для .htaccess в студию!!!
 
[SIZE=3][COLOR=green]

RewriteEngine on

RewriteCond %{HTTP_HOST} !^site111.ru
RewriteRule  ^(.*)$ - [C]

RewriteCond %{HTTP_HOST} ^(www\\.site111\\.ru)|^(www\\.zite111\\.ru)|^(zite111\\.ru)|^(www\\.site-111\\.ru)|^(site-111\\.ru)|^(www\\.s111\\.ru)|^(s111\\.ru)|^(www\\.site111\\.com)|^(site111\\.com)
RewriteRule ^(.*)$ http://site111.ru/$1 [R=301,L]

RewriteCond %{HTTP_HOST} ^www\\.(.+)\\.site111\\.ru [OR]
RewriteCond %{HTTP_HOST} ^(.+)\\.site111\\.ru [OR]
RewriteCond %{HTTP_HOST} ^www\\.(.+)\\.zite111\\.ru [OR]
RewriteCond %{HTTP_HOST} ^(.+)\\.zite111\\.ru [OR]
RewriteCond %{HTTP_HOST} ^www\\.(.+)\\.site-111\\.ru [OR]
RewriteCond %{HTTP_HOST} ^(.+)\\.site-111\\.ru [OR]
RewriteCond %{HTTP_HOST} ^www\\.(.+)\\.s111\\.ru [OR]
RewriteCond %{HTTP_HOST} ^(.+)\\.s111\\.ru [OR]
RewriteCond %{HTTP_HOST} ^www\\.(.+)\\.s111\\.com [OR]
RewriteCond %{HTTP_HOST} ^(.+)\\.site111\\.com
RewriteRule ^(.*)$ http://site111.ru/%1/$1 [R=301,L]

[/COLOR][/SIZE]


Что происходит?
в первом условии
если url= http://site111.ru/... сразу выходим

во втором условии
если нет домена третьего уровня или там cтрока www
переписываем все на http://site111.ru/...

пример:
s111.ru ->site111.ru
www.zite111.ru/33 -> site111.ru/33
www.site111.ru -> site111.ru


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

пример:
go.site111.ru -> site111.ru/go
www.yes.zite111.ru -> site111.ru/yes
www.rock.s111.ru/user/de -> site111.ru/rock/user/de

Надеюсь кому то это еще пригодится :)