使用SSI和PHP的备用标头

时间:2013-04-26 15:54:14

标签: php html ssi shtml

我有两个标题:一个用于登录用户显示,另一个用于在注销时显示/不显示成员。我还有一个应该在每个页面上重复的页脚。我有想法使用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*/);
}
?>

2 个答案:

答案 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,因为:

  1. php.net
  2. 的大规模支持社区
  3. 在大多数实现中,它比使用SSI更快,因为PHP旨在完成PHP代码的所有处理和解析,而SSI必须读取您的SHTML页面(在其编写之后)并在评论和包含之间进行筛选,然后包括所有组件。
  4. 如果您将PHP页面包含为SSI,那么您将使Apache等待PHP,而如果您单独使用PHP,那么它就已经提供了该页面。
  5. 您可以使用PHP来处理数据库等等。
  6. 无法处理从服务器访问PHP页面,因此如果您使用标准做法,则有人利用您的代码漏洞的风险较小。
  7. SSI明显可读为代码(并且非常有限)。
  8. 如果您使用函数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格式化,但您可能会从数据库中提取这些内容。