如何解决PHP cURL警告(curl_set_opt_array():设置open_basedir时无法激活CURLOPT_FOLLOWLOCATION)

本文概述

  • 为什么会这样
  • 可能的解决方案
  • 结束
cURL是一个库, 可让你使用PHP发出HTTP请求。 PHP中的curl_exec命令是从控制台使用curl的桥梁。 curl_exec使得轻松快速地执行GET / POST请求, 从JSON等其他服务器接收响应以及下载文件变得容易。
在某些开发环境中, 由于使用了CURLOPT_FOLLOWLOCATION, 因此以下代码的执行将引发上述问题:
< ?php $ch = curl_init(); curl_setopt( $ch, CURLOPT_URL, "http://someweb.com/some-api.json"); // URL to post curl_setopt ($ch, CURLOPT_POST, 1); curl_setopt ($ch, CURLOPT_POSTFIELDS, "username=Batman& password=DoYouWantToKnowMySecretIdentity"); curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1); // 1 or TRUE // Execute $result = curl_exec( $ch ); curl_close($ch); // Show "response" echo "Reply Response: " . $result;

在本文中, 你将学习为什么会发生这种情况以及如何解决。
为什么会这样 当你的PHP配置不允许你跟踪位置时, 会发生此错误。
如何解决PHP cURL警告(curl_set_opt_array():设置open_basedir时无法激活CURLOPT_FOLLOWLOCATION)

文章图片
可能的解决方案 在每种环境和情况下, 并非所有列出的选项都对你有用:
1.将CURLOPT_FOLLOWLOCATION设置为false
CURLOPT_FOLLOWLOCATION选项指示cURL是否应遵循HTTP 3xx重定向。当你请求URL时, 有时可以将你重定向到其他URL, 例如在PHP中, 你可以使用以下方法重定向:
header('Location: http://example.com/');

【如何解决PHP cURL警告(curl_set_opt_array():设置open_basedir时无法激活CURLOPT_FOLLOWLOCATION)】默认情况下, 此选项是禁用的, 通常没有充分的理由将其禁用, 但是, 如果你知道自己在做什么, 并且可以确定自己的请求不会被重定向, 则只需禁用该选项即可:
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, FALSE);

2.禁用PHP的安全模式
安全模式是一种尝试解决在共享托管环境中运行启用PHP的Web服务器时引入的一些问题的尝试。但是, 由于安全模式强加的附加安全检查是在PHP级别执行的, 因为底层的Web服务器和操作系统安全体系结构通常不足以对多用户环境施加必要的安全限制, 在该环境中, 许多用户可能会能够上传和执行PHP代码。
启用安全模式会对PHP脚本施加一些限制, 这些限制主要与文件访问, 对环境变量的访问以及控制外部进程的执行有关。当启用FOLLOWLOCATION选项时, 这些限制会影响cURL, 因此, 如果无法在cURL中禁用该选项, 为了使脚本正常工作, 你需要通过修改php.ini文件来禁用安全模式。
使用任何代码或文本编辑器, 编辑php.ini文件, 搜索safe_mode选项, 并将Off设置为值, 因为可能已经使用On了。
如何解决PHP cURL警告(curl_set_opt_array():设置open_basedir时无法激活CURLOPT_FOLLOWLOCATION)

文章图片
重新启动apache, 然后重试以执行脚本。另外, 如果你无法在环境中修改php.ini文件, 则可以尝试使用以下脚本在PHP中动态设置此属性:
ini_set('safe_mode', false);

尽管第二种方法不太适合大多数开发人员, 但值得尝试。
3.将open_basedir设置为none
open_basedir函数使用fopen()和gzopen()之类的函数定义允许PHP访问文件的位置或路径。如果文件不在open_basedir定义的路径之外, PHP将拒绝打开它。你不能将符号链接用作解决方法, 因为符号链接解析为的路径受open_basedir函数的限制。
要禁用open_basedir选项, 我们只需要在php.ini文件中对其进行注释即可。打开代码或文本编辑器, 然后编辑php.ini文件, 搜索open_basedir选项并在其前面加上; 进行注释:
; open_basedir, if set, limits all file operations to the defined directory ; and below.This directive makes most sense if used in a per-directory ; or per-virtualhost web server configuration file. ; http://php.net/open-basedir ; open_basedir =

保存更改, 重新启动apache并尝试再次执行脚本。
如果你使用Plesk从GUI修改open_basedir, 则可以在服务器中任一个。打开plesk, 导航到你的域, 然后打开PHP设置。
如何解决PHP cURL警告(curl_set_opt_array():设置open_basedir时无法激活CURLOPT_FOLLOWLOCATION)

文章图片
现在, 从列表中继续搜索open_basedir, 然后从列表中选择一个:
如何解决PHP cURL警告(curl_set_opt_array():设置open_basedir时无法激活CURLOPT_FOLLOWLOCATION)

文章图片
保存更改, 然后尝试再次执行脚本。
结束 如果你使用像Unirest这样的库, 并且出现这样的错误, 则可以通过将CURLOPT_FOLLOWLOCATION选项设置为false来尝试第一个选项, 而无需使用以下方法修改库源代码:
Unirest\Request::curlOpts(array( CURLOPT_FOLLOWLOCATION => false ));

别忘了与社区分享哪个选项对你有效, 祝你编程愉快!

    推荐阅读