nginx - 将标头从后端添加到 Nginx X-Accel-Redirect 响应
问题描述
问题:
我有一个后端服务器,一个 Nginx 反向代理,以及一个 S3 中的文件存储。
当前行为是:
- 请求来自客户端
- 通过 Nginx 到后端
- 后端返回带有
X-Accel-Redirect
标头的响应,指向 S3 - 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;
}
}
我现在希望行为是这样的:
- 请求来自客户端
- 通过 Nginx 到后端
- 后端返回带有
X-Accel-Redirect
指向 S3 的标头和自定义X-Foo
标头的响应。 - Nginx 内部重定向(可能不正确的术语)到 S3
- 客户端接收文件响应,以及
X-Foo
来自后端的标头。
我已经阅读了有关此主题的几个 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
指令,但这也无济于事。
解决方案
推荐阅读
- arrays - 从多维结构中获取数据
- .net-5 - 为什么 .NET 5 中的引用类型没有 Interlocked.Read?
- html - 如何将 Bootstrap 4 列高限制为另一个列高?
- java - CodenameOne - 在主题中导入一组图像
- c - C Socket 代码在 LAN 内工作,但不能在 WAN 上工作?拒绝连接?
- spring - 带有登录用户过滤器的 JWT 的 Spring Security
- mysql - MySQL Count 在同一日期具有“开始”和“完成”条目的用户记录数?
- linear-programming - 如何使用二进制变量在 LPsolve 中添加依赖约束
- reactjs - 为什么在渲染组件之前触发 useEffect() ?
- hyperlink - target ="_blank" 自动添加到电子邮件中