『ネットオウルユーザーコミュニティ』の提供に伴い、『Q&A掲示板』は2025年3月31日正午をもって提供を終了します。[関連ニュース]

メンバーメニュー

ようこそ、ゲストさん

トップ > カテゴリ一覧 > 各種プラン > PHPのcurlコマンドで403エラーが返ってくるページがある

質問

  • ライト

    PHPのcurlコマンドで403エラーが返ってくるページがある
  • 本文:

    PHPで外部のページの情報を取得したいと思っているのですが、スターサーバーで試すとどうしても403エラーが返ってきてしまうページがあります。
    具体的には、ブクログという読書管理サービスのRSSです。


    PHPのコードは下記のようなものです(いろいろ調べながら書いたので、設定情報の出力もしています)。

    <?php
    $url = "https://booklog.jp/users/amano225/feed/";
    $curl = curl_init();

    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_HEADER, 1);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);

    curl_setopt($curl,CURLINFO_HEADER_OUT,true);
    curl_setopt($curl, CURLOPT_USERAGENT, 'CURL');

    $res = curl_exec($curl);

    echo '<pre>';
    echo 'CURLINFO_REDIRECT_COUNT:';
    echo curl_getinfo($curl,CURLINFO_REDIRECT_COUNT) . "\n";
    echo 'CURLINFO_EFFECTIVE_URL:';
    echo curl_getinfo($curl,CURLINFO_EFFECTIVE_URL) . "\n";
    echo 'CURLINFO_PRIMARY_IP:';
    echo curl_getinfo($curl,CURLINFO_PRIMARY_IP) . "\n";
    echo 'CURLINFO_PRIMARY_PORT:';
    echo curl_getinfo($curl,CURLINFO_PRIMARY_PORT) . "\n";
    echo 'CURLINFO_LOCAL_IP:';
    echo curl_getinfo($curl,CURLINFO_LOCAL_IP) . "\n";
    echo 'CURLINFO_LOCAL_PORT:';
    echo curl_getinfo($curl,CURLINFO_LOCAL_PORT) . "\n";
    echo 'CURLINFO_SIZE_UPLOAD:';
    echo curl_getinfo($curl,CURLINFO_SIZE_UPLOAD ) . "\n";
    echo 'CURLINFO_SSL_VERIFYRESULT :';
    echo curl_getinfo($curl,CURLINFO_SSL_VERIFYRESULT ) . "\n";
    echo 'CURLINFO_CONTENT_TYPE:';
    echo curl_getinfo($curl,CURLINFO_CONTENT_TYPE ) . "\n";
    echo 'CURLINFO_RESPONSE_CODE :';
    echo curl_getinfo($curl,CURLINFO_RESPONSE_CODE ) . "\n";
    echo 'CURLINFO_HTTP_CONNECTCODE:';
    echo curl_getinfo($curl,CURLINFO_HTTP_CONNECTCODE ) . "\n";
    echo 'CURLINFO_HTTP_VERSION:';
    echo curl_getinfo($curl,CURLINFO_HTTP_VERSION ) . "\n";
    echo 'CURLINFO_PROTOCOL:';
    echo curl_getinfo($curl,CURLINFO_PROTOCOL) . "\n";
    echo 'CURLINFO_PROXY_SSL_VERIFYRESULT:';
    echo curl_getinfo($curl,CURLINFO_PROXY_SSL_VERIFYRESULT) . "\n";
    echo 'CURLINFO_SCHEME:';
    echo curl_getinfo($curl,CURLINFO_SCHEME) . "\n";
    echo 'CURLINFO_HEADER_OUT:';
    echo curl_getinfo($curl,CURLINFO_HEADER_OUT);

    curl_close($curl);
    var_dump($res);

    echo '</pre>';
    exit;
    ?>

    ローカルのPCにXAMPPをインストールして動かすと、問題なく返ってきます。
    ローカルで動かした結果と見比べると、スターサーバーで動かしたほうではCURLINFO_SCHEMEやCURLINFO_HTTP_VERSIONが空となるので、そのあたりが関係しているのではないかと思っています。

    なお、ブクログではなくYahoo!JAPANのサイトだと、問題なく取得できます。

    何か設定が足りないと思っているですが、分かる方いればご教示いただきたいです。
    よろしくお願いします。

  • 緊急度:通常投稿者:amano225さん投稿時間:2023/02/19 12:13
