URL from X-Accel-Redirect overrides $uri for $proxy_pass after 1.2.0 upgrade

Maxim Dounin mdounin на mdounin.ru
Сб Апр 28 12:13:22 UTC 2012


Hello!

On Sat, Apr 28, 2012 at 07:44:53AM -0400, lekrus wrote:

> Здравствуйте,
> 
> Есть такой код:
> 
> location ~* ^/int/(.*) {
> 		internal;
> 				
> 		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 $scheme://$backend;
> 		proxy_redirect off;
> 		proxy_buffering off; 
> 	}
> 
> На эту ветку nginx попадает после
> передачи в X-Accel-Redirect параметра вида
> "/int/bla"
> 
> Запрос вида: http://localhost/test.aspx 
> До обновления на 1.2.0 перенаправлял на
> http://www.myhost.com/test.aspx
> После обновления на 1.2.0 перенаправляет
> на http://www.myhost.com/int/bla (т.е. на location, который
> передали в X-Accel-Redirect header)
> 
> В документации написано, что
> оригинальный URI не будет переписан.
> После обновления на 1.2.0. пришлось
> сделать такое изменение, чтобы
> редирект был правильным:
> proxy_pass $scheme://$backend$request_uri;
> 
> Подскажите - это раньше работало
> неправильно, а в новой версии все
> хорошо, либо это все же баг новой
> версии, либо это новая особенность?

Это раньше работало неправильно.

Changes with nginx 1.1.12:

    *) Bugfix: a "proxy_pass" directive without URI part always used
       original request URI if variables were used.

Теперь оно себя ведёт так же, как если бы проксируемый сервер
был задан в конфиге явно, т.е. разницы в поведении

    proxy_pass http://backend.example.org;

и
    set $backend "backend.example.org";
    proxy_pass http://$backend;

нет (за исключением динамического резолвинга имён).

Maxim Dounin



Подробная информация о списке рассылки nginx-ru