addheaderredefinition.md 2.9 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.

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