V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Reign
V2EX  ›  程序员

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

  •  
  •   Reign · 2017-05-17 14:33:27 +08:00 · 3060 次点击
    这是一个创建于 2746 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    11 条回复    2017-06-05 21:38:50 +08:00
    aru
        1
    aru  
       2017-05-17 14:44:15 +08:00   ❤️ 1
    kungfuchicken
        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);
    Reign
        3
    Reign  
    OP
       2017-05-17 14:48:44 +08:00
    @kungfuchicken 这样的话,用户能抓取到 nginx 返回的地址么?
    bigfei
        4
    bigfei  
       2017-05-17 14:51:27 +08:00
    thomaspaine
        5
    thomaspaine  
       2017-05-17 15:27:33 +08:00
    用七牛或者又拍云的服务,直接有你需要的功能
    程序控制过期时间就行了
    kungfuchicken
        6
    kungfuchicken  
       2017-05-17 15:43:35 +08:00
    @Reign
    比如说用户访问的 get_file.php?token=xxxxxx
    鉴权,过期都可以存 token 里面,算法你自己定
    返回的内容是实际的文件
    lsido
        7
    lsido  
       2017-05-17 21:37:09 +08:00
    难道不是一个 session 就可以解决的问题吗..........
    ryd994
        8
    ryd994  
       2017-05-18 04:00:31 +08:00 via Android
    做法有很多
    auth_request
    X-Accel-Redirect
    secure_link
    rxzxf1993
        9
    rxzxf1993  
       2017-05-18 11:21:29 +08:00
    zqcolor
        10
    zqcolor  
       2017-05-18 11:23:38 +08:00
    各种存储云都有 sdk 可以完成限定时间后过期的文件链接,用过阿里云的 oss sdk 和 aws sdk, 都很简单的
    mingyun
        11
    mingyun  
       2017-06-05 21:38:50 +08:00
    @kungfuchicken jwt 使用方便,自带过期时间
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1157 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 23:49 · PVG 07:49 · LAX 15:49 · JFK 18:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.