Tag Archives: MimboloveнабралиНаФлотПоОбъявлению
Предположим у нас есть nginx и проксируемая приложунька.
Nginx отвечает на запросы http://frontend.ru:8080/foo и проксирует их локально на http://localhost:8090/foo
Если приложение хочет ответить редиректом на /somewhere, то пользователь должен увидеть Location: http://frontend.ru:8080/somewhere
Тут есть нюанс. Поведение зависит от того, как мы передаём заголовок Host в бекенд. Можно написать так:
location / { proxy_pass http://localhost:8080; proxy_set_header HOST $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-NginX-Proxy true; proxy_redirect off; }
И тогда бекенду будет приходить заголовок Host: frontend.ru. Если приложение не экзотическое, оно на такой заголовок сформирует редирект без указания порта (т.к. про порт ему и узнать неоткуда). В результате ответ будет такой: Location: http://frontend.ru/, что совсем не круто. Нам-то нужен нормальный Location ! С портом !
В общем, есть два пути решения этой проблемы.
Первый способ: настроить rewrite для заголовков ответа
proxy_redirect http://$host/ http://$host:$server_port/;
Эта штука будет перехватывать ответ приложения и заменять в заголовках Location, дописывая порт.
И второй: использовать в директиве proxy_set_header HOST $host; переменную $http_host вместо переменной $host:
proxy_set_header HOST $http_host;
$http_host выгодно отличается от просто $host тем, что содержит порт (хехе), и всё сразу начинает работать. Приложение формирует правильные редиректы, их даже и не приходится перезаписывать, пользователи довольны, донатят тысячи и тысячи в валюте.
0