Как я могу удалить заголовок запроса accept-encoding в Nginx?

Вопрос или проблема

Недавнее обновление zlib из-за уязвимости безопасности кажется вызывает серьезную проблему при обслуживании PHP-FPM 8.0 через nginx на Ubuntu focal. Любые запросы с gzip-кодировкой не работают с самого начала ответа, хотя nginx регистрирует запросы как успешные и правильного размера. Если я делаю запросы без заголовка Accept-Encoding, все работает идеально. Как временное решение, я пытаюсь отключить всю поддержку gzip, но это, похоже, чрезвычайно настойчиво… На данный момент я попробовал следующие настройки в nginx:

gzip off;
fastcgi_buffering off;
add_header Accept-Encoding "";
proxy_set_header Accept-Encoding "";

и я также проверил, что нет других директив, которые снова включат их, используя grep вывод nginx -T.

Однако, если я выведу заголовки запроса из PHP (т.е. после их прохождения через nginx), я все еще вижу этот заголовок:

Accept-Encoding: deflate, gzip, br, zstd

так что nginx не удаляет его из запроса перед его передачей в PHP-FPM. Я пробовал устанавливать эти директивы на уровне сервера и уровня размещения, с теми же результатами.

В PHP я отключил всю буферизацию вывода, но, похоже, невозможно отключить zlib без перекомпиляции.

Как мне заставить nginx удалить этот заголовок запроса, чтобы ни nginx, ни PHP не сжимали ответы?

Директива proxy_set_header предназначена для проксирования запросов, т.е. для их передачи через цепочку HTTP-на-HTTP-серверов. И у вас следующий в цепочке сервер FastCGI, так что ваш набор директив начинается с fastcgi_.

Вы можете полностью отключить передачу заголовков запроса в PHP, установив fastcgi_pass_request_headers в положение off, или можете удалить конкретный заголовок, сбросив его с помощью fastcgi_set_header.

Для fastcgi используйте немного другой синтаксис. Вместо установки заголовка, вы устанавливаете параметр, который соответствует заголовку. Имена параметров начинаются с “HTTP_”, далее следует имя заголовка в верхнем регистре. Дефисы заменяются на подчеркивания в имени параметра.

fastcgi_param HTTP_ACCEPT_ENCODING "";

.

Ответ или решение

Чтобы удалить заголовок Accept-Encoding в запросе nginx при работе с PHP-FPM на Ubuntu Focal, нужно следовать определённой процедуре изменения конфигурации nginx, так как обычные методы могут не дать нужный результат. Ваше желание отключить поддержку gzip оправдано в свете возникших проблем, поэтому вот как можно правильно настроить nginx для достижения этой цели.

Анализ Проблемы и Решение

Вы сталкиваетесь с ситуацией, когда заголовок Accept-Encoding, добавленный к запросам, мешает корректному исполнению, так как gzip-сжатие вызывает сбой в ответах через PHP-FPM. Даже несмотря на попытки отключения gzip с помощью директив вроде gzip off, проблема сохраняется. Это происходит, потому что данные заголовки продолжают передаваться на сервер FastCGI (PHP-FPM).

Шаги для Решения Проблемы

  1. Убедитесь, что gzip действительно отключён:

    • В nginx конфигурационном файле (обычно /etc/nginx/nginx.conf) либо в конфигурациях серверов (server блоках) установите:
      gzip off;
  2. Используйте правильные директивы для FastCGI:

    • Поскольку вы работаете с PHP-FPM через FastCGI, необходимо использовать директивы fastcgi_.
    • Для изменения или удаления заголовка Accept-Encoding примените:
      fastcgi_param HTTP_ACCEPT_ENCODING "";
    • Разместите эту строку внутри блока location, где указывается fastcgi_pass.
  3. Отключите передачу заголовков запроса, если необходимо:

    • Теоретически, можно отключить передачу всех заголовков, но это может негативно повлиять на некоторые файлы:
      fastcgi_pass_request_headers off;
    • Имейте в виду, что полное отключение заголовков запросов может привести к проблемам с определёнными функциями, которые зависят от них.
  4. Перезагрузка nginx:

    • Не забудьте применить изменения, перезагрузив конфигурацию nginx:
      sudo systemctl reload nginx

Дополнительные Замечания

  • Проверка Конфигурации: Всегда проверяйте, нет ли конфликтующих директив в других файлах конфигурации nginx. Для этого используйте команду:
    nginx -T | grep конфиг_файл
  • Диагностика через Логи: Изучите логи nginx для подтверждения, что gzip отключён и заголовки не передаются: /var/log/nginx/error.log и /var/log/nginx/access.log.
  • Тестирование: Убедитесь, что изменения действительно применяются, проверив заголовки с помощью утилит вроде curl:
    curl -H "Accept-Encoding:" -I http://ваш_сервер/ваш_скрипт.php

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...