add_header в nginx: как добавить заголовок к ответу
Директива add_header добавляет к ответу nginx заголовок с заданным значением. Без параметра always — только к успешным ответам и переадресациям. Если в блоке location есть хотя бы одна своя add_header, строки из блока server в нём не действуют.
Содержание 10
Что сделать прямо сейчас
- Команды вводятся на сервере: подключитесь к нему по SSH ([как подключиться](/instrukcii/kak-podklyuchitsya-k-vps-po-ssh/)) и набирайте их в том же окне.
- Откройте файл сайта:
sudo nano /etc/nginx/sites-available/example.com. Вместо example.com — имя файла вашего сайта: список покажетls /etc/nginx/sites-enabled/. Если система спросит пароль, введите пароль своего пользователя на сервере. Символы при вводе не видны — наберите пароль и нажмите Enter. - Найдите строки add_header: Ctrl+W, слово
add_header, Enter, следующую найдёт Alt+W. Запомните, в каких блоках location они стоят, — почему это важно. - В блоке server, после строки server_name, добавьте строку
add_header X-Content-Type-Options nosniff always;. - Сохраните файл — Ctrl+O, Enter, затем Ctrl+X — и проверьте настройки:
sudo nginx -t. В ответе должны быть слова syntax is ok и test is successful. Тогда примените их:sudo systemctl reload nginx. Если команда ничего не ответила, настройки применены. - Проверьте:
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 |
Источники
- Документация nginx: add_header — коды ответа, параметр always, несколько строк, наследование с предыдущего уровня только без своих add_header.
- Исходный код nginx 1.24.0: ngx_http_headers_filter_module.c — add_header дописывает новую строку к заголовкам ответа; третьим параметром допустимо только always, иначе — ошибка invalid parameter.
- Fetch Standard: заголовок X-Content-Type-Options — с nosniff браузер блокирует скрипт с типом не JavaScript и стиль с типом не text/css.
- Документация nginx: proxy_hide_header — какие заголовки ответа приложения не передавать посетителю.
- RFC 9111: HTTP Caching, раздел 5.2 — что значат max-age, no-cache и no-store в Cache-Control.
- Файл mime.types из пакета nginx в Ubuntu 24.04 — css → text/css, js → application/javascript, svg → image/svg+xml, webp → image/webp, woff2 → font/woff2.
Сверено 14 октября 2026 года.
Что почитать дальше
- Настройки nginxкак устроены файлы и блоки, главные директивы.
- expires в nginxзаголовки Cache-Control и Expires для кэша браузера.
- gzip в nginxкак включить сжатие стилей и скриптов.
- proxy_pass в nginxкак передать запросы приложению.
- Команды wget и curlкак смотреть заголовки ответа командой curl -I.