Re: Не передается response header при исползовании X-Accel-Redirect

Maxim Dounin mdounin на mdounin.ru
Ср Июн 14 15:05:10 UTC 2017


Hello!

On Wed, Jun 14, 2017 at 05:53:39PM +0300, Никита wrote:

> 
> Вот так не работает. 
> 
> location / {
> ssi off;
> include uwsgi_params;
> uwsgi_pass unix:/var/run/uwsgi/app/beta1/socket; ### вот этот бекенд создает этот хедер и отдает в ответ. 
> uwsgi_param HTTP_X_ORIGINAL_URL $request_uri;
> uwsgi_connect_timeout 300;
> uwsgi_pass_header HTTP_X_FLAVOUR; ## пробовали подобное в разных вариациях
> uwsgi_pass_header UPSTREAM_HTTP_X_FLAVOUR; ## пробовали подобное в разных вариациях
> set $flavour $upstream_http_x_flavour; ## Расчитываем вот в этом месте завернуть хедер из ответа в переменную $flavour но судя по логу $upstream_http_X_Flavour пуст при том что в дебаг логе видно что бекенд его возвращает. 
> }
> location ~ ^/_internal/redirect-mobile-website/(.*)$ {
> proxy_set_header Host $host;
> proxy_set_header X-Subdomain $x_subdomain;
> proxy_pass_header X-Flavour;
> proxy_set_header X-Flavour $flavour; ### А вот тут передать ее в подзапрос. 
> proxy_pass http://consul-frontend-mobile-website--beta1/$1$is_args$args;
> }

Вы неправильно понимаете, как работают директивы в nginx'е.  
Директивы не выполняются последовательно, они задают конфигурацию 
для кокретного location'а.  Соответственно, директива set 
внутри "location /" будут выполнена на этапе поиска конфигурации, 
до отправки запроса на бекенд.  Подробнее о том, как выполняются 
директивы модуля rewrite, можно почитать в документации, 
http://nginx.org/ru/docs/http/ngx_http_rewrite_module.html.

Чтобы сохранилось значение, полученное от бекенда, надо 
использовать директиву set уже после перенаправления, в том же 
location'е, где вы собираетесь это значение использовать в 
proxy_set_header, что и было показано в приведённом ранее примере.   
Тот же пример, слегка расширенный, чтобы исключить 
неоднозначность:

    location / {
        proxy_pass http://backend-to-return-redirect;
        ...
    }

    location /redirected/ {
        set $foo $upstream_http_x_flavour;
        proxy_pass  http://...;
        proxy_set_header X-Flavour $upstream_http_x_flavour;
        ...
    }

-- 
Maxim Dounin
http://nginx.org/


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