我使用以下PHP函数:
file_get_contents('http://example.com');
每当我在某个服务器上执行此操作时,结果为空。当我在其他任何地方进行此操作时,结果就是页面的内容可能是什么。但是,当我在结果为空的服务器上,在本地使用该函数时 - 无需访问外部URL(file_get_contents('../simple/internal/path.html');
),它 工作。
现在,我很确定它与某个php.ini配置有关。我不确定的是,哪个一个。请帮忙。
答案 0 :(得分:39)
您要查找的设置为allow_url_fopen
。
你可以通过两种方式绕过它,而无需更改php.ini,其中一种方法是使用fsockopen()
,另一种方法是使用cURL。
我建议使用cURL而不是file_get_contents()
,因为它是为此而构建的。
答案 1 :(得分:31)
补充Aillyn的答案,您可以使用类似下面的函数来模仿file_get_contents的行为:
function get_content($URL){
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $URL);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
echo get_content('http://example.com');
答案 2 :(得分:4)
与ini配置设置allow_url_fopen
相关。
您应该知道,启用该选项可能会使代码中的某些错误变得可利用。
例如,验证输入失败可能会变成一个成熟的远程执行代码漏洞:
copy($_GET["file"], ".");
答案 3 :(得分:4)
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.your_external_website.com");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$result = curl_exec($ch);
curl_close($ch);
最适合http网址, 但是如何打开https url帮助我
答案 4 :(得分:2)
上面提供的答案解决了这个问题,但没有解释OP描述的奇怪行为。这个解释应该有助于测试开发环境中站点之间的通信,这些站点都位于同一主机上(和相同的虚拟主机;我正在使用apache 2.4和php7.0)。
我遇到的file_get_contents()
的精妙之处在这里绝对相关,但没有得到解决(可能是因为它几乎没有记录或没有记录我可以告诉或记录在一个模糊的php安全模型白皮书我找不到。
在所有相关上下文中将allow_url_fopen
设置为Off
(例如/etc/php/7.0/apache2/php.ini
,/etc/php/7.0/fpm/php.ini
等...)并将allow_url_fopen
设置为{{1}在命令行上下文中(即On
),将允许对/etc/php/7.0/cli/php.ini
调用本地资源,并且不会记录任何警告,例如:
file_get_contents()
或
file_get_contents('php://input');
或
// Path outside document root that webserver user agent has permission to read. e.g. for an apache2 webserver this user agent might be www-data so a file at /etc/php/7.0/filetoaccess would be successfully read if www-data had permission to read this file
file_get_contents('<file path to file on local machine user agent can access>');
总而言之,限制// Relative path in same document root
file_get_contents('data/filename.dat')
类似于allow_url_fopen = Off
链中的iptables
规则,其中限制仅适用于尝试退出系统&#34; 34;或者&#34;改变背景&#34;是的。
N.B。 OUTPUT
在命令行上下文中设置为allow_url_fopen
(即On
)是我在系统上的内容,但我怀疑它与我提供的解释无关,即使它已设置到/etc/php/7.0/cli/php.ini
,除非您通过命令行本身运行脚本来进行测试。我没有在命令行上下文中将Off
设置为allow_url_fopen
来测试行为。
答案 5 :(得分:1)
这也将为外部链接提供绝对路径,而无需使用php.ini
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.your_external_website.com");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$result = curl_exec($ch);
curl_close($ch);
$result = preg_replace("#(<\s*a\s+[^>]*href\s*=\s*[\"'])(?!http)([^\"'>]+)([\"'>]+)#",'$1http://www.your_external_website.com/$2$3', $result);
echo $result
?>
答案 6 :(得分:1)
在 PHP INI 部分从 cPanel 或 WHM 启用 allow_url_fopen
答案 7 :(得分:0)
添加:
allow_url_fopen=1
在php.ini
文件中。如果您使用的是共享主机,请先创建一个。