使用X-Sendfile下载文件

使用X-Sendfile下载文件X-Sendfile是一种将文件下载请求由后端应用转交给前端web服务器处理的机制,它可以消除后端程序既要读文件又要处理发送的压力,从而显著提高服务器效率,特别是处理大文件下载的情形下!X-Sendfile通过HTTPheader来实现:在X-Sendfile头中指定一个文件的地址来通告前webserver。不过,在默认情况下它是被大多数web服务器禁用的。而不同的…

大家好,又见面了,我是你们的朋友全栈君。

X-Sendfile 是一种将文件下载请求由后端应用转交给前端 web 服务器处理的机制,它可以消除后端程序既要读文件又要处理发送的压力,从而显著提高服务器效率,特别是处理大文件下载的情形下!

X-Sendfile 通过 HTTP header 来实现:在 X-Sendfile 头中指定一个文件的地址来通告前web server。

不过,在默认情况下它是被大多数 web 服务器禁用的。而不同的 web 服务器的实现也不一样,包括规定了不同的 X-Sendfile 头格式。如果配置不合理将无法完成文件下载。

不同的 web 服务器实现了不同的 HTTP 头 ,sendfile 头和使用的 web 服务器如下:
X-Sendfile Apache, Lighttpd v1.5, Cherokee
X-LIGHTTPD-send-file Lighttpd v1.4
X-Accel-Redirect Nginx, Cherokee

使用 X-SendFile 的缺点是你失去了对文件传输机制的控制。例如如果你希望在完成文件下载后执行某些操作,比如只允许用户下载文件一次,这个 X-Sendfile 是没法做到的,因为后台的 php 脚本并不知道下载是否成功。

    Nginx 默认支持该特性,不需要加载额外的模块。只需要在配置文件中加入类似如下代码;

location /protected/ {
     internal;
     root   /file/soft;
    }

internal 表示这个路径只能在 Nginx 内部访问,不能用浏览器直接访问防止未授权的下载。

这里我们要注意:如果我们使用类似于laravel这种框架,我们的路由配置如果也有protected(此名字跟location后面一致,可以自己随意定义),那么我们会出现500错误,原因是服务器直接先匹配了url然后直接访问里面的root地址了,然后internal又标识不能访问这个路径,所以会报错!所以我们要确定路由没有location后面的单词!

我们只需要保持保存文件的名字跟location后面的单词一致,还和header中的第一个文件路径一致即可,例如:

location /protected/   header(‘X-Accel-Redirect: /protected/www.rar’) 还有文件保存的文件名,这三个保持一致即可!

配置文件生效后,使用如下代码即可实现下载:

//发送header前首先验证权限

header(“Content-Type:application/octet-stream;charset=utf-8”);
header(‘Content-Disposition: attachment; filename=test.rar’);
header(‘X-Accel-Redirect: /protected/www.rar’);

以上代码可以完成下载文件/file/soft/protected/www.rar

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/135081.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月5日 下午8:16
下一篇 2022年6月5日 下午8:16


相关推荐

  • GoogleGoogle搜索解析

    GoogleGoogle搜索解析GoogleGoogle搜索解析是一个类似Google趋势SEO在线keyword工具。它的正式口号提出“在搜索些什么”。利用Google搜索解析,能够比較特定区域、类别、时间范围以及搜索资源之间的搜索量模式,这点也是Google搜索解析相比仅仅能提供基本信息的Googlekeyword工具。Google趋势。Google站点管理员工具以及GoogleAnalytic…

    2022年6月16日
    51
  • goland2021激活码【注册码】

    goland2021激活码【注册码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月17日
    64
  • 国产系统中标麒麟neokylin上的视频监控系统

    国产系统中标麒麟neokylin上的视频监控系统一、功能特点采用分层设计,整体总共分三级界面,一级界面是整体布局,二级界面是单个功能模块,三级界面是单个控件。子控件包括饼图、圆环图、曲线图、柱状图、柱状分组图、横向柱状图、横向柱状分组图、合格率控件、百分比控件、进度控件、设备状态面板、表格数据、地图控件、视频控件等。二级界面可以自由拖动悬浮,支持最小化隐藏、最大化关闭、响应双击自定义标题栏。数据源支持模拟数据(默认)、数据库采集、串口通信(需定制)、网络通信(需定制)、网络请求等,可自由设定每个子界面的采集间隔即数据刷新频率。采用纯QWidg

    2022年8月10日
    18
  • Kullback–Leibler divergence(相对熵,KL距离,KL散度)

    Kullback–Leibler divergence(相对熵,KL距离,KL散度)KL 距离

    2026年3月17日
    2
  • mysql数据库读写分离实现_数据库读写分离的原理

    mysql数据库读写分离实现_数据库读写分离的原理读写分离是基于主从复制上面布置的,需要使用Atlas软件,代理服务器上只需要安装mariadb客服端三台服务器:一台做主,一台做从,一台安装Atlas软件主从复制部署在我的主页里面有,需要的可以去看下,链接:https://mp.csdn.net/mp_blog/creation/editor/1227122181)安装配置Atals软件,rz上传#rpm-ivhAtlas-2.2.1.el6.x86_64.rpm路径:cd/usr/local/mysql-proxy/bin..

    2025年6月27日
    2
  • arpspoof命令详解_什么的命令

    arpspoof命令详解_什么的命令ARPSpoofVer3.1bbyCoolDiyerUsage:ArpSpoof<IP1><IP2><PORT><AdpNum><Mode>/[r|s]<File>ArpSpoof/s<IP><Mask>ArpSpoof/lModeOptions:0IP1–>IP21IP1<->IP2Examples:>A

    2026年4月16日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号