Альтернативные заголовки с 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*/);
}
?>

person Jaws212    schedule 26.04.2013    source источник
comment
if($_SESSION['logged_in']) include('logged_in_header.php'); еще включить ('visitor_header.php');   -  person Waygood    schedule 26.04.2013
comment
это будет работать даже для SSI? Я немного волновался, что, будучи на стороне сервера, это скроет сеанс. Кроме того, моей главной задачей сейчас является определение того, какая страница вызывает включение.   -  person Jaws212    schedule 26.04.2013
comment
без кода трудно сказать, но вы смотрели: en.wikipedia.org/wiki/Server_Side_Includes   -  person Waygood    schedule 26.04.2013
comment
В чем причина использования SSI?   -  person AbsoluteƵERØ    schedule 26.04.2013
comment
@AbsoluteƵERØ казалось, что это правильный способ включить фрагмент html-кода в несколько мест. Он отлично работает с нижним колонтитулом и действительно ускорил обновления. Но, как я уже сказал, я не уверен на 100%, что это решение, которое я хочу. В конце концов, когда я просто использую сеанс, чтобы определить, какой заголовок, это кажется довольно простым, но для тестирования я хотел бы использовать страницу, чтобы определить, какой заголовок без ручного редактирования каждой страницы, когда я меняю, какие страницы показывают что.   -  person Jaws212    schedule 26.04.2013
comment
Знаете ли вы, что функция PHP include() используется для той же цели и является решением общего назначения, используемым по крайней мере в 99,99% проектов для этого случая?   -  person Your Common Sense    schedule 26.04.2013
comment
Да, но это казалось слишком сложным для нижнего колонтитула, и идея переключить верхний колонтитул на основе страницы была задним числом. Это просто промежуточный шаг к готовому продукту и не важен.   -  person Jaws212    schedule 26.04.2013


Ответы (2)


Итак, можно ли определить, какая страница вызывает включение с помощью PHP?

Без понятия. Но если можно, то через $_SERVER. Поместите это в свой header.php для тестирования:

<?php
echo '<pre>';
print_r($_SERVER);
echo '</pre>';

Однако, если страница запрашивается как *.html с включениями на стороне сервера, я даже не могу предсказать, какой хаос это будет играть с сеансами PHP. У меня есть сомнения, что session_start() когда-либо сможет установить правильные заголовки в этом контексте, или если файл cookie сеанса PHP когда-либо будет отправлен клиенту или передан через 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>
person Sammitch    schedule 26.04.2013

Для простоты программирования лучше использовать один или другой. Лучше всего использовать исключительно PHP, потому что:

  1. Большое сообщество поддержки на php.net
  2. В большинстве реализаций это быстрее, чем использование SSI, поскольку PHP предназначен для выполнения всей обработки и разбора PHP-кода, в то время как SSI должен читать вашу SHTML-страницу (после того, как она написана) и просеивать комментарии и включения, а затем включать все компоненты.
  3. Если вы включаете страницы PHP в качестве SSI, вы заставляете Apache ждать PHP, тогда как если бы вы использовали только PHP, он уже доставил бы страницу.
  4. Вы можете делать что-то с базами данных и многое другое с помощью PHP.
  5. PHP-страницы не могут быть доступны с сервера без обработки, поэтому при использовании стандартных методов снижается риск того, что кто-то воспользуется уязвимостями вашего кода.
  6. SSI легко читаются как код (и очень ограничены).

Вы можете включить SSI с PHP, если вы используете PHP как модуль Apache, используя функцию virtual(), но зачем вам это? Вы можете include() почти все что угодно в PHP.

Пример

Я собираюсь использовать сайт управления учетными записями в качестве примера. Чтобы сделать заголовок динамическим, вам нужно найти $var для вызывающей его страницы (я собираюсь использовать $_SERVER['REQUEST_URI']). В PHP есть несколько зарезервированных серверных переменных, на которые вы можете ссылаться для совершения вызовов. в зависимости от обстоятельств. Итак, скажем, авторизованный каталог, в котором находятся все зарегистрированные страницы, называется «auth», ваш общий файл оболочки может выглядеть так:

<?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, но вы, вероятно, извлечете этот материал из базы данных.

person AbsoluteƵERØ    schedule 26.04.2013