0

我有两个标题:一个为登录用户显示,一个在注销/非会员时显示。我还有一个页脚,应该在每一页上复制。我有使用 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*/);
}
?>
4

2 回答 2

0

那么是否可以确定哪个页面正在使用 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()

编辑:您的页面在最基本的级别上看起来像这样,实际上并不比使用 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>
于 2013-04-26T17:19:58.070 回答
0

为了便于编程,最好使用其中一种。最好只使用 PHP,因为:

  1. php.net上的大规模支持社区
  2. 在大多数实现中,它比使用 SSI 更快,因为 PHP 旨在完成 PHP 代码的所有处理和解析,而 SSI 必须读取您的 SHTML 页面(在编写之后)并在注释和包含之间进行筛选,然后包含所有组件。
  3. 如果您将 PHP 页面作为 SSI 包含在内,那么您正在让 Apache 等待 PHP,而如果您单独使用 PHP,它已经交付了该页面。
  4. 你可以用数据库做一些事情,用 PHP 做更多的事情。
  5. PHP 页面在未经处理的情况下无法从服务器访问,因此如果您使用标准做法,则有人利用您的代码漏洞的风险较小。
  6. 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,但您可能会从数据库中提取这些内容。

于 2013-04-26T18:32:47.030 回答