J'ai un proxy inverse sur Nginx qui proxy de plusieurs sites. J'ai récemment activé la sécurité de transport stricte HTTP pour tous les sites Web compatibles SSL. J'ai maintenant un site qui ne veut pas que cela soit activé.
Je pensais que je ferais juste un chèque simple si mon amont m'a déjà envoyé un Strict-Transport-Security
- Hauteur, et sinon, il suffit d'en ajouter un. De cette façon, mon amont pourrait envoyer une en-tête STS contenant max-age=0
Pour éviter d'avoir une HST activée par le proxy.
Je pensais que je changerais de ma configuration comme suit:
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";
}
}
Mais, probablement parce si c'est mal , cela ne fonctionne pas. J'ai essayé un tas de choses différentes pour vous assurer que la variable existe réellement (ce qui est le cas), mais rien ne semble aider.
Comment pourrais-je faire ce travail?
Cela ne fonctionne pas car le SI est évalué avant que la demande soit transmise au backend, les variables $ UPReM_HTTP_ n'ont pas encore aucune valeur. add_header avec une valeur vide est ignorée, vous pouvez donc utiliser A map pour ajouter de manière conditionnelle l'en-tête comme suit:
map $upstream_http_strict_transport_security $sts {
'' max-age=15552000;
}
server {
location / {
add_header Strict-Transport-Security $sts;
}
}
C'est parce que if
est exécuté avant que le proxy ait lieu et à ce moment-là, il n'y a pas de variable $upstream_http_strict_transport_security
.
Vous pouvez utiliser header_filter_by_lua
Directive du module Lua. Par exemple.
header_filter_by_lua 'if not ngx.header["X-Test"] then ngx.header["X-Test"] = "blah" end';