Nginx 代理实现请求 URL ?attname=XXX 下载文件

浏览器在请求图片、文本、PDF 一类的文件时会直接打开展示而不是下载,如果需要要求浏览器下载,可以通过 Content-Disposition 实现。通过以下配置可以实现和七牛的自定义资源下载名一样的通过 URL 的 attname=XXX 参数指定文件下载功能,Nginx 配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server {
listen 80;
server_name example.com;

location / {
# 省略其他配置...

set $qs "$query_string&";
if ($qs ~ "attname=(.*?)&") {
set $attname $1;
add_header 'Content-Disposition' 'attachment; filename*=utf-8\'\'$attname';
}

# 省略其他配置...
}
}

正常情况是 ?attname=xxx.rar,但对于 ?attname=xxx.rar&token=xxx 一类的 URL,虽然极为少见,为了兼容所以上面代码对 $query_string 处理了一下,保证兼容性更广。

我是用 Nginx 代理 MinIO,因为全面兼容 AWS S3 ,在私有存储库预签名 URL 的情况下,可以结合以下文档使用:

https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_GetObject.html#API_GetObject_RequestSyntax

其中有提到 “You must sign the request, either using an Authorization header or a presigned URL, when using these parameters. They cannot be used with an unsigned (anonymous) request.”,所以匿名访问的情况还是通过 Nginx 配置实现即可。