大家好,又见面了,我是你们的朋友全栈君。
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
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/135081.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...