Использование заголовка для фильтрации прокси-заголовков ответа - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть вышестоящий сервер, который часто устанавливает cookie-файлы, возвращая заголовок ответа «Set-Cookie».

Я бы хотел иметь прокси nginx перед указанным вышестоящим сервером:

Browser => Nginx => Upstream

Если бы запрос Browser => Nginx имел заголовок X-No-Cookies: true, я бы хотел, чтобы ответ от Upstream => Nginx => Browser не содержал заголовок ответа Set-Cookie.Если бы X-No-Cookies имел какое-либо другое значение, я бы лежал, чтобы заголовок ответа Set-Cookie был возвращен без изменений. Я не могу изменить поведение заголовка ответа вышестоящего сервера.

В настоящее время моя конфигурация nginx выглядит следующим образом, обратите особое внимание на использование директивы proxy_hide_header.Я также повторил переменную $proxy_hide_header в заголовке ответа X-No-Cookies.

map $http_x_no_cookies $proxy_hide_header {
  default "";
  "true"  "Set-Cookie";
}

# Homepage
server {
  listen 80;
  server_name example.com;

  location /api {
    proxy_pass        https://example.com/api;
    proxy_hide_header $proxy_hide_header;
    add_header        "X-No-Cookies" $proxy_hide_header;
  }
}

Когда я делаю запрос с помощью cURL:

curl \
  http://example.com/api \
  -H 'X-No-Cookies: true' \
  -I

, я получаю следующие заголовки ответа:

Server: nginx/1.12.2
Date: Thu, 13 Dec 2018 02:26:41 GMT
Content-Type: application/json
Content-Length: 2255
Connection: keep-alive
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: DNT,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Accept,Authorization
Access-Control-Allow-Methods: GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS
Access-Control-Expose-Headers: Content-Length
Set-Cookie: foo=bar; Max-Age=2592000; Expires=Sat, 12 Jan 2019 02:26:41 GMT; Path=/; Domain=example.com; Secure
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
X-No-Cookies: Set-Cookie

Всякий раз, когда proxy_hide_header предоставляется переменная nginx в качестве аргумента, это, кажется, не имеет никакого эффекта.Если я поменяю местами переменную ($proxy_hide_header вместо "Set-Cookie"), я получу желаемое поведение - заголовок ответа Set-Cookie опущен.

Редактировать : Я имеюотправил код этого вопроса в GitHub

  • Моя оригинальная (нерабочая) реализация здесь
  • Решение Ивана Шацкого здесь

1 Ответ

0 голосов
/ 13 декабря 2018

Какой интересный вызов!Действительно, $proxy_hide_header не принимает переменные в качестве параметра и не может использоваться внутри блоков if.Также мы не можем использовать $upstream_... переменные непосредственно внутри блока location, потому что его значения еще не оценены.Наконец я нашел решение.Мы всегда скрываем заголовок Set-Cookie и затем при необходимости устанавливаем его заново, значения вычисляются с помощью выражений map:

map $http_x_no_cookies $hide_cookies {
    default "0";
    "true"  "1";
}

map $hide_cookies$upstream_http_set_cookie $cookies {
    ~^0(.*)$ $1;
}

upstream backend {
    server example.com;
}

server {
    listen 80;
    server_name example.com;

    location /api {
        proxy_pass        https://backend/api;
        proxy_hide_header Set-Cookie;
        add_header Set-Cookie $cookies;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...