К сожалению, многие считают что с помощью директивы add_header
можно произвольно доопределять заголовки ответа.
Это не так, о чем сказано в документации к Nginx:
Директив
add_header
может быть несколько. Директивы наследуются с предыдущего уровня при условии, что на данном уровне не описаны свои директивыadd_header
.
К слову, так работает наследование большинства директив в nginx'е. Если вы задаёте что-то на каком-то уровне конфигурации (например, в локейшене), то наследования с предыдущих уровней (например, с http секции) - не будет.
В этом довольно легко убедится:
Конфигурация:
server {
listen 80;
add_header X-Frame-Options "DENY" always;
location / {
return 200 "index";
}
location /new-headers {
# Add special cache control
add_header Cache-Control "no-cache, no-store, max-age=0, must-revalidate" always;
add_header Pragma "no-cache" always;
return 200 "new-headers";
}
}
Запрос к локейшену /
(заголовок X-Frame-Options
есть в ответе сервера):
GET / HTTP/1.0
HTTP/1.1 200 OK
Server: nginx/1.10.2
Date: Mon, 09 Jan 2017 19:28:33 GMT
Content-Type: application/octet-stream
Content-Length: 5
Connection: close
X-Frame-Options: DENY
index
Запрос к локейшену /new-headers
(есть заголовки Cache-Control
и Pragma
, но нет X-Frame-Options
):
GET /new-headers HTTP/1.0
HTTP/1.1 200 OK
Server: nginx/1.10.2
Date: Mon, 09 Jan 2017 19:29:46 GMT
Content-Type: application/octet-stream
Content-Length: 11
Connection: close
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
new-headers
Существует несколько способов решить эту проблему:
Каждый из способов имеет свои преимущества и недостатки, какой предпочесть зависит от ваших потребностей.