nginx додати заголовок умовно на змінну upstream_http_


19

У мене є зворотний проксі на nginx, який проксі досить багато сайтів. Нещодавно я включив жорстку безпеку транспорту HTTP для всіх веб-сайтів із підтримкою SSL. Зараз у мене є один сайт, який не хоче, щоб це було ввімкнено.

Я думав, що буду просто перевірити, якщо мій верхній потік вже надіслав мені Strict-Transport-Security-головок, а якщо ні, просто додам його. Таким чином, мій верхній потік може надіслати заголовок 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";
        }
}

Але, мабуть, тому, що якщо це зло , це не працює. Я спробував купу різних речей, щоб переконатися, що змінна насправді існує (що так і є), але ніби нічого не допомагає.

Як я міг змусити цю роботу?

Відповіді:


22

Це не працює, тому що якщо оцінюється перед тим, як запит буде передано в бекенд, тому змінні $ upstream_http_ ще не мають жодних значень. add_header з порожнім значенням ігнорується, тому ви можете використовувати карту для умовного додавання заголовка так:

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

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

1
Розумне використання карти!
Олексій Десять,

Гаразд, я намагався зробити щось трохи інше, але я не міг зрозуміти nginx. Чи можете ви сказати мені, де я можу офіційно вивчити nginx. А також ви можете мені тут допомогти: serverfault.com/questions/678521/…
Мухаммед Умер

5

Це тому 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';

1
Це працює. На Debian 7 ви можете отримати підтримку LUA, використовуючи Nginx із спинок через apt-get -t wheezy-backports install nginx-extras.
Пітер Еннес
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.