我很好奇。如果 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
它被另一个php文件包含在内,而不是通过URL请求的。
,如果我直接从我的 Web 浏览器请求head.php
(不是通过 php includes
访问它,只是通过 http 请求(,它应该:
(a(意识到请求不是来自另一个PHP文件的include
,然后
(b(包含404.php
,其中
(c(在line 2
404.php
上发送404 status
,然后(
d(包括head.php
。
因此,最终head.php
将包括head.php
.
会这样吗?
是的,确实如此。
注意:但是,可能会发生内部服务器错误。例如:
include.php
:
<?php
if(!isset($s)){
$s = 0;
}
if($s<10){
include "include.php";
$s++;
}
?>
test
此脚本生成内部服务器错误。我没有检查在错误发生之前可以自行包含多少次文件,但显然 10 次(或超过(足以导致错误。
无论是那个还是 PHP 脚本都不能直接包含自身。它必须通过包含一个包含原始脚本的单独脚本来做到这一点