Php + cURL не работает редирект (CURLOPT_FOLLOWLOCATION) на VPS

Aizen

Создатель
Регистрация
18 Мар 2016
Сообщения
17
Реакции
4
Доброго времени суток.

Имеется VPS работающий на Centos 7 + VestaCP + php 5.5.38
В php скрипте для запроса к сайту использую cURL, запрашиваемый сайт в свою очередь делает редирект на другую страницу, так вот curl не отрабатывает редирект и возвращает самую первую страницу, хотя установлена опция CURLOPT_FOLLOWLOCATION. Никаких ошибок при этом не выводится. Функция curl_error($ch) тоже ничего не возвращает.
Привожу код настроек curl.
PHP:
function get_content($url) {
    $ch = curl_init ($url);
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.6.1000 Chrome/30.0.1599.101 Safari/537.36");
    curl_setopt ($ch, CURLOPT_HEADER, 0);
    curl_setopt ($ch, CURLOPT_TIMEOUT, 15);
    curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt ($ch, CURLOPT_MAXREDIRS, 15);
    $document = curl_exec ($ch);
    curl_close ($ch);
    return $document;
}

На локальном сервере этот код работает отлично и редирект срабатывает.
Пробовал обновить curl на сервере до версии 7.73.0, но не помогло.
Долго мучил гугл но так никакого решения не нашел. Подскажите пожалуйста в какую сторону копать, какие логи смотреть?
 
Попробуй в консоли на том же сервере проверить
$ curl -iL Для просмотра ссылки Войди или Зарегистрируйся

и посмотри вывод - будет ли переход и вообще, сколько редиректов
редирект в принципе может быть условным, привязан к IP / подсети клиента
т.е. из одной подсети работает, из другой - нет

PS. И в php-коде тоже включи вывод заголовка, и сравни вывод там и там
в помощь Для просмотра ссылки Войди или Зарегистрируйся
 
Какой ответ сервера? Какие заголовки, какое тело ответа? Может там на html или на js редирект?

Попробуй через этот класс
Для просмотра ссылки Войди или Зарегистрируйся

И сделай
echo $request->dump();

И нам отправь
 
alex_me,
Q_BASIC,

Спасибо за ответ.

Попробуй в консоли на том же сервере проверить
$ curl -iL Для просмотра ссылки Войди или Зарегистрируйся

Проверил, хм, редирект отработал как положено, то есть проблема скорее всего не в curl а php

Код:
$ curl -iL https://site.com/old-url

HTTP/2 301
server: nginx
date: Fri, 20 Nov 2020 22:37:08 GMT
content-type: text/html; charset=utf-8
location: https://site.ru/new-url
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
x-download-options: noopen
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
cache-control: no-cache
set-cookie: _session=dWwxN2hoZVNkSXJOMTVLK0k0TE5vc0lwbXpYL3ZBMGthWlo0MjB5a                                                                                                                                                                                                                                             zRRQWhLNHlweWRpbTZqRUJyaEROOGh2L2xCMHp4d3V1QTlHd3VhNWEyWU13elB6QkdsL2tWOHkxV052R                                                                                                                                                                                                                                             XlURzd5WHE5V3dKb1JGSTVhWU1sYmRkMFZJMUwtLUVTL0dRc25YR3pWWHRpQi9aM3FtVmc9PQ%3D%3D-                                                                                                                                                                                                                                             -541795de3d24f00511aa4dd2710bfab9a5c35e86; domain=.site.ru; path=/; expire                                                                                                                                                                                                                                             s=Wed, 19 Nov 2025 22:37:08 GMT; secure; HttpOnly
x-request-id: 8f924558-5b21-4293-b65e-42fbe8f75154
x-runtime: 0.010687
vary: Origin

HTTP/2 200
server: nginx
date: Fri, 20 Nov 2020 22:37:08 GMT
content-type: text/html; charset=utf-8
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
x-download-options: noopen
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
etag: W/"0284723c38bc5821256732e2b47c2f41"
cache-control: max-age=0, private, must-revalidate
set-cookie: _session=b2l1cElZekRlbHJMNTdCaGpBUnU1OVU4SloxMXRRMWpVRHpaSTljb                                                                                                                                                                                                                                             HFXRzBjSUlTVkc3cE9hS0RnMFJNcGV6NHovZmx1cy9yQVNDaG11R0tvV3d2dmlZejNLMlZiYVRGZERGZ                                                                                                                                                                                                                                             FIyOTlGMHdzT1J5YVFLeWFTbDdTT3NrbitxbnlUczlCQ0dTTXJTeEk5RlBpT01NdWdjMXIyT2xXZG1Hb                                                                                                                                                                                                                                             EcyeVZ4VlhJT0grNDdBREVidTJmZFNBdmJPTzF6WVArNjJOMStIN1VLTjNxQXFjZFpMZTNuVW1wZ2JnV                                                                                                                                                                                                                                             ldIK1NoY1Y2eGxRZGpLMD0tLVAzMEhyZUd0RW54WmRQM1FJV2dhL3c9PQ%3D%3D--7b74a212826b414                                                                                                                                                                                                                                             eb8d8b426829cd812ba5663d9; domain=.site.ru; path=/; expires=Wed, 19 Nov 20                                                                                                                                                                                                                                             25 22:37:08 GMT; secure; HttpOnly
x-request-id: 1632ed21-eb2d-4a44-8029-5f90c6d26eba
x-runtime: 0.064149
vary: Origin

