首页 > 解决方案 > 将标头从后端添加到 Nginx X-Accel-Redirect 响应

问题描述

问题:

我有一个后端服务器,一个 Nginx 反向代理,以及一个 S3 中的文件存储。

当前行为是:

这是通过以下配置实现的,并且工作正常:

upstream platform {
    server localhost:8000;
}


server {
    error_log /dev/stderr;
    access_log /dev/stdout;
    listen 80;

    location ~ ^/document_store/(.*?)/(.*?)/(.*) {
        internal;
        resolver 8.8.8.8 ipv6=off;
        set $download_protocol $1;
        set $download_host $2;
        set $download_path $3;
        set $download_url $download_protocol://$download_host/$download_path;
        proxy_hide_header Content-Disposition;
        proxy_hide_header Access-Control-Allow-Origin;
        add_header Content-Disposition $upstream_http_content_disposition;
        add_header Access-Control-Allow-Origin *;
        proxy_max_temp_file_size 0;
        proxy_pass $download_url$is_args$args;
      }

    location / {
        proxy_pass http://platform;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }
}

我现在希望行为是这样的:

我已经阅读了有关此主题的几个 SO 问题,但似乎没有一个有效。

我试过引用$upstream_http_x_foo变量,但它似乎是空的。我的理解是,这是因为upstream已经变成了 S3,没有提供这个 header。从一个特定的 SO 问题(Nginx 将上游标头传递给远程请求),我尝试了这个:

upstream platform {
    server localhost:8000;
}

proxy_pass_header X-Accel-Redirect;

server {
    error_log /dev/stderr;
    access_log /dev/stdout;
    listen 80;

location ^~ /document_store/ {
    internal;
    set $custom_header_value $upstream_http_x_foo;
    rewrite ^/(.+) /redirect_$1;
}

    location ~ ^/redirect_document_store/(.*?)/(.*?)/(.*) {
        resolver 8.8.8.8 ipv6=off;
        set $download_protocol $1;
        set $download_host $2;
        set $download_path $3;
        set $download_url $download_protocol://$download_host/$download_path;
        proxy_hide_header Content-Disposition;
        proxy_hide_header Access-Control-Allow-Origin;
        add_header Content-Disposition $upstream_http_content_disposition;
        add_header Access-Control-Allow-Origin *;
        proxy_max_temp_file_size 0;
        proxy_pass_header X-Foo;
        add_header X-Foo $custom_header_value;
        proxy_pass $download_url$is_args$args;
      }

    location / {
        proxy_pass http://platform;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }
}

想法是在后端存储标头的值upstream,以便以后可以在upstream成为 S3 时添加它。

这也不起作用。没有明显的错误,响应根本不包含标题。我在 S3 或文档中找不到任何替代选项。我对 Nginx 不是特别了解,所以上面的解决方案可能只是我错误地实现了。

编辑:我也尝试在add_header指令下方添加proxy_pass指令,但这也无济于事。

标签: nginxsendfilex-accel-redirect

解决方案


推荐阅读