FollowLocation

FollowLocation
Рейтинг
12
Регистрация
19.07.2013

Большое всем спасибо! В ЛС предложили довольно заманчивый вариант. Воспользуюсь им.

orphelin,

 header('Location: http://www.site.ru?notredir=1') 

А вообще ЛК должен соответствовать какому-то шаблону УРЛ. Допустим, что он лежит в папке client. Тогда при обращении к любому файлу, из этой папки редиректим на https. В противном случае - на http.

	if ((substr ($_SERVER['REQUEST_URI'], 0, 7) == '/client') and (!$_SERVER['HTTPS'])) {
header('HTTP/1.1 301 Moved Permanently');
header('Location: https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
} else {
if ($_SERVER['HTTPS']) {
header('HTTP/1.1 301 Moved Permanently');
header('Location: http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
}
}

bashkir102, решение подходит только для частного случая, когда location указывается относительно запрашиваемого урла.

AutoBlogger, мне интересно :) Всё-таки хочу добить эту проблему.

AutoBlogger, то, что я выше написал - работает?

И да - лучше сделать так:

function curl_post($url, $data=false, $set_cookie=false)

Таким образом, для GET запроса достаточно указать один параметр

$html = curl_post('http://ya.ru');

AutoBlogger, тогда, по идее, curl_flollow_exec шлет POST запрос вместо GET.

Может быть попробовать так:

function curl_flollow_exec($ch, $redirects = 0) {
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
$data = curl_exec($ch);

$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

if (($http_code == 301 || $http_code == 302) && ++$redirects < 10) {
preg_match('/(Location:|URI:)(.*?)\n/', $data, $matches);
if (isset($matches[2])) {
$redirect_url = trim($matches[2]);
if ($redirect_url !== '') {
$download_url = curl_getinfo ($ch, CURLINFO_EFFECTIVE_URL);
$redirect_url = abs_url ($redirect_url, $download_url);

curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_REFERER, $download_url);
curl_setopt($ch, CURLOPT_URL, $redirect_url);
return curl_flollow_exec($ch, $redirects);
}
}
}
return $data;
}

function abs_url ($link, $base_url) {

if (!$link) return $base_url;

$parse_url = parse_url($link);
$base = parse_url($base_url);
$host_url = $base['scheme'] . "://" . $base['host'];

if ($parse_url['scheme']) {
$abs_url = $link;
} elseif ($parse_url['host']) {
$abs_url = "http://" . $link;
} else { // ссылка относительная
if (preg_match("!^/!", $link)) {
$abs_url = $host_url . $link;
} elseif (preg_match("!^(\.\./)+!", $link, $tt0)) {
$num = preg_match_all("!\.\./!", $tt0['0'], $tt1);
preg_match("!(.*)/(?:.+?/){{$num}}$!", dirname($base['path']) . "/", $tt2);
$abs_url = $host_url . $tt2['1'] . "/" . preg_replace("!^(\.\./){{$num}}!", "", $link);
} elseif (preg_match("!^\./!", $link)) {
$abs_url = $host_url . dirname($base['path']) . substr($link, 1);
} else {
$abs_url = $base_url . ((preg_match("!/$!", $base_url))?"":"/") . $link;
}
}

return $abs_url;

}

dkameleon, как я понял из контекта, стандартный параметр followlocation обрабатывает относительные ссылки вполне нормально. А вот функция-костыль - это уже неизвестно. Я ещё грешу на реферер, который возможно, не верно подставляется. Я бы даже сразу так сделал:

function curl_flollow_exec($ch, $redirects = 0) {

curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
$data = curl_exec($ch);

$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

if (($http_code == 301 || $http_code == 302) && ++$redirects < 10) {
preg_match('/(Location:|URI:)(.*?)\n/', $data, $matches);
if (isset($matches[2])) {
$redirect_url = trim($matches[2]);
if ($redirect_url !== '') {
$download_url = curl_getinfo ($ch, CURLINFO_EFFECTIVE_URL);
$redirect_url = abs_url ($redirect_url, $download_url);

curl_setopt($ch, CURLOPT_REFERER, $download_url);
curl_setopt($ch, CURLOPT_URL, $redirect_url);
return curl_flollow_exec($ch, $redirects);
}
}
}
return $data;
}

function abs_url ($link, $base_url) {

if (!$link) return $base_url;

$parse_url = parse_url($link);
$base = parse_url($base_url);
$host_url = $base['scheme'] . "://" . $base['host'];

if ($parse_url['scheme']) {
$abs_url = $link;
} elseif ($parse_url['host']) {
$abs_url = "http://" . $link;
} else { // ссылка относительная
if (preg_match("!^/!", $link)) {
$abs_url = $host_url . $link;
} elseif (preg_match("!^(\.\./)+!", $link, $tt0)) {
$num = preg_match_all("!\.\./!", $tt0['0'], $tt1);
preg_match("!(.*)/(?:.+?/){{$num}}$!", dirname($base['path']) . "/", $tt2);
$abs_url = $host_url . $tt2['1'] . "/" . preg_replace("!^(\.\./){{$num}}!", "", $link);
} elseif (preg_match("!^\./!", $link)) {
$abs_url = $host_url . dirname($base['path']) . substr($link, 1);
} else {
$abs_url = $base_url . ((preg_match("!/$!", $base_url))?"":"/") . $link;
}
}

return $abs_url;

}

Подставляем реферер загрузившейся страницы, и преобразовываем ссылку редиректа в абсолютную.

И я проспал :)

bukachuk, бывает. Это же редирект. Закрывать соединение для редиректа вовсе не обязательно. А преобразовать урл к абсолютному можно так:

function curl_flollow_exec($ch, $redirects = 0) {
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
$data = curl_exec($ch);

$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

if (($http_code == 301 || $http_code == 302) && ++$redirects < 10) {
preg_match('/(Location:|URI:)(.*?)\n/', $data, $matches);
if (isset($matches[2])) {
$redirect_url = trim($matches[2]);
if ($redirect_url !== '') {
$download_url = curl_getinfo ($ch, CURLINFO_EFFECTIVE_URL);
$redirect_url = abs_url ($redirect_url, $download_url);
curl_setopt($ch, CURLOPT_URL, $redirect_url);
return curl_flollow_exec($ch, $redirects);
}
}
}
return $data;
}

function abs_url ($link, $base_url) {

if (!$link) return $base_url;

$parse_url = parse_url($link);
$base = parse_url($base_url);
$host_url = $base['scheme'] . "://" . $base['host'];

if ($parse_url['scheme']) {
$abs_url = $link;
} elseif ($parse_url['host']) {
$abs_url = "http://" . $link;
} else { // ссылка относительная
if (preg_match("!^/!", $link)) {
$abs_url = $host_url . $link;
} elseif (preg_match("!^(\.\./)+!", $link, $tt0)) {
$num = preg_match_all("!\.\./!", $tt0['0'], $tt1);
preg_match("!(.*)/(?:.+?/){{$num}}$!", dirname($base['path']) . "/", $tt2);
$abs_url = $host_url . $tt2['1'] . "/" . preg_replace("!^(\.\./){{$num}}!", "", $link);
} elseif (preg_match("!^\./!", $link)) {
$abs_url = $host_url . dirname($base['path']) . substr($link, 1);
} else {
$abs_url = $base_url . ((preg_match("!/$!", $base_url))?"":"/") . $link;
}
}

return $abs_url;

}

AutoBlogger, правильно ли передается реферер?

iWi, wordpress. Реализуем доп. поля + поиск по доп. полям + маленький плагин для распечатки.

Всего: 115