我有好奇心。如果PHP脚本包含自身会发生什么?
我问的原因是我有一个php文件,可以为我所有网站的<head>
标签生成内容。其中包括网站的404 error page
head
代码。
如果直接访问生成这些head
标记的php文件,则通过包含404 error page
来“假装”不存在,404 status
会将/
.htaccess <- (apache 404 handling)
404.php <- 404 error page
head.php <- '<head>' generator
...
发送回客户端。
这就是文件系统的样子:
404.php
<?php
header("HTTP/1.0 404 Not Found");
?>
<html>
<head>
<?php
$key = true;
include dirname(__FILE__) . "/head.php";
?>
</head>
<body>
lul. dead.
</body>
</html>
包含:
head.php
<?php
if(isset($key) && $key===true){
//code to generate <head> content
}else{
include dirname(__FILE__) . "/404.php";
}
?>
包含:
$key
head.php
告诉head.php
它被另一个php文件包含,而不是通过URL请求。
总而言之,如果我直接从我的网络浏览器请求php includes
(不通过include
访问它,只需通过http请求),它应该:
(a)意识到请求不是来自其他php文件的404.php
,然后是(b)包括{{1} },(c)在404 status
line 2
上发送404.php
,然后,(d) 包括head.php
。
因此,最终head.php
将包含head.php
。
会发生这种情况吗?
答案 0 :(得分:1)
是的,确实如此。
注意:但是,可能会发生内部服务器错误。例如:
include.php
:
<?php
if(!isset($s)){
$s = 0;
}
if($s<10){
include "include.php";
$s++;
}
?>
test
此脚本产生内部服务器错误。我没有检查文件在错误发生之前可以自包含多少次,但显然10次(或者多次)足以导致错误。
要么PHP脚本不能直接包含自身。它必须通过包含一个包含原始脚本
的单独脚本来实现