заголовки ответа cURL - PullRequest
       4

заголовки ответа cURL

3 голосов
/ 25 октября 2011

Я разрабатываю приложение php с библиотекой cURL.

Я хотел бы получить URL-адрес перенаправления (в случае 301 или 302 http-кода).В Windows это просто, мне просто нужно вызвать curl_getinfo ($ ch).Этот метод возвращает ассоциативный массив с redirect_url, который я использую позже.

У меня проблема при перемещении приложения на сервер Linux.Такой метод (curl_getinfo) тоже возвращает массив, но индекса "redirect_url" нет.Хотя я мог попытаться прочитать заголовки как строку.Я устанавливаю

curl_setopt(CURLOPT_HEADERFUNCTION, callback) 

и сохраняю заголовки ответа в виде строки.Затем я использую простой парсер, чтобы получить интересующие меня поля. Но теперь у меня есть другая проблема.URL-адрес перенаправления (http заголовок LOCATION) возвращает относительный URL-адрес (тогда как в Windows он является абсолютным).

Почему существуют различия в Windows cURL и Linux One?Что я могу сделать, чтобы сделать это приложение устойчивым к изменениям ОС?И наконец, как я могу получить это поле (URL-адрес перенаправления) как абсолютный URL-адрес в Linux.

Спасибо за вашу помощь:)

Пример из Windows:

Array
(
[url] => http:// wiadomosci.wp.pl/kat,1342,title,Ciag-dalszy-sporu-wokol-poslow-PiS-Nie-moge-tego-zrobic,wid,13927471,wiadomosc.html
[content_type] => text/html
[http_code] => 302
[header_size] => 2407
[request_size] => 384
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 0.046
[namelookup_time] => 0
[connect_time] => 0.015
[pretransfer_time] => 0.015
[size_upload] => 0
[size_download] => 0
[speed_download] => 0
[speed_upload] => 0
[download_content_length] => 0
[upload_content_length] => 0
[starttransfer_time] => 0.046
[redirect_time] => 0
[certinfo] => Array
    (
    )

[redirect_url] => http:// wiadomosci.wp.pl/kat,1342,title,Ciag-dalszy-sporu-wokol- poslow-PiS-Nie-moge-tego-zrobic,wid,13927471,wiadomosc.html?ticaid=1d436
)

и окна:

Array
(
[url] => http:// wiadomosci.wp.pl/kat,1342,title,Ciag-dalszy-sporu-wokol-poslow-PiS-Nie-moge-tego-zrobic,wid,13927471,wiadomosc.html
[content_type] => text/html
[http_code] => 302
[header_size] => 2425
[request_size] => 384
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 0.023254
[namelookup_time] => 0.001938
[connect_time] => 0.004836
[pretransfer_time] => 0.004847
[size_upload] => 0
[size_download] => 0
[speed_download] => 0
[speed_upload] => 0
[download_content_length] => 0
[upload_content_length] => 0
[starttransfer_time] => 0.023068
[redirect_time] => 0
[certinfo] => Array
    (
    )
)

1 Ответ

1 голос
/ 30 марта 2012

Существует альтернативное решение, которое будет работать на каждой (в настоящее время поддерживаемой) ОС.

Вы можете попросить curl следовать перенаправлению и ограничить его до одной глубины, а затем использовать ключ url из curl_getinfo ($ ch);

Пример:

<?php

$url         = 'http://jigsaw.w3.org/HTTP/300/301.html';
$expectedUrl = 'http://jigsaw.w3.org/HTTP/300/Overview.html';

$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_MAXREDIRS, 1);

$content = curl_exec( $ch );
$response = curl_getinfo( $ch );
curl_close ( $ch );

if ($response['url'] == $expectedUrl)
    echo "I have the correct redirect url\n";
else
    echo "I do not have the correct redirect url\n";

Если вам просто нужен конечный URL, независимо от того, сколько может быть перенаправлений, вы можете удалить опцию CURLOPT_MAXREDIRS (или установить ее на высокое значение, чтобы избежать циклов)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...