Błąd oznacza safe_mode lub open_basedir ZAKOŃCZONE (prawdopodobnie open_basedir) prawdopodobnie nie można przesłonić, jeśli host ma przyzwoite ustawienia zabezpieczeń.
Więc masz wybór
1) szereg zmian (nie bardzo pożądane sobie wyobrazić)
2) wykorzystywać funkcję podobną do tych znalezionych na stronie curl_setopt php, tj http://www.php.net/manual/en/function.curl-setopt.php#95027
Poniżej znajduje się stałe wersja funkcji określonych w punkcie 2
function curl_redirect_exec($ch, &$redirects, $curlopt_header = false) {
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($http_code == 301 || $http_code == 302) {
list($header) = explode("\r\n\r\n", $data, 2);
$matches = array();
preg_match("/(Location:|URI:)[^(\n)]*/", $header, $matches);
$url = trim(str_replace($matches[1], "", $matches[0]));
$url_parsed = parse_url($url);
if (isset($url_parsed)) {
curl_setopt($ch, CURLOPT_URL, $url);
$redirects++;
return curl_redirect_exec($ch, $redirects, $curlopt_header);
}
}
if ($curlopt_header) {
return $data;
} else {
list(, $body) = explode("\r\n\r\n", $data, 2);
return $body;
}
}
Zabawne, ale skrypt działa dobrze na moim hoście (tanie i wirtualne), ale szef używa głupiego hosta i nie ma ochoty na zmianę. o tej funkcji - znam ją, kiedy zaczynam pisać skrypt i ręcznie wywołuję każdy adres URL, ale ostatni URL nie działa, i tylko przy pomocy CURLOPT_FOLLOWLOCATION pomaga mi – kusanagi
Eee przepraszam, że tak naprawdę nie przetestowałem tej funkcji, ty ' re right to nie działa (zakłada, że nagłówek Location nie jest ostatnim) Dodałem poprawioną wersję testowaną do mojej odpowiedzi. – Rwky
Twoje rozwiązanie ma kilka błędów. Wyrażenie regularne powinno mieć postać '[^ \ n]'. Podczas rekursywnego wywoływania 'curl_redirect_exec' powinieneś przekazać' $ curlopt_header'. –