質問に対する回答は締め切られました

回答 No.12246

  • この回答がベストアンサーです

  • 本文:

    403になるのは、相手から何らかの理由で、アクセスを拒否されている。
    たとえば、短期間に頻繁にアクセスがある場合などもあります。

    たぶん、今回はそれに該当するのでは?と思う。

    アクセス拒否してる場合は、相手側の裁量なので、どんなルールで拒否してるかは、公開されてない限りはわかりません。



    実際にスターサーバーで、質問文のPHPのプログラムをそのまま実行してみたら、ちゃんと取得できました。

    https://booklog.jp/users/amano225/feed/

    となってるので、ブクログという読書管理サービスのRSSですよね。



    >スターサーバーで動かしたほうではCURLINFO_SCHEMEやCURLINFO_HTTP_VERSIONが空と


    「PHP 7.3.0 および cURL 7.50.0 以降」でないと使えない定数

    私はPHP8で試してるので、スターサーバーに入っているcURLのバージョンが古いからでは?と思う。

    =>たぶん正常動作



    Warning: Use of undefined constant CURLINFO_HTTP_VERSION - assumed 'CURLINFO_HTTP_VERSION' (this will throw an Error in a future version of PHP)

    Warning: Use of undefined constant CURLINFO_PROTOCOL - assumed 'CURLINFO_PROTOCOL' (this will throw an Error in a future version of PHP)


    ------
    CURLINFO_HTTP_VERSION (int)
    PHP 7.3.0 および cURL 7.50.0 以降で使用可能です。

    CURLINFO_PROTOCOL (int)
    PHP 7.3.0 および cURL 7.52.0 以降で使用可能です。

    https://www.php.net/manual/ja/curl.constants.php

  • 投稿者:k-tanさん 投稿時間:2023/02/19 14:41
質問者からのコメント

k-tanさん。回答ありがとうございます。
k-tanさんの環境では動くのですね…。
実は最近までfile_get_contentsを利用して動いていたのですが、curlだったらできるかな?と思って色々思考錯誤していました。
その際、ページにアクセスする度に呼ぶようにしていたのでそれが原因だったかもしれないです…(キャッシュ処理を入れておくんでした…)。
残念ですが、あきらめます。ありがとうございます。

ちなみに、PHPのバージョンは7.4.33を利用しています。
試しに、8.0.25にアップしたみたのですが、そうするとPHP自体が「curl_getinfo($curl,CURLINFO_HTTP_VERSION ) 」の箇所で500エラーとなってしまいました。

curlのバージョンについては、phpinfo()で調べてみると7.29.0でしたので、curl自体のバージョンが古いようです(ローカル環境でのcurlのバージョンは7.85.0でした)

質問文に書き忘れたのですが、返ってくるエラーメッセージは下記のようなものです。
「Request blocked.
We can't connect to the server for this app or website at this time. There might be too much traffic or a configuration error. Try again later, or contact the app or website owner.


If you provide content to customers through CloudFront, you can find steps to troubleshoot and help prevent this error by reviewing the CloudFront documentation.

Generated by cloudfront (CloudFront)」

AWSのCloudFrontが出力しているエラーメッセージのようで、「cloudfront 403」で検索すると、事例は結構あるようです。
例えば、GET呼び出しなのに、リクエストボディに値が入っていると403を返すとのことなので、試しにローカル環境で「curl_setopt($curl, CURLOPT_POSTFIELDS, '');」という指定を追加してリクエストボディを追加すると、403エラーで返ってきます(ただ、この時のエラー内容はブクログから生成と思われるHTMLなため、結果は異なっていました)。