Назад | Перейти на главную страницу

Директивы add_header в местоположении перезаписывают директивы add_header на сервере

С помощью nginx 1.2.1 Я могу добавить несколько заголовков, используя add_header следующим образом:

server {
    listen       80;
    server_name  localhost;
    root /var/www;
    add_header Name1 Value1;      <=== HERE
    add_header Name2 Value2;      <=== HERE

    location / {
        echo "Nginx localhost site";
    }
}

Результат

GET /
HTTP/1.1 200 OK
Name1: Value1
Name2: Value2

Однако, как только я использую add_header директива внутри location, другой add_header директивы под server игнорируются

server {
    listen       80;
    server_name  localhost;
    root /var/www;
    add_header Name1 Value1;      <=== HERE
    add_header Name2 Value2;      <=== HERE

    location / {
        add_header Name3 Value3;  <=== HERE
        add_header Name4 Value4;  <=== HERE
        echo "Nginx localhost site";
    }
}

Результат

GET /
HTTP/1.1 200 OK
Name3: Value3
Name4: Value4

В документация говорит, что оба server и location действительны context и не утверждает, что использование add_header в одном не позволяет использовать его в другом.

В1: знаете ли вы, является ли это ошибкой или предполагаемым поведением и почему?

Q2: Видите ли вы другие варианты решения этой проблемы, кроме использования HttpHeadersMoreModule модуль?

Это ожидаемое поведение. В add_header директивы, как и все другие директивы типа массива в nginx, наследуются от предыдущего уровня тогда и только тогда, когда нет add_header директивы, определенные на текущем уровне.

Если вы хотите, чтобы nginx добавил все заголовки в location /, вы должны перечислить их все в location /, т.е.

location / {
    add_header Name1 Value1;
    add_header Name2 Value2;
    add_header Name3 Value3;
    add_header Name4 Value4;
    return 200 "";
}

Если вам нужен способ перечислить большое подмножество заголовков в одном месте, вы можете использовать include директива для этого. См. Документы Вот.