Способы задания заголовка страницы в PHP: от переменных до шаблонов
Основные методы установки заголовка страницы в PHP
Как сделать, чтобы заголовок страницы (тег title) менялся динамически в зависимости от контента?
Наиболее простой и эффективный способ заключается в использовании переменной PHP для хранения значения заголовка, которая затем вставляется в HTML-шаблон. Это позволяет легко изменять заголовок для каждой страницы, не дублируя код.
$pageTitle = 'Главная страница';
?>
<!DOCTYPE html>
<html>
<head>
<title><?php echo $pageTitle; ?></title>
</head>
<body>
...
</body>
</html>В этом примере переменная $pageTitle определяется перед выводом HTML. Значение можно брать из массива, базы данных, URL-параметров или других источников. Для предотвращения XSS-атак рекомендуется использовать функцию htmlspecialchars() или htmlentities().
$pageTitle = htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
echo '<title>' . $pageTitle . '</title>';Как установить заголовок страницы через пользовательскую функцию?
Если требуется устанавливать заголовок в разных частях скрипта или управлять заголовком централизованно, можно создать функцию-обёртку.
function setPageTitle($title) {
global $pageTitle;
$pageTitle = htmlspecialchars($title, ENT_QUOTES, 'UTF-8');
}
setPageTitle('Контакты');
// далее в шаблоне
?>
<title><?php echo $pageTitle; ?></title>Функция setPageTitle принимает строку, экранирует специальные HTML-символы и сохраняет результат в глобальной переменной. Это удобно при использовании архитектуры MVC, где заголовок устанавливается в контроллере.
Как установить заголовок страницы с использованием буферизации вывода перед HTTP-заголовками?
Если необходимо установить HTTP-заголовки (например, Content-Type) после того, как уже начался вывод HTML, понадобится буферизация. Это позволяет сначала накопить вывод в буфере, а затем отправить заголовки и flush.
ob_start();
?>
<!DOCTYPE html>
<html>
<head>
<title>Моя страница</title>
</head>
<body>
...
</body>
</html>
<?php
$html = ob_get_contents();
ob_end_clean();
header('Content-Type: text/html; charset=utf-8');
header('X-Powered-By: PHP');
echo $html;После завершения буферизации можно спокойно устанавливать любые HTTP-заголовки, не опасаясь ошибки «headers already sent».
Как задать заголовок страницы в шаблонизаторе (например, Twig)?
Многие современные проекты используют шаблонизаторы. В них передача заголовка осуществляется через переменные контекста.
// PHP
$loader = new \Twig\Loader\FilesystemLoader('/templates');
$twig = new \Twig\Environment($loader);
echo $twig->render('page.twig', ['page_title' => 'О компании']);В шаблоне Twig:
<title>{{ page_title }}</title>Шаблонизатор автоматически экранирует вывод, если это включено в настройках.
Как связать установку заголовка страницы с HTTP-заголовками?
Для корректного отображения кириллицы или других символов в заголовке необходимо, чтобы сервер отправил правильный HTTP-заголовок Content-Type. Обычно это делается до вывода HTML.
header('Content-Type: text/html; charset=UTF-8');
$pageTitle = 'Привет, мир!';
?>
<title><?php echo htmlspecialchars($pageTitle); ?></title>Без этого заголовка браузер может неправильно интерпретировать кодировку, и заголовок страницы отобразится кракозябрами.
Типичные ошибки и их решения
Ошибка 1: Заголовки уже отправлены (headers already sent)
Возникает, если перед вызовом header() уже был произведён вывод, включая пробелы или пустые строки. Решения:
- Проверить, нет ли вывода или пробелов до header().
- Использовать буферизацию (ob_start).
- Перенести установку заголовков в самое начало скрипта, до любых пробелов.
Ошибка 2: Дублирование тега <title>
Если несколько раз в коде выводится <title>, браузер использует только первый. Для предотвращения использовать единую точку установки.
Ошибка 3: Неправильная кодировка заголовка
Если в заголовке используются не ASCII символы, но не установлен заголовок Content-Type с верной кодировкой, браузер может отображать иероглифы. Решение - установить header('Content-Type: text/html; charset=utf-8'); и убедиться, что PHP-файл сохранён в UTF-8 без BOM.
Расширенные примеры установки заголовка страницы
Пример 1: Динамический заголовок на основе URL (параметр id)
$id = isset($_GET['id']) ? (int)$_GET['id'] : 0;
$pageTitle = ($id > 0) ? "Страница {$id}" : "Главная страница";
header('Content-Type: text/html; charset=utf-8');
?>
<!DOCTYPE html>
<html>
<head>
<title><?php echo htmlspecialchars($pageTitle, ENT_QUOTES, 'UTF-8'); ?></title>
</head>
<body>
<h1>Содержимое</h1>
</body>
</html>При обращении к странице ?id=42 заголовок станет "Страница 42". Без id - "Главная страница".
Пример 2: Установка заголовка с помощью класса Page и буферизации
class Page {
private $title = '';
private $content = '';
public function setTitle($title) {
$this->title = htmlspecialchars($title, ENT_QUOTES, 'UTF-8');
}
public function setContent($content) {
$this->content = $content;
}
public function render() {
ob_start();
?>
<!DOCTYPE html>
<html>
<head>
<title><?php echo $this->title; ?></title>
</head>
<body>
<?php echo $this->content; ?>
</body>
</html>
<?php
$html = ob_get_contents();
ob_end_clean();
return $html;
}
}
$page = new Page();
$page->setTitle('О нас');
$page->setContent('<p>Текст страницы.</p>');
header('Content-Type: text/html; charset=utf-8');
echo $page->render();Результат - HTML-документ с заголовком 'О нас' и содержимым. HTTP-заголовки устанавливаются перед выводом.
Пример 3: Использование массива метаданных с заголовком
$meta = [
'title' => 'Блог | PHP',
'description' => 'Уроки по PHP',
];
function renderMeta($meta) {
$title = htmlspecialchars($meta['title'], ENT_QUOTES, 'UTF-8');
return "<title>{$title}</title>\n" .
"<meta name=\"description\" content=\"" . htmlspecialchars($meta['description'], ENT_QUOTES, 'UTF-8') . "\">";
}
header('Content-Type: text/html; charset=utf-8');
?>
<!DOCTYPE html>
<html>
<head>
<?php echo renderMeta($meta); ?>
<meta charset="UTF-8">
</head>
<body>...</body>
</html>В заголовке страницы отобразится 'Блог | PHP'. Функция renderMeta централизует вывод мета-тегов.
Пример 4: Установка заголовка в скрипте командной строки (CLI) - не для веба
#!/usr/bin/php
<?php
$pageTitle = 'CLI Скрипт';
echo "<title>{$pageTitle}</title>\n";
// вывод заголовка в консоль для тестированияВ командной строке выведется строка <title>CLI Скрипт</title>. Бессмысленно для реального использования, но может быть полезно для отладки.
Пример 5: Автоматическая установка заголовка на основе файла-включения
// config.php
$pageTitle = 'По умолчанию';
// index.php
require 'config.php';
$pageTitle = 'Главная';
?>
<title><?php echo $pageTitle; ?></title>Заголовок из переопределённой переменной в index.php.