PHP のcurl 関数を使用すると、警告:curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION は、safe_mode または open_basedir が設定されている場合はアクティブにできません… というメッセージが表示されます。以下に、この問題のトラブルシューティング方法を紹介します。
php で CURLOPT_FOLLOWLOCATION を実行し、php プロンプト エラー メッセージが表示された場合:
警告:curl_setopt() [function.curl-setopt]:safe_mode または open_basedir が設定されている場合、CURLOPT_FOLLOWLOCATION をアクティブ化できません&hellip ;
エラーには、safe_mode と open_basedir という 2 つの重要な点が記載されています。仮想ホストで APPCHE を設定する権限がない場合、サーバー構成を変更しても問題を解決できません。
一般的に。つまり、サーバー設定のsafe_modeはすべてオフになっており、open_basedirを設定して仮想ホストユーザーのPHP実行フォルダーを制限することで、セキュリティのためにユーザーにいくつかの制限がかかります。 したがって、CURLOPT_FOLLOWLOCATION( phpカール関数、ディープクローリングデータ)、301リダイレクトが発生すると、記事に記載されているエラーメッセージが表示されます
関連情報を確認した後、すぐに解決策を見つけました
。具体的な方法は、curl ステートメントを使用します。curl_exec 関数を使用するかどうかを指定します。
curl_exec 関数をカスタマイズします。curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
function curlExec(/* Array */$curlOptions='', /* Array */$curlHeaders='', /* Array */$postFields='') { $newUrl = ''; $maxRedirection = 10; do { if ($maxRedirection<1) die('Error: reached the limit of redirections'); $ch = curl_init(); if (!empty($curlOptions)) curl_setopt_array($ch, $curlOptions); if (!empty($curlHeaders)) curl_setopt($ch, CURLOPT_HTTPHEADER, $curlHeaders); if (!empty($postFields)) { curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields); } if (!empty($newUrl)) curl_setopt($ch, CURLOPT_URL, $newUrl); // redirect needed $curlResult = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($code == 301 || $code == 302 || $code == 303 || $code == 307) { preg_match('/Location:(.*?)\n/i', $curlResult, $matches); $newUrl = trim(array_pop($matches)); curl_close($ch); $maxRedirection--; continue; } else // no more redirection { $code = 0; curl_close($ch); } } while($code); return $curlResult; }