为了便于编程,最好使用其中一种。最好只使用 PHP,因为:
- php.net上的大规模支持社区
- 在大多数实现中,它比使用 SSI 更快,因为 PHP 旨在完成 PHP 代码的所有处理和解析,而 SSI 必须读取您的 SHTML 页面(在编写之后)并在注释和包含之间进行筛选,然后包含所有组件。
- 如果您将 PHP 页面作为 SSI 包含在内,那么您正在让 Apache 等待 PHP,而如果您单独使用 PHP,它已经交付了该页面。
- 你可以用数据库做一些事情,用 PHP 做更多的事情。
- PHP 页面在未经处理的情况下无法从服务器访问,因此如果您使用标准做法,则有人利用您的代码漏洞的风险较小。
- SSI 可以作为代码清楚地阅读(并且非常有限)。
如果您将 PHP 作为 Apache 模块运行,则可以在 PHP 中包含 SSI,使用 function virtual()
,但您为什么要这样做?您几乎可以include()
将任何东西放入 PHP。
例子
我将以帐户管理站点为例。要使标题动态化,您需要找到$var
调用它的页面(我将使用$_SERVER['REQUEST_URI']
)。PHP中有几个保留的服务器变量,您可以根据情况引用它们来进行调用。因此,假设所有登录页面所在的授权目录称为“auth”,您的通用 shell 文件可能如下所示:
<?php
//Check for the page the person is asking for
session_start();
$root = $_SERVER['DOCUMENT_ROOT'];
//Check for the "auth" directory
if(preg_match('!^/?auth!',$_SERVER['REQUEST_URI'])){
//Do some check to see if they've been authenticated... this one is not secure, but you get the idea
if($_SESSION['logged_in']){
//Require the correct header
require_once($root.'/includes/logged-in-header.php');
} else {
//They don't belong or they're not logged in, kick them back to the login page.
header("Location: /login.php?e=1");
die();
}
} else {
//It's not an authorization required page, so show the standard header.
require_once($root.'/includes/non-auth-header.php');
}
//let's find out the page that's loading the shell.
$pageName = preg_replace('!/([^/]+)$!',"$1",$_SERVER['SCRIPT_NAME']);
switch($pageName){
/*Auth pages*/
case "billing.php":
require_once($root.'/includes/billing.php');
break;
case "account.php":
require_once($root.'/includes/account.php');
break;
case "logout.php":
require_once($root.'/includes/logout.php');
break;
default:
//show the login page
require_once($root.'/includes/login.php');
}
require_once($root.'/../shell.php');
require_once($root.'/includes/footer.php');
?>
因此,如果您在auth
目录中并且没有登录,您将获得主页。如果您在页面上的auth
目录中billing.php
并且您已登录,则该站点将加载计费页面。
auth/billing.php代码可能如下所示:
require_once("$_SERVER['DOCUMENT_ROOT'].'/../shell.php');
include/billing.php代码将包含页面的所有工作,并且可以格式化为 HTML,但您可能会从数据库中提取这些内容。