У меня есть обратный прокси-сервер на 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';