Автоматическая переадресация по ip адресу

Статус
В этой теме нельзя размещать новые ответы.

r0nin

Постоялец
Регистрация
12 Апр 2010
Сообщения
78
Реакции
4
Приветы.
Стоит wordpress. Хотелось бы узнать как сделать так чтоб когда пользователь заходил на сайт он автоматически редиректился на другой сайт или поддомен той страны откуда он зашёл.
Т.е. у сайта есть несколько клонов например в других доменных зонах - и вот когда заходят с Росси редиректит на *.ru с Украины на *.ua и т.д.
Так например в гугле:)
 
Приветы.
Стоит wordpress. Хотелось бы узнать как сделать так чтоб когда пользователь заходил на сайт он автоматически редиректился на другой сайт или поддомен той страны откуда он зашёл.
Т.е. у сайта есть несколько клонов например в других доменных зонах - и вот когда заходят с Росси редиректит на *.ru с Украины на *.ua и т.д.
Так например в гугле:)

Пропишите переадресацию используя Б.Д Maxmind.

Бесплатная 99,5% точности, платная 99,8%.
Обновлять нужно раз в месяц.
Если сложно разобраться, могу выложить свое решение, но попозже. Сейчас физически не могу.
 
Каким образом надо прописывать переадресацию.
Насколько я понял можно установить на Апач или через Пхп.
В общем можно сделать разными методами, например по языку браузера и т.п.
Лично я прописал по IP, и считаю что это наиболее лучший и точный вариант.
Вот мое решение:

Данный метод я писал для поддоменов, то есть в моем случае это index.php в корне, который производит переадресацию на поддомены типа ru.site.com, ua.site.com и так далее. Можно применить и к сайтам в папках типа site.com/ru, site.com/ua и подобным. То есть сайт в данном случае расположен не в корневой директории.
Если же сайт расположен в корневой директории, и таких сайтов несколько (по колличеству стран), то необходимо файл назвать не index.php, а любым другим именем, например redirect.php и прописать в .htaccess в качестве индексного файла redirect.php.
Для этого в самом верху .htaccess добавим инструкцию:
А в файле переадресации к адресам сайтов добавим тот файл, который является индексным файлом сайта, например index.php (если этого не сделать, будет редиректить на редирект бесконечно:(

В самом файле можно добавить любое колличество сайтов для переадресации по странам.
Все файлы должны лежать в корне, в противном случае необходимо прописать переадресацию на папку с этими файлами. Допустим файлы лежат в папке "redirect" и имя php-файла index.php. Создаем в корне redirect.php с переадресацией на папку "redirect", в которой происходит обработка IP посетителей:
В этом случае .htaccess инструкция остается без изменений:
Содержимое файла site.com/redirect/index.php:

Файлы GeoIP.dat (за август 2010) + geoip:

Раз в месяц необходимо обновлять GeoIP.dat отсюда:

Как видите вордпресс здесь непричем. Работает всегда и везде.
 
Делал для клиента, переход на ru сайт если клиент из России. Через GEOIP базу данных:
Собственно качаем базу.
Для просмотра ссылки Войди или Зарегистрируйся
Получил чудо файл с 10МБ размером, ессно при большом колличестве обращений к сайту, не вариант загонять даже в базу данных. Есть *.dat формат, но он не прозрачен, и новичку трудно с ним работать (нужно разобраться в API что предлагает GEOIP бесплатно)
Покажу пример как все выполнено в прозрачном cvs формате:
1) На любой линукс/фрибсд системе парсим получая на выходе базу данных российских IP:
cat GeoIPCountryWhois.cvs|grep Russian Federation >> russian_ip.cvs
Получишь 500КБ, но все еще много лишнего в файле, уменьшаем дальше
PHP:
<?php
$db_file= file('russian_ip.cvs');
$result_file=fopen("russian_iponly.db","w+");
for ($i=0;$i<count($db_file);$i++)
	{
	$marker1=strpos($db_file[$i],"\",\"");
	$marker2=strpos($db_file[$i],"\",\"",$marker1+1);
	$marker3=strpos($db_file[$i],"\",\"",$marker2+1);
	$marker4=strpos($db_file[$i],"\",\"",$marker3+1);
$ip_start=substr($db_file[$i],$marker2+3,$marker4-$marker3-3);
$ip_end=substr($db_file[$i],$marker3+3,$marker4-$marker3-3);
	$db_start_end[$i]=$ip_start.".".$ip_end;
	if ($i<(count($db_file)-1)) $db_start_end[$i]= $db_start_end[$i]."\n";
	fwrite($result_file,$db_start_end[$i]);
	}
fclose($result_file);
echo "\nDone!";
?>
Получили базу данных IP адресов (точнее диапазонов) в long формате, вам не обязательно знать что это такое :) Просто иной вид отображения IP адреса.
Размер 82КБ. Можно автоматизировать сей процесс, либо вобще закинуть в MYSQL, но у меня задача была сделать сей процесс наиболее прозрачным для новичка.
Далее собственно то что должно быть на сайте
файлик с функцией function_ifiprussian.php
PHP:
<?php
function checkifiprussian ($iptocheck)
	{
	$check_result=FALSE;
	$iptocheck=ip2long($iptocheck);
	if ($iptocheck==-1) return;
		$russianipdb=file("russian_iponly.db");
	$i=0;
	while ($i<count($russianipdb))
		{
		$start_ip=substr($russianipdb[$i],0,strpos($russianipdb[$i],"."));
		$end_ip=substr($russianipdb[$i],strpos($russianipdb[$i],".")+1);
		if ($iptocheck>$start_ip && $iptocheck<$end_ip) 
			{
			$check_result=TRUE;
			$i=count($russianipdb);
			}
		$i++;
		}
	return $check_result;
	}
