Запрос curl возвращает неверный код ответа

Мне нужно получить код ответа http для URL-адресов страниц из файла sitemap.xml. Когда я получаю код ответа от моего процесса cron, он возвращает 403 (известный как доступ запрещенный: хотя я могу получить доступ к переданному URL-адресу из браузера).

Но если я запускаю тот же код с моего локального хоста, он возвращает правильный код ответа http (т.е. 200).

Почему разница в возврате другого кода ответа http с локального хоста и с сервера? Как решить проблему?

Код для извлечения кода ответа http приведен ниже.

function check_response_code() {
    $pageurl='http://www.certona.com/online-merchandising/';
    $trimurl = '';
    $start = '';
    $end = '';
    $total = '';

    $start = microtime(true);
    $response_code = '';
    if (!stristr($pageurl, "http://"))
    {
        if (!stristr($pageurl, "https://"))
        {
            $trimurl = "http://" . $pageurl;
        } else
        {
            $trimurl = $pageurl;
        }
    } else
    {
        $trimurl = $pageurl;
    }
    $curl = curl_init();
    //don't fetch the actual page, you only want headers

    curl_setopt($curl, CURLOPT_URL, $trimurl);
    curl_setopt($curl, CURLOPT_NOBODY, true);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_FILETIME, true);

    $result = curl_exec($curl);

    $timestamp = curl_getinfo($curl, CURLINFO_FILETIME);
    $response_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    $mime_type = curl_getinfo($curl, CURLINFO_CONTENT_TYPE);
    $end = microtime(true);
    $total = round($end - $start, 5);

    if ($timestamp != -1)
    { //otherwise unknown
        $arr=array(date("Y-m-d H:i:s", $timestamp), $response_code, $total, $mime_type); //etc
    } else
    {
        $arr=array("", $response_code, $total, $mime_type);
    }
    echo "<pre>";
    print_r($arr);
    echo "</pre>";
}

Спасибо..


person nir    schedule 24.04.2012    source источник


Ответы (3)


Не уверен, но ваш код работает нормально

Пытаться

check_response_code();

function check_response_code() {
    $pageurl='http://www.certona.com/online-merchandising/';
    $curl = curl_init($pageurl);
    curl_setopt($curl, CURLOPT_NOBODY, true);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_FILETIME, true);

    $result = curl_exec($curl);
    $info = curl_getinfo($curl);
    $info['filetime'] = date("Y-m-d H:i:s", $info['filetime']);
    echo "<pre>";
    print_r($info);
    echo "</pre>";
}

Выход

Array
(
    [url] => http://www.certona.com/online-merchandising/
    [content_type] => text/html; charset=utf-8
    [http_code] => 200
    [header_size] => 488
    [request_size] => 76
    [filetime] => 2012-04-24 15:11:28
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 1.342
    [namelookup_time] => 0
    [connect_time] => 0.25
    [pretransfer_time] => 0.25
    [size_upload] => 0
    [size_download] => 0
    [speed_download] => 0
    [speed_upload] => 0
    [download_content_length] => 0
    [upload_content_length] => 0
    [starttransfer_time] => 1.342
    [redirect_time] => 0
    [certinfo] => Array
        (
        )

    [redirect_url] => 
)
person Baba    schedule 24.04.2012
comment
привет ... это вывод с локального хоста. но когда я пробую тот же код из процесса cron на сервере, он возвращает другой код ответа http .. (например, 403 вместо 200)! - person nir; 25.04.2012

На это может быть много причин...

Это ваш собственный сервер? => http://codewithdesign.com/2011/05/26/curl-403-error-returning/

Возможно, установите для CURLOPT_USERAGENT значение «Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv: 1.7.5) Gecko/20041107 Firefox/1.0».

Или прочитайте это curl выдает ошибку 403?

person PiTheNumber    schedule 24.04.2012
comment
CURLOPT_USERAGENT немного помогает, когда я сохраняю сон (10) между запросами.. но если я не использую сон (10), я получаю код ответа 403 через некоторое время. - person nir; 25.04.2012

Ваш локальный хост запускает curl через ваш компьютер. Как будто ваш браузер открыл сайт с вашим IP-адресом и прочим.

Сервер делает это по-другому.

Я помню, как однажды решил похожую проблему, удалив конечный / в URL-адресе.

Попробуйте запустить код как

$pageurl = rtrim('http://www.certona.com/online-merchandising/', '/)';

Но в целом я не думаю, что вам разрешено извлекать данные каталога с другого сайта.
Разве URL-адрес не должен заканчиваться на .xml, чтобы получить карту сайта?

$pageurl = 'http://www.certona.com/sitemap.xml';
person Robin Castlin    schedule 24.04.2012
comment
Привет .. sitemap.xml содержит URL-адреса ссылок сайта. Здесь URL-адрес страницы является одним из URL-адресов ссылок из файла sitemap.xml. Спасибо за ответ. - person nir; 25.04.2012
comment
привет .. я попытался удалить '/' и сохранить '/'. но нет никакой разницы в реакции завитка на локальном. В обоих случаях я получаю код ответа 200 на локальном компьютере и 403 на сервере! . - person nir; 25.04.2012