PHPのfile_get_contents(cURL)がリダイレクトループする場合の対応方法

fgcredirect

PHPのfile_get_contentsで指定したURLがリダイレクトループして結果を取得できない場合の対応方法です。当ブログでhttp→httpsへリダイレクトする処理がループしていました。検索エンジンやお気に入りからhttpのURLへアクセスがあった場合のリダイレクトは正常だったため、ハマりました。

スポンサーリンク

対象読者

PHPにて以下のエラーにお悩みの方など。

file_get_contents処理時

failed to open stream: Redirection limit reached, aborting in…

cURL処理時

Maximum (20) redirects followed

それぞれの意味は同じで、「指定したURLにアクセスしようとしたらリダイレクトしていて、リダイレクトの回数上限に達しました」ということです。リダイレクトループしていることが原因です。

対応方法

原因は.htaccessの指定でした。file_get_contentsの指定と、対応前後の.htaccessを記載します。

【file_get_contents】

file_get_contents = 'https://webtatan.com/blog/wp-json/wp/v2/posts?_embed&filter[posts_per_page]=5'

【対応前】

RewriteCond %{HTTP:X-Sakura-Forwarded-For} ^$
RewriteRule ^(.*)$ https://webtatan.com/blog/$1 [R=301,L]

【対応後】

#file_get_contentsで指定するURLはリダイレクトの対象外とする
RewriteCond %{QUERY_STRING} !filter%5bposts_per_page%5d=5
RewriteCond %{HTTP:X-Sakura-Forwarded-For} ^$
RewriteRule ^(.*)$ https://webtatan.com/blog/$1 [R=301,L]

file_get_contentsでgetパラメータを指定しているので、RewriteCond %{QUERY_STRING}で該当のgetパラメータが含まれない場合のみ、リダイレクトするように指定しています。RewriteCondはデフォルトでAnd条件です。詳しく見てみます。

RewriteCond %{QUERY_STRING} !filter%5bposts_per_page%5d=5

ポイントはふたつあって、

  • パラメータの前に!で否定条件とすること
  • []はURIエンコードすること(%5b %5d)

です。[]以外にURLエンコードする必要がある文字列はハッキリとわかりませんが、もしうまくいかない場合、URLに記号が入っている場合はエンコードを疑ってください。

file_get_contentsでhttpステータスを確認する

以下の内容でhttpステータスコードが確認できます。

$context = stream_context_create(array(
  'http' => array('ignore_errors' => true)
));
$json = file_get_contents($url,false,$context);
echo $http_response_header[0];

‘ignore_errors’ => trueでエラーでも結果を返すようにし、$http_response_header[0]を表示することで内容が確認できます。

出力結果

HTTP/1.1 301 Moved Permanently

301リダイレクトしています。(.htaccessで301リダイレクトを指定しているため)

まとめ

今回はエラー内容でググっても英語のサイトしかヒットせず、ハマりました。なんとなく.htaccessが悪いのだと思いながらも.htaccess自体の理解が足りないため、原因特定まで時間がかかりました。

依然として、PHPから指定したときだけループしてしまう根本原因はわからずです。もし分かる方がいましたら、コメントでもTwitterでもいいので教えてください。

スポンサーリンク

この記事が気に入っていただけたらシェアお願いします。励みになります。

関連記事はありませんでした

prev WP REST API v2 WordPressの新着記事をアイキャッチ画像付きで取得する方法 next JavaScript初心者向け!関数、オブジェクト、メソッド書き方ガイド

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です