需求
例如图示这种http请求,我现在有两种需求:
- 呈现图片
- 下载图片
例如这个url,nginx实现了浏览器对这个图片的呈现,实现下载功能就不能不提Content-Disposition的作用了
header中的Content-Disposition
content-disposition是MIME协议的扩展,MIME协议指示MIME用户如何显示附加文件。当Internet Explorer接到头时,它会激活文件下载对话框,它的文件名框自动填充了头中指定的文件名。
服务器向客户端浏览器发送文件时,如果是浏览器支持的文件类型,一般会默认使用浏览器打开,比如txt,png等,会直接在浏览器中显示,如果需要提示用户保存,就用利用Content-Disposition进行一下处理,关键在于加上attachment:
Response.AppendHeader("Content-Disposition","attachment;filename=FileName.txt");
nginx的配置
需求(针对同一图片)
- 浏览器显示图片
- 浏览器下载图片
思路
针对访问图片的url,增加一个GET参数flag
- 当flag=download时,nginx上针对此url增加content-disposition配置,浏览器下载图片
- 否则默认处理,浏览器呈现图片
实现方法
nginx的几个全局变量
- request_filename : 当前请求的文件路径,由root或alias指令与URI生成(可用于content-disposition中的filename字段填写)
- args: 这个变量等于请求行中(GET请求)的参数,例如foo=123&bar=456
nginx根据get参数进行跳转
if ($request_filename ~* \.(png)|(jpg)$) {
set $sign 1; #解决if的多层嵌套,防止资源泄露
}
if ($args ~* ^flag=(.*)$) {
set $flag $sign$1; #设置标识字段,判断是呈现还是下载
}
if ($flag = "1flag") {
add_header Content-Disposition "attachment;"; #弹框下载
}
注解:
- 通过nginx提供的正则匹配判断get参数中的flag字段内容
- 如果flag为download则下载图片,否则浏览器呈现图片
- 指定指定文件的下载,防止信息泄露