[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Логика редиректов, как лучше сделать?
lastalert
Не знаю как оформить код редиректов. Т.е. если урл указан верно, то мы переходим по нему, иначе переходим на другой урл.

<?php

$url_1 = 'http://google.com';
$url_2 = 'http://yahoo.com';
$url_3 = 'http://mail.ru';
$error = "ERROR!";

isset($url_1) ? header('Location:' . $url_1) : header('Location:' . $url_2);

isset($url_3) ? header('Location:' . $url_3) : print($error);

?>

Не могу понять логику: когда 1-й, 2-й, 3-й урл не работают, то вывести $error.





Спустя 20 минут, 19 секунд (6.10.2010 - 18:44) waldicom написал(а):
В самом просто случае if...else
Если переменная будет одна, но может меняться её значение, то лучше подходит switch

Спустя 9 минут, 34 секунды (6.10.2010 - 18:53) lastalert написал(а):
с if - else пытался сделать, но не получилось. Дело в том, что для isset всегда будет существовать текст переменной. А вот корректность ссылки не знаю как проверить.

// например $url_1 = 'http://smcbhcgchjcecyuwy.com';

if (isset($url_1) header ('Location'.$url_1);

Выкидывало: Неправильно задан URL и не переходило на другие ветки условия.
switch тоже не подходит, нужно именно так, как указано в 1-м посте.

и единственный способ, которым мне удалось перейти на другой сайт был сделан с пом ? :

или мб как-то проверять ответ сервера и выполнять определенные действия.

Спустя 48 минут, 19 секунд (6.10.2010 - 19:42) inpost написал(а):
lastalert
Вообще-то коректность проверяется регулярками: http://irbis-team.com/15/20

Спустя 6 дней, 31 минута, 45 секунд (12.10.2010 - 20:13) lastalert написал(а):
Не стал поднимать новую тему. Проблема та же.
Написал скрипт, но работает неправильно.
<?php

/*****************************************/
$domen = 'http://mydomain.ru';

$target1 = 'http://IP:PORT';

$target2 = 'http://IP:PORT';

$notworking = 'http://domain.com/error.html';

/*****************************************/

// checking the domain
if (isset($domen)) {

if (isset($target1)) {
// getting HTTP headers from $target1
$headers_t1 = get_headers($target1, 1);

$header_ok_t1 = explode(" ", $headers_t1[0]);
// if server retrieved code 200 OK
if($header_ok_t1[1] == 200) {

$data_t1 = parse_url($target1);

$ip_t1 = gethostbyname($data_t1[host]);

$dname_t1 = gethostbyaddr($ip_t1);

$url_t1 = str_replace($ip_t1, $data_t1[host], $dname_t1);
// redirect on $target1
header("Location:" . $data_t1[scheme] . "://" . $url_t1 . ":" . $data_t1[port]);

}

// getting HTTP headers from $target2
} elseif (isset($target2)) {

$headers_t2 = get_headers($target2, 1);

$header_ok_t2 = explode(" ", $headers_t2[0]);
// if server retrieved code 200 OK
if($header_ok_t2[1] == 200) {

$data_t2 = parse_url($target2);

$ip_t2 = gethostbyname($data_t2[host]);

$dname_t2 = gethostbyaddr($ip_t2);

$url_t2 = str_replace($ip_t2, $data_t2[host], $dname_t2);
// redirect on $target2
header("Location:" . $data_t2[scheme] . "://" . $url_t2 . ":" . $data_t2[port]);

}
// go on errorpage
} else {

header("Location:" . $notworking);

}

}


?>


Вернуло:
Warning: get_headers(http://*.*.*.*:**) [function.get-headers]: failed to open stream: Connection timed out in /var/www/redirect.php on line 25


Когда в $target1 указываешь работающий сервер, то все ОК, редирект происходит
Когда в $target2 указываешь неработающий сервер, то и вылетает ошибка, указанная выше.
Нужно чтобы независимо от того в каком из $target-ов прописан адрес работающего сервера выполнялся редирект.
Дело в том что если работает один сервер, то другой выключен, и наоборот, если запасной серв работает, то первичный выкл.

Спустя 46 минут, 10 секунд (12.10.2010 - 21:00) Basili4 написал(а):
lastalert
долго по тайм ауту валиться

Спустя 35 минут, 56 секунд (12.10.2010 - 21:36) lastalert написал(а):
Basili4, а можно как-то обойти длительный таймаут?
т.е. если ожидаешь более 5 сек, то редиректить на другой сервер.

сервер даже не пингуется

вопрос к знатокам: код хотя бы правильный я написал с точки зрения логики?

Спустя 20 минут, 3 секунды (12.10.2010 - 21:56) arvitaly написал(а):
юзайте curl, там можно время выставить, тут тоже можно но я не помню как

Спустя 1 день, 52 минуты, 23 секунды (13.10.2010 - 22:48) lastalert написал(а):
arvitaly, накодил с использованием курл. На локалхосте работает, на хостинге - нет. (и ошибки не выдает).
Коды HTTP ответа по нулям. А должно быть на одном 302, на другом 0. Сейчас если запускаю скрипт с хостинга, то редирект всегда на гугл.
<?php

/*********************************************/
$domen = "http://domen.ru";

$target1 = "http://93.127.67.64:3333";

$target2 = "http://85.223.235.166:3333";

$notworking = "http://google.com:80";
/*********************************************/

if (isset($domen)) {

$ch1 = curl_init();
$ch2 = curl_init();

$timeout = 1;

curl_setopt($ch1, CURLOPT_URL, $target1);
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch1, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($ch1, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch1, CURLOPT_HEADER, 1);
curl_setopt($ch1, CURLOPT_NOBODY, 1);



curl_setopt($ch2, CURLOPT_URL, $target2);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch2, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($ch2, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch2, CURLOPT_HEADER, 1);
curl_setopt($ch2, CURLOPT_NOBODY, 1);



$mh = curl_multi_init();

curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);

$running = null;

do {
usleep(10000);
curl_multi_exec($mh, $running);
} while ($running > 0);

$headercode1 = curl_getinfo($ch1, CURLINFO_HTTP_CODE);
$headercode2 = curl_getinfo($ch2, CURLINFO_HTTP_CODE);

curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);

//echo $headercode1 . " ". $headercode2;

if ($headercode1 != 0){

$data_t1 = parse_url($target1);

$ip_t1 = gethostbyname($data_t1[host]);

$dname_t1 = gethostbyaddr($ip_t1);

$url_t1 = str_replace($ip_t1, $data_t1[host], $dname_t1);

$url_t1 = $data_t1[scheme] . "://" . $url_t1 . ":" . $data_t1[port];

header("Location:" . $url_t1);

} elseif ($headercode2 != 0) {

$data_t2 = parse_url($target2);

$ip_t2 = gethostbyname($data_t2[host]);

$dname_t2 = gethostbyaddr($ip_t2);

$url_t2 = str_replace($ip_t2, $data_t2[host], $dname_t2);

$url_t2 = $data_t2[scheme] . "://" . $url_t2 . ":" . $data_t2[port];

header("Location:" . $url_t2);

} else {

header("Location:" . $notworking);

}


}




?>

Спустя 14 минут, 55 секунд (13.10.2010 - 23:03) arvitaly написал(а):
Просто тихий ужас. Объедините одинаковые куски кода в функции, а то невозможно


_____________
...think about your actions.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.