ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Реверс прокси -- проблем а с localhost



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 mailing list
nginx-ru@xxxxxxxxx
http://nginx.org/mailman/listinfo/nginx-ru


 




Copyright © Lexa Software, 1996-2009.