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

よくわかりませんが、コードは正常に機能しているようです

試す

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 に答える
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」に設定します。

または、このカールを読んで403エラーが発生しますか?

于 2012-04-24T13:07:22.747 に答える
0

ローカルホストはコンピューターを介してcurlを実行します。それはあなたのブラウザがあなたのIPアドレスなどでサイトを開いたようなものです。

サーバーは別の方法でそれを行います。

/URLの末尾を削除して、小さな問題を解決したことを思い出します。

次のようにコードを実行してみてください

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

しかし、基本的には、別のサイトからディレクトリのデータをフェッチすることは許可されていないと思います。サイトマップを取得するために
URLを終了するべきではありませんか?.xml

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