【问题标题】:make url link to other url使 url 链接到其他 url
【发布时间】:2015-02-21 03:04:31
【问题描述】:

我有一个应用程序,用户可以在其中上传某些数字商品。其他用户可以购买这些,在这种情况下,会立即显示下载链接,并发送包含相同链接的电子邮件。此链接应在 7 天后过期

现在,当用户上传他们的项目时,它会被上传到 S3,并且 URL 存储在 Items 集合中。

问题是,我不想给客户这个直接链接,因为那样我就没有办法让它过期了。相反,我想在购买时创建一个引用原始 S3 url 的新 url,然后向客户发送此链接

我想我可以做一些网址缩短功能来做到这一点,但不确定这是否最有效

知道如何在不泄露原件的情况下做到这一点吗?

【问题讨论】:

    标签: javascript meteor


    【解决方案1】:

    一种选择是让您的应用程序管理 s3 对象的“读取策略”=人们可以下载的文件。您可以设置策略的过期时间。

    在我的流星应用程序中,我正在使用这个库: https://github.com/arbitrarytech/s3policy

    在服务器上:

    Meteor.methods({
    
      get_s3_read_policy: function(_key,_filename) {
    
        var SECONDS_BEFORE_TIMEOUT = 1000;
        var s3 = new s3Policies( CONFIG.aws_access_key , CONFIG.aws_secret_access_key );
        var signedURL = s3.readPolicy( _key, 'your_bucket_name' , SECONDS_BEFORE_TIMEOUT , _filename); 
        return signedURL;
      }
    
    });
    

    在您的情况下,您可能只需要签名的 URL。在我客户端上的应用程序中,这就是我开始下载的方式。

      Meteor.call('get_s3_read_policy', key, filename , function(err,_signedURL) {
    
        if (err){
            console.log("Error retrieving the signed url for download ", err);
        }else{
          window.open(_signedURL,"_self"); 
        }
      });
    

    所以,我认为可以直接通过电子邮件将此签名 URL 发送给用户,然后如果它过期,用户将看到错误并且无法访问该资源。我读到在 s3 中甚至有一种方法可以向用户展示一个不错的错误页面custom 404 page for missing object in s3 temporary signed URL,但我还没有尝试过。

    【讨论】:

      【解决方案2】:

      客户端可以发现引用另一个 URL 的任何 URL,这就是 HTTP 的要点:允许客户端导航资源并了解它们的当前位置或状态。如果您提供中介,它可以将真实的 URL 内容通过管道传输到客户端,并且您可以控制可见性和生命周期,因为客户端永远不会直接与资源直接对话。您可以通过编写对真实 URL 进行哈希处理的中间件轻松完成此操作,或者只是为其提供一个密钥,然后向引用该中介的客户端提供一个新 URL。

      【讨论】:

        【解决方案3】:

        不确定我是否正确解释了这个问题,但也许您可以使用 TinyURL API 之类的东西?

        http://www.tiny-url.info/open_api.html

        (来自网站的示例)

        $lurl = $_POST['long_url'];
        
        $curl = curl_init(); 
        $post_data = array('format' => 'json',
                           'apikey' => 'YOUR_API_KEY',
                           'provider' => 'PROVIDER_STRING',
                           'url' => $lurl );
        $api_url = 'http://tiny-url.info/api/v1/create';
        curl_setopt($curl, CURLOPT_URL, $api_url);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
        $result = curl_exec($curl);
        curl_close($curl);
        
        echo $result;
        

        另一种方法是以编程方式获得重定向链接?这会根据您使用的后端而有所不同,但可能类似于以下内容:

        For the route xxxx/<account/digitalgood_id>/<date>: 
          if date is older than a week: 
             say it is expired
          otherwise: 
             redirect to page/<account/digitalgood_id> which accesses to the S3 info
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-08-21
          • 2018-12-09
          • 1970-01-01
          • 2019-07-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多