Как я могу добавить заголовок условно в конфигурации nginx?
Как я могу добавить заголовок условно в конфигурации nginx (1.4.6 ubuntu)?
Сначала я пробовал вот так.
location / {
add_header X-TEST-0 always-0;
set $true 1;
if ($true) {
add_header X-TEST-1 only-true;
}
add_header X-TEST-2 always-2;
}
Хотя я ожидал, что мой nginx установит весь заголовок (X-TEST-0,1,2), он добавил только заголовок X-TEST-1.
Далее я пробовал вот так.
location / {
add_header X-TEST-0 always-0;
##set $true 1;
##if ($true) {
## add_header X-TEST-1 only-true;
##}
add_header X-TEST-2 always-2;
}
Мой nginx добавил заголовок X-TEST-1 и X-TEST-2, как я ожидал.
Мои кавычки...
Спасибо заранее!
Ответы
Ответ 1
(Я бы написал этот вывод для людей, у которых будет тот же вопрос в будущем. Спасибо @Alexey Ten за информацию.)
Вывод:
Не используйте директивы non-rewrite внутри директив if
. Поскольку директива if
по существу является частью модуля перезаписи.
Мы могли бы получить более подробную информацию об этом в официальном документе с именем IfIsEvil.
Ответ 2
Я использовал модуль lua nginx для решения аналогичной проблемы:
localtion / {
header_filter_by_lua_block {
ngx.header["X-TEST-0"] = "always-0";
# example of conditional header
if ngx.req.get_method() == ngx.HTTP_POST {
ngx.header["X-TEST-1"] = "only if POST request";
}
ngx.header["X-TEST-2"] = "always-2";
}
}
https://github.com/openresty/lua-nginx-module#header_filter_by_lua_block
"""
Ответ 3
Это просто, если вы думаете по-другому и используете карту.
map $variable $headervalue {
1 only-true;
default '';
}
# ...later...
location / {
add_header X-TEST-1 $headervalue;
}
Если $ variable равен 1, будет установлено значение $ headervalue и, следовательно, будет добавлен заголовок.
По умолчанию $ headervalue будет пустым и заголовок не будет добавлен.
Это эффективно, потому что Nginx оценивает карту только тогда, когда это необходимо (когда он достигает точки, где указывается значение $ headervalue).
Увидеть аналогичные: https://serverfault.com/info/598085/nginx-add-header-conditional-on-an-upstream-http-variable