Output add rewrite var: примеры (PHP)

Использование output_add_rewrite_var для модификации URL и форм
Раздел: URL
output_add_rewrite_var(string $name, string $value): bool
Функция output_add_rewrite_var

Функция output_add_rewrite_var автоматически добавляет указанные пары имя-значение ко всем URL-адресам и формам, генерируемым PHP-скриптом. Это происходит на уровне буферизации вывода.

Основное применение связано с передачей идентификатора сессии (PHPSESSID) через URL при отключенных куках или для автоматического добавления служебных параметров безопасности, например, CSRF-токенов, ко всем ссылкам и формам на странице.

Аргументы
  • $name (string): Имя переменной для добавления в URL/формы. Не может начинаться с 'S' в случае с сессиями.
  • $value (string): Значение переменной.
Возвращаемое значение

Функция возвращает true в случае успеха или false при неудаче. Неудача может произойти, если обработчик вывода уже активен или переданы некорректные аргументы.

Примеры использования
Добавление одного параметра
<?php
output_add_rewrite_var('ref', '12345');
?>
<a href='/page.php'>Ссылка</a>
<form action='send.php' method='post'>
  <input type='text' name='msg'>
</form>
<a href='/page.php?ref=12345'>Ссылка</a>
<form action='send.php' method='post'>
  <input type='text' name='msg'>
  <input type='hidden' name='ref' value='12345'>
</form>
Добавление нескольких параметров
<?php
output_add_rewrite_var('lang', 'ru');
output_add_rewrite_var('track', 'abc');
?>
Использование с сессией
<?php
session_start();
if (ini_get('session.use_cookies') == false) {
    output_add_rewrite_var(session_name(), session_id());
}
?>
Похожие функции в PHP

ob_start() с callback-функцией: Обеспечивает более гибкую обработку буфера вывода. Позволяет модифицировать HTML произвольным образом, включая перезапись URL. Предпочтительнее для сложных манипуляций с контентом.

session_regenerate_id() и передача ID через URL: Вручную управляет идентификатором сессии в URL. Используется при специфических требованиях к безопасности.

Построение URL с параметрами в шаблонах (вручную): Метод, при котором все ссылки генерируются через специальные функции. Это более контролируемый, но трудоемкий способ, характерный для больших фреймворков.

Типичные ошибки
Вызов после начала вывода

Функция должна быть вызвана до отправки любого вывода в браузер, иначе она не сработает.

<?php
echo 'Начало';
// Ошибка: вывод уже начался
output_add_rewrite_var('key', 'value'); // Вернет false
?>
Попытка добавить переменную с именем, начинающимся на 'S' (для сессий)
<?php
// Может вызвать проблемы при управлении сессией через URL
output_add_rewrite_var('SID', 'some_value'); // Не рекомендуется
?>
Конфликт с уже существующими параметрами в URL

Если ссылка уже содержит параметр с таким же именем, он может быть продублирован, что приведет к неоднозначности.

Использование с ob_start() без флага PHP_OUTPUT_HANDLER_REWRITE

При использовании собственного обработчика буфера необходимо установить соответствующий флаг, иначе перезапись не произойдет.

Изменения в версиях PHP

PHP 7.1.0: Функция перестала молчаливо отказываться от добавления переменной, если обработчик вывода уже запущен. Теперь в такой ситуации она возвращает false.

В версиях PHP 8.0 и 8.1 значительных изменений в поведении функции не было. Аргументы и возвращаемое значение остались строго типизированы (string, string).

Расширенные примеры
Комбинация с пользовательским обработчиком буфера
Пример php
<?php
function my_callback($buffer) {
    // Замена всех ссылок на сайт example.com
    return str_replace('example.com', 'mydomain.ru', $buffer);
}
// Запуск перезаписи переменных
output_add_rewrite_var('src', 'newsletter');
// Запуск своего обработчика с флагом REWRITE
ob_start('my_callback', PHP_OUTPUT_HANDLER_REWRITE);
?>
<a href='https://example.com/page'>Пример</a>
<a href='https://mydomain.ru/page?src=newsletter'>Пример</a>
Управление перезаписью для разных частей сайта
Пример php
<?php
// Включаем перезапись только для определенного раздела
if (strpos($_SERVER['REQUEST_URI'], '/admin/') === 0) {
    output_add_rewrite_var('admin_token', 'secure_token_xyz');
}
?>
Сброс добавленных переменных
Пример php
<?php
output_add_rewrite_var('var1', 'val1');
// ... какой-то код ...
// Удаляем все правила перезаписи
output_reset_rewrite_vars();
?>
Обработка AJAX-запросов

Использование функции может мешать AJAX-запросам, если они отправляют данные на тот же endpoint. В таких случаях лучше отключать перезапись для конкретных маршрутов или использовать output_reset_rewrite_vars().

Альтернативы в других языках
Python (Flask, Django)

Контекстные процессоры (Django) или декораторы/фильтры шаблонов (Flask) позволяют автоматически добавлять переменные во все контексты шаблонов. Пример для Flask:

from flask import Flask, render_template_string

app = Flask(__name__)
@app.context_processor
def inject_vars():
    return {'ref': '12345'}

# В шаблоне все ссылки формируются вручную, но `ref` доступен глобально.
JavaScript (Клиентская сторона)

Аналога на чистом JS нет, так как функция работает на уровне серверного рендеринга. Однако похожий эффект достигается перехватом событий и модификацией DOM.

// Пример: добавление параметра ко всем ссылкам на странице (клиентский код)
document.addEventListener('DOMContentLoaded', function() {
    document.querySelectorAll('a').forEach(link => {
        const url = new URL(link.href);
        url.searchParams.set('ref', '12345');
        link.href = url.toString();
    });
});

Output add rewrite var в MySQL

Прямых аналогов не существует, так как это язык работы с базой данных, а не для генерации HTML.

PHP output_add_rewrite_var function comments

En
Output add rewrite var Add URL rewriter values