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