@labcontent
KM

Как настроить PHP редирект по user-agent?

Привет всем, есть редирект, через js, который пользователей с моб. отправляет на поддомен, а с пк отправляет на основной домен:


Как его реализовать на php (302 редирект по user-agent)? В движке есть определение по user-agent, для рекламы, при помощи https://github.com/serbanghita/Mobile-Detect, который подключен в process_page.php вот так
if (@count($ad_info['devices']) > 0 && @count($ad_info['devices']) < 3)
					{
						if (!class_exists('Mobile_Detect'))
						{
							include_once("$config[project_path]/admin/include/mobiledetect/Mobile_Detect.php");
						}
						if (class_exists('Mobile_Detect'))
						{
							$mobiledetect = new Mobile_Detect();
							$ad_device_show = false;
							foreach ($ad_info['devices'] as $ad_device)
							{
								if ($ad_device_show)
								{
									break;
								}
								switch ($ad_device)
								{
									case 'pc':
										$ad_device_show = !$mobiledetect->isMobile();
										break;
									case 'tablet':
										$ad_device_show = $mobiledetect->isTablet();
										break;
									case 'phone':
										$ad_device_show = $mobiledetect->isMobile() && !$mobiledetect->isTablet();
										break;
								}
							}
							if (!$ad_device_show)
							{
								continue;
							}
						}
					}


Пытались сделать, подключив вот этот код в pre_process_page.php, но получаем циклический редирект. Кто поможет? Спасибо!

<?php
include_once("$config[project_path]/admin/include/mobiledetect/Mobile_Detect.php");
session_start();
$detect = new Mobile_Detect;
$det = array();
$det['mobile'] = $detect->isMobile();
$det['link'] = isMobileLink();

function isMobileLink() {
	$url = ((!empty($_SERVER['HTTPS'])) ? 'https' : 'http').'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
	if(stristr('#^m.#', '', $url) == 1) {
		return 1;
	} else return 0;
}
function isBot() {
	if (preg_match('/googlebot|-google|yandex/i', $_SERVER['HTTP_USER_AGENT'])) {
    	return 1;
	} else return 0;
}
function replaceUrl() {
	$url = ((!empty($_SERVER['HTTPS'])) ? 'https' : 'http').'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];

	if ($detect->isMobile() == 1 && $det['link'] == 0){
		$url = 'm.'.$url;
		return $url;
	} else if ($det['mobile'] == 0 && $det['link'] == 1){
		$url = preg_replace('#^m.#', '', $url);
		return $url;
	} else return false;
}
function rredirect($url, $permanent = false) {
	header("HTTP/1.1 301 Moved Permanently");
	header('Location: '.$url, true, 301);
	die("Redirect");
}

$way = array(0,0,0);
$way[1] = isBot();
$way[2] = $det['mobile'];
$way[3] = isMobileLink();
if ($way[1] == 1 && $way[2] == 1 && $way[3] == 1) { $red=false; $adw=false;} 	//Бот телефон на моб версии';}
if ($way[1] == 1 && $way[2] == 1 && $way[3] == 0) { $red=true; $adw=false;} 	//Бот телефон на пк версии';}
if ($way[1] == 1 && $way[2] == 0 && $way[3] == 1) { $red=true; $adw=false;} 	//Бот комп на моб версии';}
if ($way[1] == 1 && $way[2] == 0 && $way[3] == 0) { $red=false; $adw=false;}	//Бот комп на пк версии';}
if ($way[1] == 0 && $way[2] == 1 && $way[3] == 0) { $red=true; $adw=true;}	//Человек телефон на пк версии';}
if ($way[1] == 0 && $way[2] == 1 && $way[3] == 1) { $red=false; $adw=true;}	//Человек телефон на моб версии';}
if ($way[1] == 0 && $way[2] == 0 && $way[3] == 1) { $red=true; $adw=true;}	//Человек комп на моб версии';}
if ($way[1] == 0 && $way[2] == 0 && $way[3] == 0) { $red=false; $adw=true;} 	//Человек комп на пк версии';}


if (isset($_COOKIE['cenzura']) && $_COOKIE['cenzura']=='offline') {
	$displaypop = 'none';
} else if ($adw == 'true' || $_COOKIE['cenzura']!='offline') { 
	$displaypop = 'block';	
}


if ($red == 'true') { 
	rredirect(replaceUrl());
}
  • Вопрос задан
  • 248 просмотров
Пригласить эксперта
Ответы на вопрос 1
dyuriev
@dyuriev
A posteriori
Про ваш код:
function replaceUrl() {
/*
вот тут получаем
$url = https://m.site.ru/request
или
$url = https://site.ru/request
*/
  $url = ((!empty($_SERVER['HTTPS'])) ? 'https' : 'http').'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];

  if ($detect->isMobile() == 1 && $det['link'] == 0){

    $url = 'm.'.$url;                       // <= WTF?
                                            // $url = m.https://site.ru/request

    return $url;
  } else if ($det['mobile'] == 0 && $det['link'] == 1){

    $url = preg_replace('#^m.#', '', $url); // <= тут вообще регулярка не валидна,
                                            // так как url начинается всегда
                                            // с http или https

    return $url;
  } else return false;
}

Тут вообще голова заболела:
function isMobileLink() {
  $url = ((!empty($_SERVER['HTTPS'])) ? 'https' : 'http').'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];

  if(stristr('#^m.#', '', $url) == 1) {    // <= воу, воу, полехче. перечитайте
                                           // документацию по этой функции,
                                           // тут какая то наркомания

    return 1;
  } else return 0;
}

Это то что сходу нашел

Про детектирование мобил и прочего
Если у вас не хостинг, а полноценный выделенный сервак, то в пхп есть чудесная функция: get_browser
Надо всего лишь прописать в php.ini путь до browscap.ini
Работает быстрее библиотек, на сегодняшний день вполне не плохо по user-agent определяет мобилы/планшеты/десктопы/боты, а бонусом еще всякую хрень, но это сами увидете, когда изучать начнете

PS:
$way = array(0,0,0);
$way[1] = isBot();
$way[2] = $det['mobile'];
$way[3] = isMobileLink();
if ($way[1] == 1 && $way[2] == 1 && $way[3] == 1) { $red=false; $adw=false;} 	//Бот телефон на моб версии';}
if ($way[1] == 1 && $way[2] == 1 && $way[3] == 0) { $red=true; $adw=false;} 	//Бот телефон на пк версии';}
if ($way[1] == 1 && $way[2] == 0 && $way[3] == 1) { $red=true; $adw=false;} 	//Бот комп на моб версии';}
if ($way[1] == 1 && $way[2] == 0 && $way[3] == 0) { $red=false; $adw=false;}	//Бот комп на пк версии';}
if ($way[1] == 0 && $way[2] == 1 && $way[3] == 0) { $red=true; $adw=true;}	//Человек телефон на пк версии';}
if ($way[1] == 0 && $way[2] == 1 && $way[3] == 1) { $red=false; $adw=true;}	//Человек телефон на моб версии';}
if ($way[1] == 0 && $way[2] == 0 && $way[3] == 1) { $red=true; $adw=true;}	//Человек комп на моб версии';}
if ($way[1] == 0 && $way[2] == 0 && $way[3] == 0) { $red=false; $adw=true;} 	//Человек комп на пк версии';}

можно переписать двумя строчками, используя булевые функции NOT и XOR

PPS:
а вообще я даже не программист, тупо линуксоид-задрот.
просто такие вещи знать бы не плохо
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы