我有两个标题:一个用于显示登录用户,另一个用于显示注销/非成员。我也有一个页脚,应该在每个页面上复制。我有了使用SSI来包含页眉和页脚的想法。
到目前为止,我们还没有开始太多的服务器端处理,因此没有跟踪登录/注销用户。因此,现在,我只想使用包含标题的页面来确定要显示哪个页面。我的想法是使用PHP文件而不是SHTML文件作为头文件,这样我就可以做一些处理来确定要显示哪个头文件。
所以有可能确定哪个页面正在调用包含PHP?
我做错了吗?如果是这样,什么解决方案更合适?
例如,每个html页面都适合这样的一般布局:
<html>
<header>
<!-- relevant header calls -->
<header>
<body>
<div id="body">
<!--#include virtual="header.php"-->
<!-- actual page content -->
</div>
<!--#include virtual="footer.shtml"-->
</body>
</html>
在header。php中我想要这样写:
<?php
if(/*page is a non-logged in page*/){
echo(/*logged out header*/);
} else {
echo(/*logged in header*/);
}
?>
所以有可能确定哪个页面正在调用包含PHP?
不知道。但是如果可能的话,它会通过$_SERVER
。在header.php中进行测试:
<?php
echo '<pre>';
print_r($_SERVER);
echo '</pre>';
然而,如果页面被请求为*.html
与服务器端包含,我甚至无法开始预测这将对PHP会话造成什么样的破坏。我怀疑session_start()
是否能够在这种情况下设置适当的标头,或者PHP会话cookie是否会被发送到客户端或通过SSI传递回PHP。
据我所知/关心的SSI应该只用于包括静态内容或动态内容,不依赖于与用户的任何形式的交互,包括一些基本的东西,如果他们登录或不登录。SSI介于静态页面和动态页面之间,应该被称为"有点动态,但不是真正的动态"。
简短的回答:SSI将是一个巨大的痛苦的屁股,放弃它,只使用PHP include()
。
Edit:您的页面在最基本的级别上看起来像这样,并且实际上并不比使用SSI更复杂。如果你采用更面向mvc的方法(即C和V部分),它将变得更易于管理:
<?php
session_start();
// other initialization
?><html>
<head>
<!-- relevant header calls -->
<head>
<body>
<div id="body">
<?php
if($_SESSION['is_logged_in']){
echo(/*logged out header*/);
} else {
echo(/*logged in header*/);
}
?>
<!-- actual page content -->
</div>
<?php include("footer.php"); ?>
</body>
</html>
为了方便编程,最好使用其中一个。最好只使用PHP,因为:
- php.net的大量支持社区
- 在大多数实现中,它比使用SSI更快,因为PHP被设计为完成PHP代码的所有处理和解析,而SSI必须读取您的SHTML页面(在它写完之后)并在注释和包含之间筛选,然后包含所有组件。
- 如果你包含PHP页面作为ssi,你让Apache等待PHP,而如果你单独使用PHP,它会已经交付页面。
- 你可以用数据库和PHP做更多的事情。
- PHP页面不能从服务器访问而不被处理,所以如果你使用标准实践,有人利用你的代码漏洞的风险更小。
- ssi可以像代码一样清晰可读(并且非常有限)。
你可以包含一个SSI与PHP如果你运行PHP作为一个Apache模块,使用函数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
目录,你没有登录,你会得到主页。如果您在billing.php
页面的auth
目录中,并且您登录了,该站点将加载计费页面。
require_once("$_SERVER['DOCUMENT_ROOT'].'/../shell.php');
include/billing.php代码将包含页面的所有工作,它可以用HTML格式化,但您可能会从数据库中提取这些内容。