我有两个标题:一个用于登录用户显示,另一个用于在注销时显示/不显示成员。我还有一个应该在每个页面上重复的页脚。我有想法使用SSI来包含页眉和页脚。
截至目前,我们尚未启动太多服务器端处理,因此无法跟踪已登录/已注销的用户。因此,就目前而言,我只想使用包含标题的页面来确定要显示的页面。我有想法使用PHP文件作为标题而不是SHTML文件,所以我可以做一些处理来确定要显示的标题。
那么可以确定哪个页面用PHP调用include吗?
我是否认为这一切都错了?如果是这样,哪种解决方案更合适?
例如,每个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*/);
}
?>
答案 0 :(得分:0)
那么可以确定哪个页面用PHP调用include吗?
不知道。但如果有可能,它将通过$_SERVER
。把它放在你的header.php中进行测试:
<?php
echo '<pre>';
print_r($_SERVER);
echo '</pre>';
但是,如果页面被请求为*.html
与服务器端包含我甚至无法预测这会对PHP会话造成什么样的破坏。我怀疑session_start()
是否能够在此上下文中设置正确的标头,或者是否将PHP会话cookie发送到客户端或通过SSI传递回PHP。
据我所知/有关SSI应该只用于包含不依赖于与用户的任何交互的静态内容或动态内容,包括基本的内容,就好像他们是否登录一样。 SSI是静态和动态页面之间的混合,应该被称为“有点 - 动态 - 但不是真的”。
简短的回答:SSI将成为一个巨大的痛苦,放弃它,只使用PHP include()
。
编辑:您的页面在最基本的级别上看起来就像这样,并且实际上并不比使用SSI复杂。如果您采用更多MVC-oriented方法[即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>
答案 1 :(得分:0)
为了便于编程,最好使用其中一个。最好只使用PHP,因为:
如果您使用函数virtual()
将PHP作为Apache模块运行,则可以在PHP中包含SSI,但为什么要这样做?你可以include()
几乎任何PHP。
示例强>
我将以帐户管理网站为例。为了使标题动态化,您需要为调用它的页面找到$var
(我将使用$_SERVER['REQUEST_URI']
)。根据具体情况,您可以参考几个reserved server variables in PHP来拨打电话。因此,让我们说所有登录页面所在的授权目录称为&#34; auth&#34;您的公共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格式化,但您可能会从数据库中提取这些内容。