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

Тема в разделе "Как сделать...", создана пользователем Aizen, 20 ноя 2020 в 21:13.

  1. Aizen

    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 ($chCURLOPT_RETURNTRANSFER1);
        
    curl_setopt ($chCURLOPT_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 ($chCURLOPT_HEADER0);
        
    curl_setopt ($chCURLOPT_TIMEOUT15);
        
    curl_setopt ($chCURLOPT_FOLLOWLOCATION1);
        
    curl_setopt ($chCURLOPT_MAXREDIRS15);
        
    $document curl_exec ($ch);
        
    curl_close ($ch);
        return 
    $document;
    }
    На локальном сервере этот код работает отлично и редирект срабатывает.
    Пробовал обновить curl на сервере до версии 7.73.0, но не помогло.
    Долго мучил гугл но так никакого решения не нашел. Подскажите пожалуйста в какую сторону копать, какие логи смотреть?
     
  2. alex_me

    alex_me

    Регистр.:
    25 янв 2017
    Сообщения:
    170
    Симпатии:
    120
    Попробуй в консоли на том же сервере проверить
    $ curl -iL http://bla-bla

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

    PS. И в php-коде тоже включи вывод заголовка, и сравни вывод там и там
    в помощь https://stackabuse.com/follow-redirects-in-curl/
     
  3. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    512
    Симпатии:
    1.183
    Какой ответ сервера? Какие заголовки, какое тело ответа? Может там на html или на js редирект?

    Попробуй через этот класс
    https://github.com/MashinaMashina/request

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

    И нам отправь
     
  4. Aizen

    Aizen Создатель

    Регистр.:
    18 мар 2016
    Сообщения:
    17
    Симпатии:
    4
    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/htmlcharset=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 и установить его заново. Но немного стремно напортачить, раньше этого не делал.
     
    Последнее редактирование: 21 ноя 2020 в 13:31
  5. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    512
    Симпатии:
    1.183
    Как ты определил что курл не переходит по редиректу?

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

    То есть 2 запроса. Второй после редиректа
     
  6. Aizen

    Aizen Создатель

    Регистр.:
    18 мар 2016
    Сообщения:
    17
    Симпатии:
    4
    Тем что echo curl_exec ($ch); возвращает содержимое первой страницы а не конечной:
    Код:
    <html><body>You are being <a href="https://site.com/new-url">redirected</a>.</body></html>
    Так это при запросе через консоль сервера есть второй запрос с кодом 200.
    При запросе через php где вы увидели второй запрос? Его нет.
     
    Последнее редактирование: 21 ноя 2020 в 21:38
  7. Aizen

    Aizen Создатель

    Регистр.:
    18 мар 2016
    Сообщения:
    17
    Симпатии:
    4
    Повторюсь, проблема не в самом коде, а в настройках сервера, или его ПО, так как данный код прекрасно работает на аналогичном сервер у которого тоже Centos 7 + VestaCP + php 5.5.38, а так же код отлично работает и на локальном сервере OpenServer на windows 10.
     
  8. alex_me

    alex_me

    Регистр.:
    25 янв 2017
    Сообщения:
    170
    Симпатии:
    120
    Как вариант...

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

    P.S. И еще, очевидный совет
    Если используешь OpenServer, сверяй конфиги с продакшн-сервером.
    Или используй WSL / Docker / VMWare - тогда все конфиги можно сделать почти зеркальными.
     
    Последнее редактирование: 22 ноя 2020 в 11:57