Переписать URL при сбросе заголовка запроса - nginx - PullRequest
0 голосов
/ 12 февраля 2020

Я пытаюсь переписать относительный URL-адрес "/ A" в "/ B", а также задаю заголовок запроса. URL / A уже доступен для некоторых клиентов. / B - это, по существу, / A с заголовком Accept, установленным на "json". Я пытаюсь удалить поддержку / A из апстрима и просто иметь / B в апстриме. Но мне нужно продолжать поддерживать / A. Следовательно, проблема

Я могу переписать успешно, однако заголовок не устанавливается.


location = /A {
   proxy_set_header Accept "json"
   rewrite /A /B;
}

location = /B {
  ... a lot of configurations here ...
  proxy_pass http://my_upstream;
}

Следующее работает для меня, но я вижу, что nginx делает дополнительный запрос к Сам, что не так круто.

location = /A {
   proxy_set_header Accept "json"
   proxy_pass http://127.0.0.1:$server_port/B;
}

location = /B {
  ... a lot of configurations here ...
  proxy_pass http://my_upstream;
}

Есть предложения?

1 Ответ

0 голосов
/ 12 февраля 2020
location = /A {
   set $accept "json";
   rewrite /A /B;
}

location = /B {
    proxy_set_header Accept $accept;
    ... a lot of configurations here ...
    proxy_pass http://my_upstream;
}

nginx вообще не установит заголовок, если пустая строка будет передана как proxy_set_header второй параметр. И если ваш запрос не будет перехвачен блоком location = /A, переменная $accept будет иметь пустое значение в блоке location = /B.

Обновление

Конфигурация задана выше очищает HTTP-заголовок Accept, если запрос перехватывается вторым блоком местоположения. Если вы хотите сохранить его, вы можете использовать более сложную конфигурацию:

map $accept $accept_header {
    ""       $http_accept;
    default  $accept;
}

server {

    ...

    location = /A {
        set $accept "json";
        rewrite /A /B;
    }

    location = /B {
        proxy_set_header Accept $accept_header;
        ... a lot of configurations here ...
        proxy_pass http://my_upstream;
    }

    ...

}
...