PHP:
Array
(
    [url] => https://site.com/old-url
    [content_type] => text/html; charset=utf-8
    [http_code] => 301
    [header_size] => 876
    [request_size] => 205
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 0,275372
    [namelookup_time] => 0,007077
    [connect_time] => 0,020201
    [pretransfer_time] => 0,238845
    [size_upload] => 0
    [size_download] => 126
    [speed_download] => 458
    [speed_upload] => 0
    [download_content_length] => -1
    [upload_content_length] => -1
    [starttransfer_time] => 0,275305
    [redirect_time] => 0
    [redirect_url] => https://site.com/new-url
    [primary_ip] => 55.55.55.55
    [certinfo] => Array
        (
        )

    [primary_port] => 443
    [local_ip] => 44.44.44.44
    [local_port] => 49296
)

Какой ответ сервера? Какие заголовки, какое тело ответа? Может там на html или на js редирект?

И сделай
echo $request->dump();

Код:
URL: https://site.com/old-url
Error: Response code is 301
Options:
        Option CURLOPT_URL setted to https://site.com/old-url
        Option CURLOPT_RETURNTRANSFER setted to 1
        Option CURLOPT_FOLLOWLOCATION setted to 1
        Option CURLOPT_USERAGENT setted to Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36
        Option CURLOPT_HEADERFUNCTION setted to (callback) this::_set_headers()


Info:
Array
(
    [url] => https://site.com/old-url
    [content_type] => text/html; charset=utf-8
    [http_code] => 301
    [header_size] => 876
    [request_size] => 63
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 0.058552
    [namelookup_time] => 0.007203
    [connect_time] => 0.020507
    [pretransfer_time] => 0.035463
    [size_upload] => 0
    [size_download] => 126
    [speed_download] => 2172
    [speed_upload] => 0
    [download_content_length] => -1
    [upload_content_length] => -1
    [starttransfer_time] => 0.058496
    [redirect_time] => 0
    [redirect_url] => https://site.com/new-url
    [primary_ip] => 55.55.55.55
    [certinfo] => Array
        (
        )

    [primary_port] => 443
    [local_ip] => 44.44.44.44
    [local_port] => 60756
)

Headers:

Response:
<html><body>You are being <a href="https://site.com/new-url">redirected</a>.</body></html>

Ответ сервера 301, адрес на какой нужно перейти (redirect_url) тоже присутствует. Не понятно что ему не нравится. Единственное что приходит в голову. Это попробовать снести php и установить его заново. Но немного стремно напортачить, раньше этого не делал.
 
Последнее редактирование:
alex_me,
Q_BASIC,

Спасибо за ответ.



Проверил, хм, редирект отработал как положено, то есть проблема скорее всего не в curl а php

Код:
$ curl -iL https://site.com/old-url

HTTP/2 301
server: nginx
date: Fri, 20 Nov 2020 22:37:08 GMT
content-type: text/html; charset=utf-8
location: https://site.ru/new-url
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
x-download-options: noopen
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
cache-control: no-cache
set-cookie: _session=dWwxN2hoZVNkSXJOMTVLK0k0TE5vc0lwbXpYL3ZBMGthWlo0MjB5a                                                                                                                                                                                                                                             zRRQWhLNHlweWRpbTZqRUJyaEROOGh2L2xCMHp4d3V1QTlHd3VhNWEyWU13elB6QkdsL2tWOHkxV052R                                                                                                                                                                                                                                             XlURzd5WHE5V3dKb1JGSTVhWU1sYmRkMFZJMUwtLUVTL0dRc25YR3pWWHRpQi9aM3FtVmc9PQ%3D%3D-                                                                                                                                                                                                                                             -541795de3d24f00511aa4dd2710bfab9a5c35e86; domain=.site.ru; path=/; expire                                                                                                                                                                                                                                             s=Wed, 19 Nov 2025 22:37:08 GMT; secure; HttpOnly
x-request-id: 8f924558-5b21-4293-b65e-42fbe8f75154
x-runtime: 0.010687
vary: Origin

