是否可以使用服务器端包含来访问服务器外部的文件?
如果不是,还有哪些其他选择可以做到这一点?
使用cURL获取域外的数据。如果您想执行收到的数据,请继续执行eval()
。但是,请注意,这将获得页面的“输出”。这意味着如果它是一个像“.php”页面这样的执行页面,您将获得由于处理它而出现的数据。
<?php
// create a new cURL resource
$ch = curl_init();
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_HEADER, 0);
// grab URL and pass it to the browser
curl_exec($ch);
// close cURL resource, and free up system resources
curl_close($ch);
?>
对于file_get_contents()
, 和fopen()
如果您想获取文件的“实际”内容,则需要在另一台服务器上设置各种代理。(您不能在您的服务器上执行此操作,因为那样会成为服务器端脚本工作方式的安全漏洞)。
<?php
// Read the requested file out
readfile($_GET['file']);
这将为您提供您请求的任何文件的内容:
http://test.com/handler.php?file=handler.php
但是,如果其他人发现它,那可能会很危险。
您没有提到服务器软件,但我假设 Apache,其中 SSI 由mod_include模块提供。include元素不允许远程文件。但是,您有exec,它允许执行任何外部工具;您可以使用它来调用wget或您选择的任何其他命令。
但是,它可能没有那么复杂。如果您可以在本地系统中挂载远程目录,则可以创建一个普通的符号链接并使用常规的 include。
或者,如前所述,PHP 使用起来非常简单。
您可以在 php 中执行类似 file_get_contents() 或 fopen() 的操作,例如
<?php
echo file_get_contents('http://www.example.com/include');
?>
是的,nginx 的服务器端包含可以使用任何完整的 url,例如:
<!--# include virtual="http://www.stackoverflow.com/" -->