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

nginx добавляет заголовок с условием для переменной upstream_http_

У меня есть обратный прокси-сервер на nginx, который проксирует довольно много сайтов. Недавно я включил HTTP Strict Transport Security для всех веб-сайтов с поддержкой SSL. Теперь у меня есть один сайт, который не хочет, чтобы это было включено.

Я подумал, что просто сделаю простую проверку, если мой апстрим уже отправил мне Strict-Transport-Security-header, а если нет, просто добавьте его. Таким образом, мой восходящий поток мог отправить заголовок STS, содержащий max-age=0 чтобы избежать включения HSTS прокси.

Я думал, что просто изменю свою конфигурацию следующим образом:

location / {
        proxy_pass http://webservers;

        proxy_redirect off;

        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto "https";

        if ($upstream_http_strict_transport_security = "") {
                add_header Strict-Transport-Security "max-age=15552000";
        }
}

Но, наверное, потому что если зло, это не работает. Я пробовал кучу разных вещей, чтобы убедиться, что переменная действительно существует (что так и есть), но, похоже, ничего не помогает.

Как я мог заставить это работать?

Это не работает, потому что if вычисляется до того, как запрос будет передан на бэкэнд, поэтому переменные $ upstream_http_ еще не имеют значений. add_header с пустым значением игнорируется, поэтому вы можете использовать карта чтобы условно добавить заголовок так:

map $upstream_http_strict_transport_security $sts {
  '' max-age=15552000;
}

server {
  location / {
    add_header Strict-Transport-Security $sts;
  }
}

Это потому что if выполняется до прокси, и на данный момент нет переменной $upstream_http_strict_transport_security.

Вы могли бы использовать header_filter_by_lua директива из модуля Lua. Например.

header_filter_by_lua 'if not ngx.header["X-Test"] then ngx.header["X-Test"] = "blah" end';