?>
Ну и теперь как с ним работать, предположим в верхушке index.php кладем такое:
PHP:
<?php
include_once('function_ifiprussian.php');
 if (!empty($_SERVER['HTTP_CLIENT_IP']))   //check ip from share internet
    {
      $client_ip=$_SERVER['HTTP_CLIENT_IP'];
    }
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))   //to check ip is pass from proxy
    {
      $client_ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    else
    {
      $client_ip=$_SERVER['REMOTE_ADDR'];
    }
$client_russian=checkifiprussian($client_ip);
if ($client_russian==TRUE) {echo "RUSSIAN";}
if ($client_russian==FALSE) {echo "NOTRUSSIAN";}
?>
Последние 2 строчки собственно и проверят из какой страны клиент, и вместо echo "russian"; или echo "notrussian"; ты можешь вставить либо редирект, либо любое другое действие которое тебе нужно.

Вот собственно и все. Данный мост можешь рассматривать как общую информацию, и завернуть скрипт под твои нужды, думаю все шаги предельно ясны и прозрачны.

Добавлено через 5 минут
Ах да, забыл добавить. Если у Вас есть доступ к модулям апача (или хостер может по требованию подключить таковой), самое прямое рещение - подключить опять же бесплатный модуль GEOIP в апаче и будут доступны переадресации через .htaccess.

Но если Вы не владелец сервера, мало вероятно что хостер ответит положительно на такую просьбу. Да и как описал выше, реализовать сию задачу на PHP - проще простого.
 
Я так понимаю не смог разобраться?
Что вызывает сложности?

Я пока не внедрял, но вот как я понял.
Кстати мне тоже на поддомены нужно редиректить. Но в данном случае у меня и в корне тоже есть сайт.
Итак.
Создаём .htaccess - с содержанием
Код:
DirectoryIndex redirect.php
Там же создаём redirect.php с содержанием -
Код:
<?php
require_once("geoip.inc");
$gi = geoip_open("GeoIP.dat",GEOIP_STANDARD);
$country_code = geoip_country_code_by_addr($gi, $_SERVER['REMOTE_ADDR']);
geoip_close($gi);
if ($country_code == 'RU') //код страны
{
        header("HTTP/1.1 301 Moved Permanently");
        header('Location: http://ru.site.com'); // сайт для страны.
}
if ($country_code == 'UA') //код страны
{
        header("HTTP/1.1 301 Moved Permanently");
        header('Location: http://ua.site.com'); // сайт для страны.
}
else
{
        header("HTTP/1.1 301 Moved Permanently");
        header('Location: http://en.site.com'); // сайт, на который перейдет посетитель, если для его страны нет отдельного сайта.
}
?>
Туда же кидаем geoip.inc
Вот и всё.
Или нет ?:)
 
Я пока не внедрял, но вот как я понял.
Кстати мне тоже на поддомены нужно редиректить. Но в данном случае у меня и в корне тоже есть сайт.
Итак.
Создаём .htaccess - с содержанием
Код:
DirectoryIndex redirect.php
Там же создаём redirect.php с содержанием -
Код:
<?php
require_once("geoip.inc");
$gi = geoip_open("GeoIP.dat",GEOIP_STANDARD);
$country_code = geoip_country_code_by_addr($gi, $_SERVER['REMOTE_ADDR']);
geoip_close($gi);
if ($country_code == 'RU') //код страны
{
        header("HTTP/1.1 301 Moved Permanently");
        header('Location: http://ru.site.com'); // сайт для страны.
}
if ($country_code == 'UA') //код страны
{
        header("HTTP/1.1 301 Moved Permanently");
        header('Location: http://ua.site.com'); // сайт для страны.
}
else
{
        header("HTTP/1.1 301 Moved Permanently");
        header('Location: http://en.site.com'); // сайт, на который перейдет посетитель, если для его страны нет отдельного сайта.
}
?>
Туда же кидаем geoip.inc
Вот и всё.
Или нет ?:)
Не совсем так.
GeoIP.dat в Geo.IP.zip-е, его на компьютере распаковываешь и тоже кидаешь вместе с geoip.inc-ом туда же.
Но код в redirect.php для сайта в корне возьми с индексом в конце, а то получится бесконечный редирект на редирект. То есть с таким кодом редиректит на сайт, а заходя на сайт .htaccess первым открывает redirect.php, тот в свою очередь редиректит снова на сайт, на котором снова .htaccess первым открывает redirect.php и так до бесконечности.
Здесь надо приписать index.php :

Для поддоменов дописывать index.php необязательно, потому что у нас там нет редиректа в самом поддомене.
Общий вид будет такой:
По колличеству поддоменов можно добавить:
Китайцев можешь слать сюда :) :
Или если нет страны посетителя можешь отправить его в гугль:
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху