Skip to content

Latest commit

 

History

History
65 lines (53 loc) · 2.93 KB

addheaderredefinition.md

File metadata and controls

65 lines (53 loc) · 2.93 KB

[add_header_redefinition] Переопределение "вышестоящих" заголовков ответа директивой "add_header"

К сожалению, многие считают что с помощью директивы 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

Что делать?

Существует несколько способов решить эту проблему:

  • продублировать важные заголовки;
  • устанавливать заголовки на одном уровне, например, в серверной секции;
  • использовать модуль ngx_headers_more.

Каждый из способов имеет свои преимущества и недостатки, какой предпочесть зависит от ваших потребностей.