怎样隐藏服务器上文件的真实地址并返回一个有失效期限的下载地址?

2017-05-17 14:33:27 +08:00
 Reign

题目可能描述得不太清楚,目前业务逻辑是这样的,有一批比较重要的文件比如:www。abc。com/static/attach.zip,只有用户注册才能下载得到,非注册用户不能下载,在 php 前端可以通过权限检测用户是否登录然后返回一个真实的静态地址给浏览器供用户下载。但是,比较担心用户会抓包真实的静态文件地址:www。abc。com/static/attach.zip 然后散发出去,这样就得不偿失了。我也想过通过 php 的 readfile 来控制权限返回下载地址,但是文件较大,担心这个 readfile 会很耗资源,我就想给用户返回一个有 expire 期限的“假地址”,目前配置是 php+nginx,求好心 V2er 们给个好点的方法,谢谢

2990 次点击
所在节点    程序员
11 条回复
aru
2017-05-17 14:44:15 +08:00
kungfuchicken
2017-05-17 14:44:28 +08:00
PHP 增加一个响应头:X-Accel-Redirect , 告知 Nginx 要下载的文件路径,Nginx 会去读取并吐给客户端,PHP 代码只需要做鉴权就行了

代码示例

$file = '/some/full/path/the_file.pdf';
$filename = 'the_file.pdf';
header('Cache-Control: public, must-revalidate');
header('Pragma: no-cache');
header('Content-Type: application\pdf');
header('Content-Length: ' .(string)(filesize($file)) );
header('Content-Disposition: attachment; filename='.$filename.'');
header('Content-Transfer-Encoding: binary');
header('X-Accel-Redirect: '. $file);
Reign
2017-05-17 14:48:44 +08:00
@kungfuchicken 这样的话,用户能抓取到 nginx 返回的地址么?
bigfei
2017-05-17 14:51:27 +08:00
thomaspaine
2017-05-17 15:27:33 +08:00
用七牛或者又拍云的服务,直接有你需要的功能
程序控制过期时间就行了
kungfuchicken
2017-05-17 15:43:35 +08:00
@Reign
比如说用户访问的 get_file.php?token=xxxxxx
鉴权,过期都可以存 token 里面,算法你自己定
返回的内容是实际的文件
lsido
2017-05-17 21:37:09 +08:00
难道不是一个 session 就可以解决的问题吗..........
ryd994
2017-05-18 04:00:31 +08:00
做法有很多
auth_request
X-Accel-Redirect
secure_link
rxzxf1993
2017-05-18 11:21:29 +08:00
zqcolor
2017-05-18 11:23:38 +08:00
各种存储云都有 sdk 可以完成限定时间后过期的文件链接,用过阿里云的 oss sdk 和 aws sdk, 都很简单的
mingyun
2017-06-05 21:38:50 +08:00
@kungfuchicken jwt 使用方便,自带过期时间

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/361952

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX