mirror of https://github.com/yandex/gixy
65 lines
2.9 KiB
Markdown
65 lines
2.9 KiB
Markdown
# [add_header_redefinition] Переопределение "вышестоящих" заголовков ответа директивой "add_header"
|
||
|
||
К сожалению, многие считают что с помощью директивы `add_header` можно произвольно доопределять заголовки ответа.
|
||
Это не так, о чем сказано в [документации](http://nginx.org/ru/docs/http/ngx_http_headers_module.html#add_header) к Nginx:
|
||
> Директив `add_header` может быть несколько. Директивы наследуются с предыдущего уровня при условии, что на данном уровне не описаны свои директивы `add_header`.
|
||
|
||
К слову, так работает наследование большинства директив в nginx'е. Если вы задаёте что-то на каком-то уровне конфигурации (например, в локейшене), то наследования с предыдущих уровней (например, с http секции) - не будет.
|
||
|
||
В этом довольно легко убедится:
|
||
- Конфигурация:
|
||
```nginx
|
||
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` есть в ответе сервера):
|
||
```http
|
||
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`):
|
||
```http
|
||
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](https://www.nginx.com/resources/wiki/modules/headers_more/).
|
||
|
||
Каждый из способов имеет свои преимущества и недостатки, какой предпочесть зависит от ваших потребностей. |