PHPのcurlやfile_get_contentsでリダイレクトに対応する方法IT系おじさんのチラシの裏2018年10月~プロフィールAUTHOR:とっちら書きたくなったときに書きたいことを書く雑記ブログ。IT系のネタが多いかも知れません。11:57とっちら1年前の記事に助けられました。14:28とっちらこの記事のお陰で60分録画できるようになりました。16:01とっちらライセンスを明示して貰えると使いやすいのですが。14:37ご回答いただきどうもありがとうございます。21:56とっちら超初心者です。)最近、「curl_multiは確かに爆速だった(がcurl_multi_selectのバグでハマった)」の記事へのアクセス数が増えていたので別のトラブル事例も紹介しておきます。過去のcurl_multiの記事で紹介したサンプルとほぼ同じですが、イメージしやすいように対象のURLを1.jpg、2.jpg、3.jpgと変更しています。SSL用のURLへ誘導されるケースが多くなっているぼくは先述のサンプルを応用し、登録した複数のRSSを巡回→そのRSSの中に含まれる画像ファイルをキャッシュ→後で一覧表示する、というプログラムを組んでいます。ある日を境に画像ファイルのキャッシュを失敗するようになりました。試しにブラウザで画像URLを開いても問題なく開けます。同じURLをcurlやfile_get_contentsなどで開くとエラーになる。して、User-Agentを指定しないとbotとして弾かれてるのかなぁ、と思いcurlにChromeのふりをさせても失敗してしまいました。長いこと悩みましたが、わかってみれば単純な話でURLリダイレクトに対応してなかっただけの話でした。Redirectってヤツです。ブラウザで開いた場合はステータス301を受け取ったらブラウザのほうで適切に判断して、リダイレクトしてくれますが、PHPのcurlやfile_get_contentsではリダイレクト先まで読みに行ってくれなかったんですね。最近は暗号化なしのhttp要求があったら、httpsへリダイレクトさせているパターンが多いため、最近になって自作プログラムがエラーを出すようになった、というワケです。原因がわかれば後は対応するだけ。curlで301リダイレクトに対応するcurlでリダイレクトに対応するのはとっても単純で、オプションを追加するだけ。30));↓こうします。true));CURLOPT_FOLLOWLOCATIONをtrueにしただけですね。やるなら、CURLOPT_MAXREDIRSでリダイレクトの最大数も指定しておいたほうが無難。設定を間違えているサーバーのURLなんか開いちゃったらリダイレクトループに陥って帰ってこなくなっちゃいますから。file_get_contentsでリダイレクトに対応する一応、オマケでfile_get_contentsの場合も書いておきます。こちらもまぁオプションを追加するだけといえば追加するだけだけど、ちょっと書き方がわかりづらいかも。$context);file_get_contentsの場合、何かしらオプションを付ける場合には必ずstream_context_createを使ってコンテキストリソースを作る感じです。この方法を使うと単にオプション指定だけではなく、POST処理やクッキーを持たせた状態でのアクセスなんかもできちゃうので、ちょっとしたブラウザ操作みたいなことも可能です。このfile_get_contentsによる自動操作も結構面白いので機会があれば記事にしてみたいですね。まとめブラウザでは開けるのにcurlやfile_get_contentsでは開けないURLがある場合、301リダイレクトなどの指定がされていないか確認する。curlでリダイレクトに対応するためにはオプションでCURLOPT_FOLLOWLOCATIONを指定する。file_get_contentsでリダイレクトに対応するためにはオプションでfollow_locationを指定する。いったところでしょうか。わかってしまえば単純だし、なんでこんなことで悩んでいたんだろうと思いますが、こういう単純な原因こそハマると長いんですよねぇ。curlやfile_get_contentsでのリダイレクト対応でハマっている方へこの記事が届くことを願います。APIを使っている人は多02021-03-16Windows環境にphpmyadminをインストールする最近のレンタルサーバーなら管理ページでポチっとボタンひとつでphpmyadminのインストールくらい完了しますし、手動でやるとしても公式サイトからZIPをダウンロードして解凍してアップロードする程度で02020-06-19Windows版PHPでSFTP接続するにはphp_ssh2.dllが必要Web運営のメンテナンス作業(ローカルへのバックアップ作業とか)を自動化する方法について4回にわけて記事にしてきました。コメント投稿直後ならコメントの編集/削除が可能です。※24時間経過するか、新しく投稿した場合は古い投稿の編集や削除は出来ません。※ブラウザでCookieが受け入れられない場合はこの機能は使えません。非公開にチェックを入れたコメントは管理人のみ閲覧できます。コメント投稿のガイドライン誰もが閲覧できるコメント欄ですので個人が特定できる情報等は書き込まないようにしましょう。他人のHPやブログの文章を掲載する場合は著作権法第32条「引用」の条件を満たすかご確認ください。誹謗中傷にあたる表現などは場合によっては法的な責任を問われる可能性があるためご注意ください。とっちらか~るTOP。