Re: Реверс прокси -- проблема с localhost
Maxim Dounin
mdounin на mdounin.ru
Вт Окт 19 22:30:01 MSD 2010
Hello!
On Tue, Oct 19, 2010 at 12:28:31PM -0400, dr.gigabit wrote:
> Maxim Dounin Wrote:
> -------------------------------------------------------
> > Hello!
> >
> > On Mon, Oct 18, 2010 at 12:19:54PM -0400,
> > dr.gigabit wrote:
> >
> > > Оставил
> > > server {
> > > listen 80;
> > > proxy_pass
> > http://localhost:8080/;
> > > proxy_redirect http://localhost:8080/
> > http://localhost/;
> > > }
> >
> > Такая конфигурация не
> > пройдёт тестирование -
> > proxy_pass не
> > разрешён в контексте server{},
> > только в location.
>
> Прошу прощения, я не верный конфиг
> здесь привел. Вот верный:
>
> server {
> listen 80;
>
> location / {
> 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_pass http://localhost:8080/;
> proxy_redirect http://localhost:8080/ http://localhost/;
> }
>
> В бэкенде происходит редирект на
> localhost:8080/url/. И если я захожу http://localhost
> получаю редирект на localhost:8080/url, а
> ожидается что это будет http://localhost/url.
Если бекенд действительно возвращает редирект на
"localhost:8080/url/" (без "http://") - то ничего удивительного в
этом нет. Ибо "localhost:8080/url/" не начинается с
"http://localhost:8080/".
В данном случае я бы лечил бекенд, ибо относительные url'ы нельзя
использовать в заголовке Location[1]. Но в принципе можно
ограничится proxy_redirect'ом:
proxy_redirect localhost:8080/ http://localhost/;
Или, что немного правильнее:
proxy_redirect localhost:8080/ /;
и установить server_name_in_redirect в желаемое значение.
[1] http://tools.ietf.org/html/rfc2616#section-14.30
> По документации непонятно, можно ли
> настроить proxy_redirect в виде: proxy_redirect
> http://localhost:8080/* http://localhost/*;
> где * -- означает любой путь. Т.е. чтобы
Поскольку ссылки явно не помогают, цитирую документацию тут:
: Директива задаёт текст, который нужно изменить в строках заголовка
: "Location" и "Refresh" в ответе проксируемого сервера.
: Предположим, проксируемый сервер вернул строку "Location:
: http://localhost:8000/two/some/uri/". Директива
:
: proxy_redirect http://localhost:8000/two/ http://frontend/one/;
:
: перепишет эту строку в виде "Location: http://frontend/one/some/uri/".
Т.е. любой proxy_redirect предполагает, что в конце может быть
любой путь, он просто заменяет один префикс в заголовке Location на
другой префикс.
> все входящие запросы по данному адресу
> и порту перенаправлялись на localhost:8080, но
> обратно возвращались снова с HOST_HEADER'ом,
> который был в запросе. По-моему, это
> стандартный сценарий reverse proxy.
Чтобы использовался заголовок Host из запроса, нужно в строке
замены proxy_redirect писать относительный путь (e.g. "/"), и
использовать
server_name_in_redirect off;
Подробнее читать тут:
http://sysoev.ru/nginx/docs/http/ngx_http_proxy_module.html#proxy_redirect
http://sysoev.ru/nginx/docs/http/ngx_http_core_module.html#server_name_in_redirect
Maxim Dounin
Подробная информация о списке рассылки nginx-ru