使用nginx+springmvc实现文件下载
文件下载可以通过nginx直接实现,不必通过后端server程序就能直接下载,而且通过nginx下载效率很高,但是有时候需要在server端处理一些业务逻辑,比如统计下载次数,判断是否有权限下载等。如果通过server端程序实现下载,返回文件流,当文件比较大或者并发下载压力较大的时候,效率上跟nginx比就会差很多。现在很多web服务器都提供了相应的解决方法,使用response header来控制下载,nginx相应的response header叫X-Accel-Redirect。
客户端下载文件的时候,最初header中没有X-Accel-Redirect,nginx并不会将文件直接返回,而是传送到后端服务器程序处理,在后端执行完业务逻辑之后可以在response header里添加X-Accel-Redirect的信息,结束处理,当请求返回到nginx之后,根据X-Accel-Redirect的信息,可以将文件返回给客户端。
Nginx 配置样例:
location /protected/ {
internal;
root /some/path;
}
internal表示这个是内部指令,只有内部的请求才能使用,客户端不能直接访问,即使客户端伪造 "X-Accel-Redirect" 下载文件也不行。
注意事项:
在使用时候,以下头信息是不能被Nginx更改的(即这些信息得由server端程序来指定!)
Content-Type
Content-Disposition
Accept-Ranges
Set-Cookie
Cache-Control
Expires
如果其中的一些信息没有指定,那么重定向请求设置!