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