我很困惑为什么这两个东西是或者看起来是相互排斥的,并且想知道是否有办法在PHP-5.4上同时使用这两个东西。尝试设置此选项,我收到以下错误:
curl_setopt(): CURLOPT_FOLLOWLOCATION cannot be activated when an open_basedir is set
我使用的MailChimp API库需要设置CURLOPT_FOLLOWLOCATION。重定向可以发生,应该遵循,这就是互联网的工作方式。
我也在域上使用open_basedir。我想围绕网站能够访问的目录。它只是一种安全的东西,以及其他安全措施的带和括号。
那么,有没有办法同时使用它们?我希望CURL遵循重定向,但也保持PHP脚本的本地文件访问到定义的目录。我见过的解决这个问题的唯一方法就是在重定向后模拟CURL,但这看起来很笨拙,那么CURL就已经设计好了。
编辑:
如果不清楚,这是在我正在使用的包中抛出错误的行:
curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, true);
IMO PHP过于保护,它应该允许我这样做。那么有没有一种方法 - 没有黑客/分支这个包 - 告诉PHP,“看,我知道我在这里做什么”?
我已将其作为包开发人员的问题提出,但迄今未得到回应。如果包支持传输层的注入,那么我可以通过使用PHP的curl函数替代它来解决它。
答案 0 :(得分:4)
我要撤回这个问题,因为它似乎让人感到困惑(编辑:对不起,听起来居高临下,这不是故意的;我没有正确解释问题,以及我和其他人所施加的限制任何建议的解决方案)。
答案似乎是,“不,你不能这样做”。 PHP curl(curl_setopt)上的CURLOPT_FOLLOWLOCATION选项和php.ini中的open_basedir选项基本上是不兼容的,并且没有一种程序化的方法可以让它们协同工作。
我将fork第三方包替换CURLOPT_FOLLOWLOCATION选项,并在代码中使用手动重定向解决方法,在SO上有一些示例。我会继续推动软件包开发人员修复这个bug。
感谢您花时间回复。
编辑:这里真正的问题是由于在DECADE之前提出错误而由PHP强加的钝器解决方案:
https://bugs.php.net/bug.php?id=30609
问题出现在curl库中 - 如果PHP告诉它不应该允许它潜入本地文件系统(可能除了open_basedir目录)。由于curl和PHP没有在一起完成这十年的整理,所以是时候停止使用卷曲 - 它不适合用途。 IMO。
答案 1 :(得分:0)
Curl是独立的lib,不应该直接受到PHP open_basedir
的影响。
你怎么称呼这个?你能提供一些代码和更详细的解释吗?
“ Curl目标应用具有限制性open_basedir
”
和
“ Curl源应用具有限制性open_basedir
”
是两件不同的事情。 PHP的open_basedir
应仅影响传入请求。
编辑:
在PHP 5.3.0之后 open_basedir
可以更改运行时。它是listed in the manual。这也解释了in the general section,但解释非常非常模糊:
Name: Default: Changeable: Changelog:
open_basedir NULL PHP_INI_ALL PHP_INI_SYSTEM in PHP < 5.3.0
如果您有权访问或关闭源代码,请仅在需要时调用它。 干杯!