现在的位置: 首页 > 综合 > 正文

nginx下载or呈现静态文件

2013年08月08日 ⁄ 综合 ⁄ 共 1072字 ⁄ 字号 评论关闭
文章目录

需求

例如图示这种http请求,我现在有两种需求:
  1. 呈现图片
  2. 下载图片
例如这个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;"; #弹框下载
		}

注解:
  1. 通过nginx提供的正则匹配判断get参数中的flag字段内容
  2. 如果flag为download则下载图片,否则浏览器呈现图片
  3. 指定指定文件的下载,防止信息泄露

效果

flag无数据,浏览器呈现图片

flag有数据,下载图片

【上篇】
【下篇】

抱歉!评论已关闭.