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 с параметрами в шаблонах (вручную): Метод, при котором все ссылки генерируются через специальные функции. Это более контролируемый, но трудоемкий способ, характерный для больших фреймворков.

Альтернативы в других языках
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
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().

PHP output_add_rewrite_var function comments

En
Output add rewrite var Add URL rewriter values