Forum Webscript.Ru
Программирование => 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. конец :)
В перл можно сделать выражение одной строкой (если не ошибаюсь)
ЗАДАЧКА ДЛЯ ПРОФЕССИОНАЛОВ!
-
ПРОФЕССИОНАЛЫ ЗА РЕШЕНИЕ ЗАДАЧ ПОЛУЧААЮТ ДЕНЬГИ!
-
arto > Я С ВАМИ ПОЛНОСТЬЮ СОГЛАСЕН!
Все профессионалы должны хорошо оплачиваться и надеюсь так и происходит! За что я очень рад!
-
http://perldoc.perl.org/perlre.html
вот здесь нашел описания как на перле преобразовывать строку
но в PERL е я не силен и разобраться пока не смог, может кто подскажет,
-
у вас пункт 3 непонятен.
-
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
-
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; }
}
-
не работает
а как все это можно одной строкой написать?
-
hr1:
не работает
оно и не будет работать в .htaccess :-)
там Перл не уместен :)
-
зато там уместно "выражение" на перл :)
Perl regular expressions
http://perldoc.perl.org/perlre.html
на основе которого и производится проверка строки и замещение символов
-
значит так, начнем, возможно кто то дополнит :-)
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, самого Антона вытащить не удается...
Зато все остальное удачно подставляется в конце :))
-
Yaroslav:
функция RewriteCond не позволяет использовать регулярные выражения
забираю свои слова обратно! вроде что то нарыл
-
Тут была полная бредятена, вместо нее
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]
интересно заработает ли :-))
-
После долгих экспериментов и изучения документации
Я ЭТО СДЕЛАЛ!!!
Итак готовый "скрипт" для .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
Надеюсь кому то это еще пригодится :)