Способы задания заголовка страницы в PHP: от переменных до шаблонов

Раздел: Разработка на PHP -> HTTP запросы

Основные методы установки заголовка страницы в 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.
- Https client php (http клиент на php)
- Php id 1 (передача параметра id в php)
- Request php (обработка http запросов в php)
- Fetch php (fetch-запрос в php (curl или file_get_contents))
- Http content php (отправка контента по http в php)
- Php get request (get запрос в php)
- Php запросы (php запросы (sql/http))
- Php post json (php: отправка post-запроса с json)
- Php post request (post запрос в php)
- Php content json (php: установка content-type: application/json)
- Php запрос страницы (запрос страницы в php)
- Php get (обработка get запросов в php)
- Urls php (обработка url в php)
- Php file http (работа с файлами по http в php)
- Php redirect (редирект в php)
- Php title (php title (установка заголовка страницы))
- Curl php (curl в php)
- Forms form php (обработка форм в php)
- Php https post (отправка https post запросов в php)
- Php получить (получение данных в php)
- Php server request (обработка запросов php сервера)
- Php url http (php работа с url и http)

PHP title (установка заголовка страницы) - comments

En
Php title (php)