我在包含 php 文件时遇到了一些非常奇怪的行为。
我需要加载一个与将调用它的页面不在同一域上的脚本。
我已经创建了一个使用 cURL 工作的系统,但我最近才发现许多需要访问此脚本的站点都没有安装 cURL。但是,我确实注意到这些网站allow_url_fopen
设置为on
。有了这些知识,我开始创建一个新系统,让我只在远程站点上包含脚本。
只是测试一下,我test.php
编写脚本如下:
<?php
echo("test");
?>
我使用以下方法将此脚本包含在远程页面上:
<?php
include("http://mydomain.com/script.php");
?>
它工作没有问题,"测试"打印在页面顶部。
但是,如果我向脚本添加一个函数并尝试从页面调用该函数,它会崩溃。
更糟糕的是,这个网站关闭了php错误,我无法打开它。
为了完全确保我不只是弄乱了代码,我让我的test.php
看起来像这样:
<?php
function myfunc()
{
return "abc";
}
?>
然后在包含文件的页面上:
<?php
include("http://mydomain.com/script.php");
echo(myfunc());
?>
它崩溃了。任何想法将不胜感激。
这不是奇怪的行为,但由于您通过互联网加载文件(在本例中注意万维网),因此在将文件发送到包含函数之前会对其进行解释。
由于脚本是解释的,因此不会显示任何函数,而只会显示脚本的输出。
要么通过FTP加载它,要么为函数创建一个API。
我的猜测:http://mydomain.com/script.php
的PHP是由 mydomain.com 的Web服务器解释的。你所including
的只是该脚本的结果。对于一个简单的echo("test")
,那就是"测试"。函数不生成任何输出,并且不可用于including
脚本。只需在浏览器中访问http://mydomain.com/script.php
即可确认这一点,看看您得到了什么。您需要阻止 mydomain.com 实际解释 PHP 文件并将其作为纯文本返回。
但是:这听起来像是一个坏主意。跨域包含是一种反模式。它不仅会给您带来安全问题,还会使每个页面加载速度不必要地变慢。如果跨域包含是答案,那么您的问题就错了。
您包含的是 test 的客户端输出.php而不是服务器端源代码。将 test.php 重命名为 test.phpc 以防止执行脚本。但是,从安全角度来看,这是危险的。