Автор Тема: строка с условиями на perl  (Прочитано 8341 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн hr1

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 13
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
строка с условиями на perl
« : 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

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
строка с условиями на perl
« Ответ #1 : 24 Июня 2008, 12:51:09 »
ПРОФЕССИОНАЛЫ ЗА РЕШЕНИЕ ЗАДАЧ ПОЛУЧААЮТ ДЕНЬГИ!

Оффлайн hr1

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 13
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
строка с условиями на perl
« Ответ #2 : 24 Июня 2008, 14:14:01 »
arto > Я С ВАМИ ПОЛНОСТЬЮ СОГЛАСЕН!

Все профессионалы должны хорошо оплачиваться и надеюсь так и происходит! За что я очень рад!

Оффлайн hr1

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 13
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
http://perldoc.perl.org/perlre.html
« Ответ #3 : 25 Июня 2008, 12:15:21 »
http://perldoc.perl.org/perlre.html

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

Оффлайн arto

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
строка с условиями на perl
« Ответ #4 : 25 Июня 2008, 13:11:51 »
у вас пункт 3 непонятен.

Оффлайн hr1

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 13
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
строка с условиями на perl
« Ответ #5 : 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

Оффлайн Yaroslav

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 323
  • +0/-0
  • 0
    • Просмотр профиля
строка с условиями на perl
« Ответ #6 : 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; }
}
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили \"Титаник\".

Оффлайн hr1

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 13
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
строка с условиями на perl
« Ответ #7 : 30 Июня 2008, 16:15:29 »
не работает
а как все это можно одной строкой написать?

Оффлайн Yaroslav

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 323
  • +0/-0
  • 0
    • Просмотр профиля
строка с условиями на perl
« Ответ #8 : 30 Июня 2008, 20:55:17 »
Цитировать
hr1:
не работает

оно и не будет работать в .htaccess :-)
там Перл не уместен :)
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили \"Титаник\".

Оффлайн hr1

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 13
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
строка с условиями на perl
« Ответ #9 : 01 Июля 2008, 13:55:02 »
зато там уместно "выражение" на перл :)
Perl regular expressions
http://perldoc.perl.org/perlre.html
на основе которого и производится проверка строки и замещение символов

Оффлайн Yaroslav

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 323
  • +0/-0
  • 0
    • Просмотр профиля
строка с условиями на perl
« Ответ #10 : 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, самого Антона вытащить не удается...
Зато все остальное удачно подставляется в конце :))
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили \"Титаник\".

Оффлайн Yaroslav

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 323
  • +0/-0
  • 0
    • Просмотр профиля
строка с условиями на perl
« Ответ #11 : 01 Июля 2008, 15:47:06 »
Цитировать
Yaroslav:
функция RewriteCond не позволяет использовать регулярные выражения

забираю свои слова обратно! вроде что то нарыл
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили \"Титаник\".

Оффлайн Yaroslav

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 323
  • +0/-0
  • 0
    • Просмотр профиля
строка с условиями на perl
« Ответ #12 : 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]

интересно заработает ли :-))
« Последнее редактирование: 01 Июля 2008, 16:41:07 от Yaroslav »
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили \"Титаник\".

Оффлайн hr1

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 13
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Я ЭТО СДЕЛАЛ!!!
« Ответ #13 : 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

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

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28