使用SSI和PHP替代标头



我有两个标题:一个用于显示登录用户,另一个用于显示注销/非成员。我也有一个页脚,应该在每个页面上复制。我有了使用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的大量支持社区
  1. 在大多数实现中,它比使用SSI更快,因为PHP被设计为完成PHP代码的所有处理和解析,而SSI必须读取您的SHTML页面(在它写完之后)并在注释和包含之间筛选,然后包含所有组件。
  2. 如果你包含PHP页面作为ssi,你让Apache等待PHP,而如果你单独使用PHP,它会已经交付页面。
  3. 你可以用数据库和PHP做更多的事情。
  4. PHP页面不能从服务器访问而不被处理,所以如果你使用标准实践,有人利用你的代码漏洞的风险更小。
  5. 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目录中,并且您登录了,该站点将加载计费页面。

auth/billing.php代码可能如下所示:
require_once("$_SERVER['DOCUMENT_ROOT'].'/../shell.php');

include/billing.php代码将包含页面的所有工作,它可以用HTML格式化,但您可能会从数据库中提取这些内容。

相关内容

  • 没有找到相关文章

最新更新