Nginx 强制下载文件的配置方法

DevOps技术栈

共 4761字,需浏览 10分钟

 ·

2023-05-23 11:14

原文链接:https://www.jb51.net/article/80237.htm


时您可能需要 强制用户从您的网站下载内容,而不是在他们的网站上查看。如果您的网站有很多可下载的内容,这一点很重要。在本文中,我们将了解如何在 NGINX 中强制下载文件。强制文件下载可防止用户在您的服务器上流式传输这些文件并减少您网站的服务器负载。

现在的浏览器能够识别很多文件类型(txt,pdf,jpg...),并在浏览器中自动打开

情况一:
添加头信息Content-Disposition "attachment;"会使浏览器强制下载:

代码如下:

      
        
          #表示浏览器内嵌显示一个文件
        
      
      
        
          Content-disposition: inline; filename=foobar.pdf
        
      
      
      
        
          #表示会下载文件,如火狐浏览器中
        
      
      
        
          Content-disposition: attachment; filename=foobar.pdf
        
      
    

nginx配置如下,在相应的server中添加如下location:

代码如下:

      
        location /download {
      
      
            add_header Content-Disposition "attachment;";
      
      
        }
      
    

情况二:

有这么一个需求,对于图片文件和pdf等文件链接,只要访问实在某个路径下,不能在浏览器中打开图片,而是提示用户保存到本地,文件名使用访问的文件名。
这个问题主要是IE造成的,不管mime类型是什么,比如人工把图片的mime类型设置为octet-stream,如果浏览器认识文件后缀的话,仍然会在浏览器中打开图片。

解决方案:

在响应的http头添加:Content-Disposition: attachment; filename=文件名
nginx配置如下:

代码如下:

      
          location ~ ^/somepath/(.*)$ {
      
      
                add_header Content-Disposition "attachment; filename=$1";
      
      
                alias "E:/apache-tomcat-7.0.32/webapps/upload/$1";
      
      
           }
      
    

这里使用到了正则表达式,捕获请求的文件名。
另外,需要注意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
      
    


- END -

    
      
        
            
              
                  
                    
                      
                          
                            
                                 
                                推荐阅读 
                                
                                  





                        
                          原来懂Kubernetes,找工作这么吃香! K8S 常用资源 YAML 详解
                            
19 个 K8S集群常见问题总结,建议收藏
Prometheus 高可用架构 Thanos
运维高可用架构的 6 大常规方案
运维监控指标全方面总结 我去,Linux 系统 CPU 100% 打满了! 解决 Linux 性能瓶颈的黄金 60 秒! 9 个实用 Shell 脚本,建议收藏!
详解 K8S Helm CI/CD发布流程
ES+Redis+MySQL,这套高可用架构设计太顶了! 一台服务器最大能支持多少条TCP连接? K8S运维必知必会的 Kubectl 命令总结
16 张图硬核讲解 Kubernetes 网络
史上最全 Jenkins Pipeline流水线详解 Jenkins 自动化部署实例讲解,另附安装教程! 主流监控系统 Prometheus 学习指南
                          
                              搭建一套完整的企业级 K8s 集群(二进制方式)
                            
                            
                            
                                40个 Nginx 常问面试题
                              
                            
                                Linux运维工程师 50个常见面试题
                              
                            
          
            
                
                    

点亮,服务器三年不宕机338912a8939cea1ee8ae6b2b71ba0419.webp
浏览 50
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报