Большое всем спасибо! В ЛС предложили довольно заманчивый вариант. Воспользуюсь им.
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. Реализуем доп. поля + поиск по доп. полям + маленький плагин для распечатки.