HTTP/2 200
server: nginx
date: Fri, 20 Nov 2020 22:37:08 GMT
content-type: text/html; charset=utf-8
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
x-download-options: noopen
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
etag: W/"0284723c38bc5821256732e2b47c2f41"
cache-control: max-age=0, private, must-revalidate
set-cookie: _session=b2l1cElZekRlbHJMNTdCaGpBUnU1OVU4SloxMXRRMWpVRHpaSTljb                                                                                                                                                                                                                                             HFXRzBjSUlTVkc3cE9hS0RnMFJNcGV6NHovZmx1cy9yQVNDaG11R0tvV3d2dmlZejNLMlZiYVRGZERGZ                                                                                                                                                                                                                                             FIyOTlGMHdzT1J5YVFLeWFTbDdTT3NrbitxbnlUczlCQ0dTTXJTeEk5RlBpT01NdWdjMXIyT2xXZG1Hb                                                                                                                                                                                                                                             EcyeVZ4VlhJT0grNDdBREVidTJmZFNBdmJPTzF6WVArNjJOMStIN1VLTjNxQXFjZFpMZTNuVW1wZ2JnV                                                                                                                                                                                                                                             ldIK1NoY1Y2eGxRZGpLMD0tLVAzMEhyZUd0RW54WmRQM1FJV2dhL3c9PQ%3D%3D--7b74a212826b414                                                                                                                                                                                                                                             eb8d8b426829cd812ba5663d9; domain=.site.ru; path=/; expires=Wed, 19 Nov 20                                                                                                                                                                                                                                             25 22:37:08 GMT; secure; HttpOnly
x-request-id: 1632ed21-eb2d-4a44-8029-5f90c6d26eba
x-runtime: 0.064149
vary: Origin

PHP:
Array
(
    [url] => https://site.com/old-url
    [content_type] => text/html; charset=utf-8
    [http_code] => 301
    [header_size] => 876
    [request_size] => 205
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 0,275372
    [namelookup_time] => 0,007077
    [connect_time] => 0,020201
    [pretransfer_time] => 0,238845
    [size_upload] => 0
    [size_download] => 126
    [speed_download] => 458
    [speed_upload] => 0
    [download_content_length] => -1
    [upload_content_length] => -1
    [starttransfer_time] => 0,275305
    [redirect_time] => 0
    [redirect_url] => https://site.com/new-url
    [primary_ip] => 55.55.55.55
    [certinfo] => Array
        (
        )

    [primary_port] => 443
    [local_ip] => 44.44.44.44
    [local_port] => 49296
)



Код:
URL: https://site.com/old-url
Error: Response code is 301
Options:
        Option CURLOPT_URL setted to https://site.com/old-url
        Option CURLOPT_RETURNTRANSFER setted to 1
        Option CURLOPT_FOLLOWLOCATION setted to 1
        Option CURLOPT_USERAGENT setted to Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36
        Option CURLOPT_HEADERFUNCTION setted to (callback) this::_set_headers()


Info:
Array
(
    [url] => https://site.com/old-url
    [content_type] => text/html; charset=utf-8
    [http_code] => 301
    [header_size] => 876
    [request_size] => 63
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 0.058552
    [namelookup_time] => 0.007203
    [connect_time] => 0.020507
    [pretransfer_time] => 0.035463
    [size_upload] => 0
    [size_download] => 126
    [speed_download] => 2172
    [speed_upload] => 0
    [download_content_length] => -1
    [upload_content_length] => -1
    [starttransfer_time] => 0.058496
    [redirect_time] => 0
    [redirect_url] => https://site.com/new-url
    [primary_ip] => 55.55.55.55
    [certinfo] => Array
        (
        )

    [primary_port] => 443
    [local_ip] => 44.44.44.44
    [local_port] => 60756
)

Headers:

Response:
<html><body>You are being <a href="https://site.com/new-url">redirected</a>.</body></html>

Ответ сервера 301, адрес на какой нужно перейти (redirect_url) тоже присутствует. Не понятно что ему не нравится. Единственное что приходит в голову. Это попробовать снести php и установить его заново. Но немного стремно напортачить, раньше этого не делал.
Как ты определил что курл не переходит по редиректу?

В заголовках есть же 301 а потом http/2 200

То есть 2 запроса. Второй после редиректа
 
Как ты определил что курл не переходит по редиректу?
Тем что echo curl_exec ($ch); возвращает содержимое первой страницы а не конечной:
Код:
<html><body>You are being <a href="https://site.com/new-url">redirected</a>.</body></html>

В заголовках есть же 301 а потом http/2 200

То есть 2 запроса. Второй после редиректа
Так это при запросе через консоль сервера есть второй запрос с кодом 200.
При запросе через php где вы увидели второй запрос? Его нет.

Повторюсь, проблема не в самом коде, а в настройках сервера, или его ПО, так как данный код прекрасно работает на аналогичном сервер у которого тоже Centos 7 + VestaCP + php 5.5.38, а так же код отлично работает и на локальном сервере OpenServer на windows 10.

Как вариант...

Посмотри в настройку safe_mode в php.ini
CURLOPT_FOLLOWLOCATION не работает при safe_mode=On

P.S. И еще, очевидный совет
Если используешь OpenServer, сверяй конфиги с продакшн-сервером.
Или используй WSL / Docker / VMWare - тогда все конфиги можно сделать почти зеркальными.
 
Последнее редактирование модератором:
Единственное что приходит в голову. Это попробовать снести php и установить его заново
И это была правильная мысль! Я был прав, проблема была в сервере, помогло полное удаление php и установка его заново. Правда из за этого перестал работать phpmyadmin и rouncoubmail, но это уже к теме не относится.

alex_me, Спасибо за наводку с консолью
 
Назад
Сверху