Справочник

add_header в nginx: как добавить заголовок к ответу

Директива add_header добавляет к ответу nginx заголовок с заданным значением. Без параметра always — только к успешным ответам и переадресациям. Если в блоке location есть хотя бы одна своя add_header, строки из блока server в нём не действуют.

≈ 6 мин чтения
Содержание 10

Что сделать прямо сейчас

  1. Команды вводятся на сервере: подключитесь к нему по SSH ([как подключиться](/instrukcii/kak-podklyuchitsya-k-vps-po-ssh/)) и набирайте их в том же окне.
  2. Откройте файл сайта: sudo nano /etc/nginx/sites-available/example.com. Вместо example.com — имя файла вашего сайта: список покажет ls /etc/nginx/sites-enabled/. Если система спросит пароль, введите пароль своего пользователя на сервере. Символы при вводе не видны — наберите пароль и нажмите Enter.
  3. Найдите строки add_header: Ctrl+W, слово add_header, Enter, следующую найдёт Alt+W. Запомните, в каких блоках location они стоят, — почему это важно.
  4. В блоке server, после строки server_name, добавьте строку add_header X-Content-Type-Options nosniff always;.
  5. Сохраните файл — Ctrl+O, Enter, затем Ctrl+X — и проверьте настройки: sudo nginx -t. В ответе должны быть слова syntax is ok и test is successful. Тогда примените их: sudo systemctl reload nginx. Если команда ничего не ответила, настройки применены.
  6. Проверьте: curl -sI https://example.com/ | grep -i x-content-type. Вместо example.com — адрес сайта. В ответе должна быть строка X-Content-Type-Options: nosniff.

Если проверка нашла ошибку, nginx назовёт файл и номер строки, а сайт продолжит работать на старых настройках. Что значит сообщение — Все ошибки nginx.

Как устроена строка add_header

add_header X-Content-Type-Options nosniff always;
ЧастьЧто значит
X-Content-Type-Optionsимя заголовка
nosniffзначение. Если в нём есть пробел, возьмите его в кавычки: add_header Cache-Control "public, max-age=3600";
alwaysдобавлять при любом коде ответа — подробнее

Строк add_header может быть несколько — по одной на каждый заголовок. В значении можно использовать переменные nginx.

X-Content-Type-Options: nosniff запрещает браузеру угадывать тип файла: скрипт, который пришёл не с типом JavaScript, не запустится, а стиль не с типом text/css не применится.

Для каких ответов

Без always nginx добавляет заголовок только к ответам с кодами 200, 201, 204, 206, 301, 302, 303, 304, 307 и 308. На страницах ошибок — 403, 404, 500, 502 — его не будет. С always заголовок получат ответы с любым кодом.

Почему заголовок пропадает

Строки add_header из внешнего блока переходят во внутренний, только если во внутреннем нет ни одной своей add_header. Пример:

server {
    add_header X-Content-Type-Options nosniff always;

    location /files/ {
        add_header Cache-Control no-store;
    }
}

Ответы из /files/ получат только Cache-Control: no-store — запрет браузеру сохранять ответ. Строка X-Content-Type-Options из блока server там не действует. Так же устроено между блоками http и server.

Как исправить: повторите общие строки add_header внутри такого location. Если их много, вынесите их в отдельный файл:

sudo nano /etc/nginx/snippets/headers.conf

Впишите в него строки add_header и сохраните. Затем в файле сайта уберите эти строки из блока server и из блоков location со своими add_header, а вместо них в каждом таком месте напишите include snippets/headers.conf;.

Если заголовок присылает приложение

add_header не заменяет заголовок, который пришёл от приложения через proxy_pass, а добавляет ещё один: в ответе будут две строки с одним именем. Чтобы осталась только строка nginx, рядом с proxy_pass напишите proxy_hide_header Имя; — так nginx не передаст посетителю заголовок приложения с этим именем.

Не добавляйте Content-Encoding

Заголовок Content-Encoding через add_header не ставьте. nginx от этого ответ не сожмёт, а браузер попытается его распаковать и покажет ERR_CONTENT_DECODING_FAILED — разбор ошибки. Сжатие включается директивой gzip — gzip в nginx.

Как проверить

curl -sI https://example.com/

Команда покажет все заголовки ответа. curl может показать имена заголовков маленькими буквами — это то же самое. Чтобы проверить страницу ошибки, запросите несуществующий адрес, например https://example.com/no-such-page: заголовок будет в ответе 404, только если в строке есть always.

Ошибки и как их исправить

Что видитеЧто делать
заголовка нет в ответах из одного locationв этом блоке есть свои add_header — как исправить
заголовка нет на страницах ошибокдобавьте в конец строки always
invalid parameter "max-age=3600"значение с пробелом без кавычек: возьмите его в кавычки
invalid number of arguments in "add_header" directiveто же — значение с пробелами без кавычек: разбор ошибки
в ответе две строки с одним именемзаголовок прислало и приложение — proxy_hide_header
после nosniff пропали стили или не работают скриптыфайл приходит не с тем типом: проверьте curl -sI строку Content-Type — для .css нужен text/css, для .js — application/javascript
браузер пишет ERR_CONTENT_DECODING_FAILEDуберите add_header Content-Encoding

Источники

Сверено 14 октября 2026 года.

Что почитать дальше