VDS - не срабатывает редирект в curl

jondeer
На сайте с 17.08.2011
Offline
73
2990

Скрипт скачивает например, картинку, в CURL передается ссылка вида www.site.ru/images/101.jpg - на сайте этот адрес преобразуется в www.site.ru/handler.php?id=101. На шаред хостинге скрипт работает нормально, но на VDS отказывается работать, причем во второй раз именно на сервере.

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

curl_setopt($ch, CURLOPT_MAXREDIRS, 10);

Я так понимаю, что не срабатывает редирект в CURL, но что нужно сделать в настройках сервера, чтобы это исправить? Спасибо заранее.

Система управления сайтом DataCMS с большим функционалом (/ru/forum/1006835) Продается отличный скрипт-движок для киносайта MovieTime (/ru/forum/993056)
[umka]
На сайте с 25.05.2008
Offline
456
#1

CURLOPT_FOLLOWLOCATION работает только если выключены open_basedir и safe_mode.

Если всё верно, но редиректы всё равно не обрабатываются, проверьте, выдаёт ли сервер заголовок "Location" (CURLOPT_VERBOSE)

Лог в помощь!
jondeer
На сайте с 17.08.2011
Offline
73
#2
'[umka:
;10760362']CURLOPT_FOLLOWLOCATION работает только если выключены open_basedir и safe_mode.

Если всё верно, но редиректы всё равно не обрабатываются, проверьте, выдаёт ли сервер заголовок "Location" (CURLOPT_VERBOSE)

safe_mode - off

Не подскажете, это что значит?

open_basedir /var/www/admin/data:. no value

sabotage
На сайте с 14.02.2007
Offline
192
#3
jondeer:
Не подскажете, это что значит?
open_basedir /var/www/admin/data:. no value

В конфиге апача (httpd.conf) прописать/изменить на:

php_admin_value open_basedir "none"
jondeer
На сайте с 17.08.2011
Offline
73
#4
'[umka:
;10760362']CURLOPT_FOLLOWLOCATION работает только если выключены open_basedir и safe_mode.

Если всё верно, но редиректы всё равно не обрабатываются, проверьте, выдаёт ли сервер заголовок "Location" (CURLOPT_VERBOSE)
sabotage:
В конфиге апача (httpd.conf) прописать/изменить на:
php_admin_value open_basedir "none"

Спасибо огромное за советы еще раз, помогло.

[umka]
На сайте с 25.05.2008
Offline
456
#5
jondeer:
Спасибо огромное за советы еще раз, помогло.

Это также помогло понизить безопасность вашей системы :)

Если кто-то расковыряет ваш сайт, то расковыряют и всю систему.

Хотя, что-то мне подсказывает, что это и с open_basedir-ом сделали бы.

jondeer
На сайте с 17.08.2011
Offline
73
#6
'[umka:
;10761467']Это также помогло понизить безопасность вашей системы :)
Если кто-то расковыряет ваш сайт, то расковыряют и всю систему.

Хотя, что-то мне подсказывает, что это и с open_basedir-ом сделали бы.

Интересно :) А как же на других серверах работают скрипты, где используется CURL ?

LEOnidUKG
На сайте с 25.11.2006
Offline
1773
#7
jondeer:
Интересно :) А как же на других серверах работают скрипты, где используется CURL ?

Да легко :)

Вместо:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

Надо написать:

curl_redir_exec($ch, CURLOPT_FOLLOWLOCATION, 1);


function curl_redir_exec($ch)
{
static $curl_loops = 0;
static $curl_max_loops = 20; # Максимальное количество перебросов.
if ($curl_loops >= $curl_max_loops)
{
$curl_loops = 0;
return FALSE;
}
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$data = curl_exec($ch);
list($header, $data) = explode("\n\n", $data, 2);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($http_code == 301 || $http_code == 302)
{
$matches = array();
preg_match('/Location:(.*?)\n/', $header, $matches);
$url = @parse_url(trim(array_pop($matches)));
if (!$url)
{
$curl_loops = 0;
return $data;
}
$last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL));
if (!$url['scheme'])
$url['scheme'] = $last_url['scheme'];
if (!$url['host'])
$url['host'] = $last_url['host'];
if (!$url['path'])
$url['path'] = $last_url['path'];
$new_url = $url['scheme'] . '://' . $url['host'] . $url['path'] . ($url['query']?'?'.$url['query']:'');
curl_setopt($ch, CURLOPT_URL, $new_url);
return curl_redir_exec($ch);
} else {
$curl_loops=0;
return $data;
}
}
✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
jondeer
На сайте с 17.08.2011
Offline
73
#8
LEOnidUKG:
Да легко :)

Вместо:
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

Надо написать:
curl_redir_exec($ch, CURLOPT_FOLLOWLOCATION, 1);


function curl_redir_exec($ch)
{
static $curl_loops = 0;
static $curl_max_loops = 20; # Максимальное количество перебросов.
if ($curl_loops >= $curl_max_loops)
{
$curl_loops = 0;
return FALSE;
}
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$data = curl_exec($ch);
list($header, $data) = explode("\n\n", $data, 2);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($http_code == 301 || $http_code == 302)
{
$matches = array();
preg_match('/Location:(.*?)\n/', $header, $matches);
$url = @parse_url(trim(array_pop($matches)));
if (!$url)
{
$curl_loops = 0;
return $data;
}
$last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL));
if (!$url['scheme'])
$url['scheme'] = $last_url['scheme'];
if (!$url['host'])
$url['host'] = $last_url['host'];
if (!$url['path'])
$url['path'] = $last_url['path'];
$new_url = $url['scheme'] . '://' . $url['host'] . $url['path'] . ($url['query']?'?'.$url['query']:'');
curl_setopt($ch, CURLOPT_URL, $new_url);
return curl_redir_exec($ch);
} else {
$curl_loops=0;
return $data;
}
}

Как все запущено, по такому варианту придется два скрипта переписывать :)

LEOnidUKG
На сайте с 25.11.2006
Offline
1773
#9
jondeer:
Как все запущено, по такому варианту придется два скрипта переписывать :)

Конечно не знаю, что там переписать, но по моему варианту просто вставить функцию и заменить строчку, чтобы работа была через неё и всё.

Но вам виднее, я пользуюсь этой функцией, а то раньше тоже доставлял много хлопот этот редирект.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий