您可以这样改写原文:有时,您可能希望用户从您的网站下载内容,而不是在浏览器中查看。如果您的网站提供了大量可下载的内容,这一点尤为重要。本文将介绍如何在 NGINX 中实现强制文件下载。这样可以防止用户在您的服务器上流式传输文件,从而减轻您网站服务器的负载。
目前的浏览器能够识别多种文件类型(如 txt、pdf、jpg 等),并能够自动在浏览器中打开它们。
情况一: 通过添加头信息 Content-Disposition “attachment;”,可以让浏览器强制下载文件。
相关代码如下:
#表示浏览器内嵌显示一个文件
Content-disposition: inline; filename=foobar.pdf
#表示会下载文件,如火狐浏览器中
Content-disposition: attachment; filename=foobar.pdf
nginx配置如下,在相应的server中添加如下location:
代码如下:
#表示浏览器内嵌显示一个文件
Content-disposition: inline; filename=foobar.pdf
#表示会下载文件,如火狐浏览器中
Content-disposition: attachment; filename=foobar.pdf
情况二:
有这么一个需求,对于图片文件和pdf等文件链接,只要访问实在某个路径下,不能在浏览器中打开图片,而是提示用户保存到本地,文件名使用访问的文件名。
这个问题主要是IE造成的,不管mime类型是什么,比如人工把图片的mime类型设置为octet-stream,如果浏览器认识文件后缀的话,仍然会在浏览器中打开图片。
解决方案:
在响应的http头添加:Content-Disposition: attachment; filename=文件名
nginx配置如下:
代码如下:
#表示浏览器内嵌显示一个文件
Content-disposition: inline; filename=foobar.pdf
#表示会下载文件,如火狐浏览器中
Content-disposition: attachment; filename=foobar.pdf
这里使用到了正则表达式,捕获请求的文件名。
另外,需要注意nginx的location优先级,首先是=,然后是^~,最后才是~。
基本上,您需要在要强制下载的 URL 的位置块中添加以下行。
add_header Content-disposition "attachment; filename=$1";
default_type application/octet-stream;
上面两行将内容处置标头设置为“附件”,将内容类型设置为“应用程序/八位字节流”以启用下载。
例如,如果您想对以 /downloads 开头的所有 URL 强制下载,则在该文件夹的位置块中添加上述行,如下所示。
location /downloads {
...
add_header Content-disposition "attachment; filename=$1";
default_type application/octet-stream;
...
}
如果您想强制下载以某些文件类型和扩展名(例如 .jpg、.png、.mp3 等)结尾的所有文件,请在用于这些文件类型的位置块中添加上述 2 行。
location ~* ^/.+\.(?:gif|jpe?g|png|mp4|mp3)$ {
...
add_header Content-disposition "attachment; filename=$1";
default_type application/octet-stream;
...
}
以上修改完成后需要重启Nginx,或重新加载
nginx -s reload
以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !