题目可能描述得不太清楚,目前业务逻辑是这样的,有一批比较重要的文件比如:www。abc。com/static/attach.zip,只有用户注册才能下载得到,非注册用户不能下载,在 php 前端可以通过权限检测用户是否登录然后返回一个真实的静态地址给浏览器供用户下载。但是,比较担心用户会抓包真实的静态文件地址:www。abc。com/static/attach.zip 然后散发出去,这样就得不偿失了。我也想过通过 php 的 readfile 来控制权限返回下载地址,但是文件较大,担心这个 readfile 会很耗资源,我就想给用户返回一个有 expire 期限的“假地址”,目前配置是 php+nginx,求好心 V2er 们给个好点的方法,谢谢
1
aru 2017-05-17 14:44:15 +08:00 1
|
2
kungfuchicken 2017-05-17 14:44:28 +08:00 1
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); |
3
Reign OP @kungfuchicken 这样的话,用户能抓取到 nginx 返回的地址么?
|
4
bigfei 2017-05-17 14:51:27 +08:00
|
5
thomaspaine 2017-05-17 15:27:33 +08:00
用七牛或者又拍云的服务,直接有你需要的功能
程序控制过期时间就行了 |
6
kungfuchicken 2017-05-17 15:43:35 +08:00
|
7
lsido 2017-05-17 21:37:09 +08:00
难道不是一个 session 就可以解决的问题吗..........
|
8
ryd994 2017-05-18 04:00:31 +08:00 via Android
做法有很多
auth_request X-Accel-Redirect secure_link |
9
rxzxf1993 2017-05-18 11:21:29 +08:00
@kungfuchicken +1
|
10
zqcolor 2017-05-18 11:23:38 +08:00
各种存储云都有 sdk 可以完成限定时间后过期的文件链接,用过阿里云的 oss sdk 和 aws sdk, 都很简单的
|
11
mingyun 2017-06-05 21:38:50 +08:00
@kungfuchicken jwt 使用方便,自带过期时间
|