PHP ini file_get_contents外部url
我使用下面的PHP函数:
file_get_contents('http://example.com');
每当我在某台服务器上执行此操作时,结果都是空的。 当我在其他地方做的时候,结果就是页面的内容可能是什么。 但是,当我在结果为空的服务器上使用本地函数时 – 无需访问外部URL( file_get_contents('../simple/internal/path.html');
),它确实有效。
现在,我很确定它有一些特定的php.iniconfiguration。 我不知道的是, 哪一个。 请帮忙。
你正在寻找的设置是allow_url_fopen
。
你有两种方法可以不用改变php.ini,其中一个是使用fsockopen()
,另一个是使用cURL 。
无论如何,我build议使用cURL over file_get_contents()
,因为它是为此而构build的。
补充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');
这与iniconfiguration设置allow_url_fopen
。
您应该知道,启用该选项可能会使代码中的一些错误被利用。
例如,validationinput失败可能会变成一个完整的远程代码执行漏洞:
copy($_GET["file"], ".");
$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 url,但如何打开https url帮助我
这也将使外部链接绝对path,而不必使用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 ?>
加:
allow_url_fopen=1
在你的php.ini
文件中。 如果您使用的是共享主机,请先创build一个。
上面提供的答案解决了这个问题,但是没有解释OP描述的奇怪行为。 这个解释应该可以帮助任何人在这些站点都驻留在同一个主机(和同一个虚拟主机;我使用apache 2.4和php7.0)的开发环境中testing站点之间的通信。
有一个与我遇到的file_get_contents()
的微妙之处,这是绝对相关的,但没有得到解决(可能是因为它几乎没有logging或从我可以告诉或logging在一个晦涩的PHP安全模型白皮书,我无法findlogging)。
在allow_url_fopen
在所有相关的上下文(例如/etc/php/7.0/apache2/php.ini
等等)中设置为Off
并且在命令中将allow_url_fopen
设置为On
行上下文(即/etc/php/7.0/cli/php.ini
),对本地资源的调用file_get_contents()
将被允许,并且不会logging任何警告,例如:
file_get_contents('php://input');
要么
// Path outside document root that webserver user agent has permission to read. eg 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
类似于OUTPUT
链中的iptables
规则,其中限制仅在试图“退出系统”或“更改上下文”时被应用。
NB allow_url_fopen
设置为On
命令行上下文环境(即/etc/php/7.0/cli/php.ini
)是我在我的系统上,但我怀疑它不会对我提供的解释,即使它被设置Off
除非你正在通过从命令行本身运行你的脚本进行testing。 我没有在命令行上下文中将allow_url_fopen
设置为Off
的行为进行testing。