уменьшение дублирования в статических HTML-страницах - PullRequest
2 голосов
/ 07 февраля 2009

У меня есть веб-сайт, который состоит из нескольких статических HTML-страниц. Очевидно, что среди них много дубликатов (заголовок, меню и т. Д.). Хостинговая компания, которую я планирую использовать, поддерживает PHP, о котором ничего не знаю. Предположительно PHP предоставляет какой-то механизм #include, но какие изменения мне нужно внести в мои HTML-страницы, чтобы использовать его?

Например, предположим, у меня есть такая страница

index.html

<html>
  <head></head>
  <body>
    <h1>My Common Header</h1>
  </body>
</html>

Очевидно, мне нужно переместить общую часть в отдельный файл:

header.html

<h1>My Common Header</h1>

Учитывая приведенный выше пример (и предполагая, что все файлы находятся в одном каталоге):

  • Что мне добавить в теге body, чтобы включить header.html?
  • Нужно ли переименовать index.html или добавить некоторые специальные теги, чтобы указать, что это файл .php?
  • Нужно ли вносить какие-либо изменения в header.html?

Обновление: Я хочу подчеркнуть, что моя цель здесь состоит в том, чтобы просто найти средство с минимальным трением для уменьшения дублирования между статическими файлами HTML. Я немного неохотно спускаюсь по стороне сервера, включающей маршрут, потому что я еще не знаю, на каком типе сервера (IIS / Apache) я буду размещать файлы, и будут ли включены или выключены включения. Меня тянуло к PHP только потому, что это единственное, что, как я могу предположить, будет доступно, что сможет выполнить эту работу. Спасибо за ответы.

Спасибо, Донал

Ответы [ 8 ]

6 голосов
/ 07 февраля 2009

Вы ищете include (или одно из его производных, такое как include_once, require, require_once):

header.php

<h1>My Common Header</h1>

index.php

<html>
  <head></head>
  <body>
    <?php include('header.php'); ?>
  </body>
</html>

И так далее, например, для вашего нижнего колонтитула.

6 голосов
/ 07 февраля 2009

Вам не нужно использовать PHP для получения этой функциональности, и, как правило, это плохая идея из-за потенциальных проблем безопасности. По сути, вы бьёте комара ядерной бомбой. Если вы не используете динамический язык, то вы ищете серверные включения.

В IIS, например:

<!--#include virtual="file.inc"-->

Помните, что вам часто приходится настраивать сервер для их использования, так как эта функция по умолчанию часто отключена. И IIS, и Apache поддерживают серверную часть, но используют разные конфигурации.

Вы можете найти больше информации здесь:

Включает серверную часть

РЕДАКТИРОВАТЬ: Я не имею в виду, что это плохая идея использовать PHP, просто использовать PHP исключительно для включения других файлов. Он создает большую поверхность атаки, привнося PHP в микс, когда он не нужен, и, следовательно, может возникнуть проблема безопасности, когда функциональность PHP не требуется.

РЕДАКТИРОВАТЬ 2: Я думаю, что это плохая идея предположить, что вы не будете целью из-за вашего размера, и, следовательно, вы можете игнорировать безопасность. Большинство сайтов скомпрометированы автоматическими червями и превращены в вредоносные хосты, спам-зомби или пиратские программные / медиа-серверы. Помимо того факта, что вы можете оказаться вовлеченным в заражение других, ваш сайт может попасть в черный список, и это может стоить вам реальных денег в виде платы за превышение пропускной способности. Мы говорим сотни или тысячи долларов.

Тот факт, что вы маленький сайт, не делает вас менее целевой. Просто находясь в Интернете, вы становитесь целью.

4 голосов
/ 08 февраля 2009

Забудьте об этом вообще на сервере.

Если все, что вы действительно хотите сделать, - это поддерживать некоторые статические страницы - и даже не предполагать, что вам действительно придется использовать PHP - я бы просто сделал это с Dreamweaver, который позволит вам создавать и управлять шаблонами и переменным контентом на вашем конце.

Не включает в себя необходимо. Не требуется шаблонизатор. (Это будет излишним за то, что вы пытаетесь достичь.)

2 голосов
/ 07 февраля 2009

Сначала необходимо изменить расширения файла индекса и заголовка на .php, затем вы можете сделать:

<html>
<head></head>
    <body>
        <? include 'header.php'; ?>
    </body>
</html>

А в вашем файле header.php

<h1>My Common Header</h1>
1 голос
/ 08 февраля 2009

Когда-то я использовал SSI (метод "<! - # include virtual =" file.inc "->", описанный выше Mystere Man) довольно немного для статических HTML-страниц, и я определенно рекомендую используя это.

Однако, если вы хотите устранить какую-либо неопределенность относительно того, будет ли включена поддержка этого на сервере, вы можете разработать отдельные файлы локально и объединить их в получившиеся файлы перед загрузкой на сервер. Например, Dreamweaver поддерживает это без проблем.

Или вы можете сделать это самостоятельно с помощью довольно простого сценария на выбранном вами языке, выполнив простую замену строки на маркерах в файлах, заменив {{{include-header}}} содержимым "header.html". файл и т. д.

Редактировать

Oops! Каким-то образом я не увидел сообщение Клейтона с той же заметкой о Dreamweaver.

1 голос
/ 07 февраля 2009

Хотя использование подключаемого файла для заголовка является решением, я пошел другим путем, когда столкнулся с проблемой несколько лет назад: я хотел, чтобы все страницы использовали один и тот же макет (что, я полагаю, довольно распространено ;-). Таким образом, поскольку я только хотел изменить содержимое страницы, я сделал содержимое страницы файлом, который включается и имеет основной файл шаблона, который включает верхний и нижний колонтитулы. Для настройки включения страницы я прибег к созданию довольно небольших php-скриптов, которые устанавливают только переменную, которая содержит страницу для включения. В некоторых случаях страница также может быть названа параметром GET. Конечно, это требует правильной проверки этого параметра. В долгосрочной перспективе мне больше не нужно беспокоиться о самом HTML - все, что я делаю, это пишу небольшие фрагменты (которые, конечно, должны быть полными для себя), которые включаются.

Возможно, даже лучшим решением было бы использование существующего шаблона. Из-за тех ограничений, которые у меня были тогда, я не мог этого сделать, но я сделал бы это, когда снова столкнулся с той же проблемой.

1 голос
/ 07 февраля 2009

Несмотря на то, что вы можете просто использовать директивы include, require, или require_once для включения элементов на одну страницу, вам может повезти с таким механизмом шаблонов, как Smarty

0 голосов
/ 07 февраля 2009

ОК, это только вопрос полупрограммирования.

PHP имеет функцию include (), которая действительно проста в использовании, но не способствует будущему удобству обслуживания. Я бы не рекомендовал это, особенно для больших сайтов.

Я про-фреймворк. Я использовал CodeIgniter, CakePHP и даже шаблонный движок Smarty. Если вы серьезно относитесь к PHP, подумайте о CakePHP. Есть такая концепция «макетов», в которой вы создаете заголовок, нижний колонтитул, CSS, JavaScript вне основного контента; например для страницы "о нас" ваш контент будет выглядеть примерно так:

Это страница о нас, которая рассказывает вам о нас множество вещей ...

CakePHP берет этот контент и оборачивает вокруг него ваш макет:

заголовок
CSS
Javascript
Это страница о нас, которая рассказывает вам о нас много вещей ...
сноска

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...