Вопрос или проблема
У меня есть скрипт, который создает заголовок:
X-User-ID: 1234
Я хотел бы записать значение, но желательно не отправлять его обратно клиенту.
Логгирование можно выполнить с помощью:
LogFormat "... %{X-User-ID}o ..." inc_ref
Но это не работает, когда я добавляю:
Header unset "X-User-ID"
Существует ли способ убрать заголовок, но все же записать значение?
Это не решение, но тот же вопрос на Header unset, похоже, не работает с apache 2.4.10 и php-fpm.
Даже если вы используете Header [always] note ...
, логгирование этого отмеченного значения с %{VARNAME}n
не работает, если вы используете Header [always] unset ...
.
Возможно, это ошибка в Apache.
Благодаря @mp_de, @covener и @diego ответ такой:
Header always note "X-User-ID" "User-ID"
Header always unset "X-User-ID"
LogFormat "... %{User-ID}n ..." inc_ref
Поскольку его нужно сначала скопировать в note
, так как значение заголовка unset
недоступно для LogFormat.
И потому что mod_proxy_fcgi
добавляет заголовки ответа в r->err_headers_out
, модуль mod_headers
должен использовать always
в обоих случаях.
Недавно у меня была та же ситуация, и решение
Header always note "X-User-ID" "User-ID"
Header always unset "X-User-ID"
LogFormat "... %{User-ID}n ..." inc_ref
сработало у меня идеально
Спасибо, Крейг
Ответ или решение
Apache LogFormat и удаление заголовка: Полное руководство
Введение
В процессе разработки веб-приложений часто возникает необходимость в ведении логирования пользовательских данных, таких как идентификатор пользователя. На практике бывает необходимо зарегистрировать это значение, не отправляя его обратно клиенту. В этой статье мы подробно рассмотрим, как использовать LogFormat
в Apache для этой цели, включая правильное отключение заголовка.
Проблема
У вас есть скрипт, который устанавливает заголовок X-User-ID
, например:
X-User-ID: 1234
Вы хотите зарегистрировать это значение, но не отправлять его обратно клиенту. Стандартный подход может заключаться в использовании следующего кода для логирования:
LogFormat "... %{X-User-ID}o ..." inc_ref
Однако при использовании команды Header unset "X-User-ID"
это перестает работать, потому что заголовок удаляется до записи в журнал.
Решение
Недавний ответ на данную проблему, лишь подтверждает практический опыт сообщества, и предлагает два важных шага:
- Запись значения заголовка в заметку.
- Удаление заголовка.
Код выглядит следующим образом:
Header always note "X-User-ID" "User-ID"
Header always unset "X-User-ID"
LogFormat "... %{User-ID}n ..." inc_ref
Объяснение кода
-
Header always note "X-User-ID" "User-ID":
Данная команда всегда будет записывать значение заголовкаX-User-ID
в специальную заметку с именемUser-ID
. Это гарантирует, что если заголовок присутствует, то его значение будет доступно для логирования. -
Header always unset "X-User-ID":
С помощью этой команды мы удаляем заголовок, чтобы он не возвращался клиенту. Использованиеalways
в этом случае гарантирует, что заголовок будет удален, даже если он добавляется как ответ от других модулей, таких какmod_proxy_fcgi
. -
LogFormat "… %{User-ID}n …":
В этом блоке мы используем переменнуюUser-ID
, чтобы записать значение, содержавшееся в заметке. Тем самым мы получаем доступ к этому значению для дальнейшего логирования.
Дополнительные советы
-
Проверка наличия модуля модификации заголовков: Для корректной работы команд убедитесь, что у вас установлен и активирован модуль
mod_headers
. -
Логирование других данных: Вы можете использовать аналогичный подход для логирования других заголовков, которые необходимо скрыть от конечного пользователя.
-
Тестирование изменений: После внесения изменений в конфигурацию Apache рекомендуется перезапустить сервер, а также проверить работоспособность новых правил, чтобы убедиться, что значение заголовка корректно записывается в логи.
Заключение
Использование заголовков и заметок в Apache предоставляет широкие возможности для кастомизации логирования. Решение, представленное в этой статье, эффективно решает вопрос логирования пользовательских идентификаторов без возвращения их клиентам. Внедрив предложенные шаги, вы сможете управлять важной информацией безопасно и эффективно, что существенно повысит уровень контроля за вашими веб-приложениями.