0

我需要从 sitemap.xml 文件中获取页面 url 的 http 响应代码。当我通过我的 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>";
}

谢谢..

4

3 回答 3

0

这可能有很多原因......

是你自己的服务器吗?=> 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 错误?

于 2012-04-24T13:07:22.747 回答
0

您的本地主机通过您的计算机运行 curl。就像您的浏览器使用您的 IP 地址和其他内容打开了该站点。

服务器以另一种方式执行此操作。

/我记得有一次我通过删除url 中的尾随解决了一个类似的问题。

尝试运行代码为

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

但基本上我认为您不允许从另一个站点获取目录的数据。
网址不应该.xml以获取站点地图为结尾吗?

$pageurl = 'http://www.certona.com/sitemap.xml';
于 2012-04-24T13:11:06.207 回答
0

我不确定,但您的代码似乎工作正常

尝试

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] => 
)
于 2012-04-24T13:13:42.610 回答