CSS中的相对字体URL导致S3上出现403

时间:2018-09-24 15:30:59

标签: css django amazon-s3 django-storage

我将带有boto3的预签名URL用于“保护”(或至少限制对S3中存储的内容的访问)(我将相对路径传递给Django视图,然后生成一个绝对的预签名URL到存储位置在S3上,然后将其作为重定向传递给客户端,客户端随后将检索所需的文件):

import boto3    

class ContentStreamView(LoginRequiredMixin, RedirectView):


    def get_redirect_url(self, **kwargs):
         ... relevant code below
        s3_client = boto3.client('s3',
                      aws_access_key_id=self.storage_details.access_key,
                      aws_secret_access_key=self.storage_details.secret_key,
                      config=Config(signature_version=self.storage_details.signature_version))

        # Key will equal the filepath to the content required.
        return s3_client.generate_presigned_url(
            ClientMethod='get_object',
            ExpiresIn=60,
            Params={
                'Bucket': self.storage_details.bucket_name,
                'Key': kwargs['filepath']
            }
        )

    ... passes the URL back to the client in the get method of the CBV

    def get(self, request, *args, **kwargs): 
        ...
        url = self.get_redirect_url(filepath=path)
        return HttpResponsePermanentRedirect(url)

我现在在S3存储桶上设置了我的CORS,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

我在Django上设置了CORS,以允许所有操作:

CORS_ORIGIN_ALLOW_ALL = True

作为示例,当浏览器尝试访问https://myapp.com/streamer/some_folder/css/some_css_file.css时,浏览器将重定向到(并按预期获取文件)预先签名的S3网址:https://examplebucket.s3.amazonaws.com/some_folder/css/some_css_file.css?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=credentials%2Faws4_request&X-Amz-Date=20180924T145056Z&X-Amz-Expires=60&X-Amz-SignedHeaders=host&X-Amz-Signature=signature

这很好,但是,css文件中的相对URL(用于字体和图像)返回403s。

相对URL的定义(例如):

some_css_file.css

...
 @font-face {
  font-family: 'Avenir LT';
  font-weight: normal;
  font-style: normal;
  src: url('../Fonts/AvenirLTStd-Book.otf');
} 
....

当客户端尝试访问src: url('../Fonts/AvenirLTStd-Book.otf');时,文件中的相对URL可能返回403s,这可能是因为存储桶已锁定,并且需要对URL进行签名才能访问这些路径。

我该如何解决?

1 个答案:

答案 0 :(得分:0)

我在使用Google云存储时遇到了类似的问题。我的解决方案是将这些特定文件设置为公共。 Google云存储使人们可以选择性地(即按对象级别)在存储桶中公开数据

对于Google云存储,我遵循了https://cloud.google.com/storage/docs/access-control/making-data-public

可悲的是,我必须对css文件中由相对URL链接到的每个文件进行迭代处理。这很烦人,但可以完成工作并维护所需的隐私

这是指向Google云存储https://cloudworks.dukamneti.co.ke/fonts-failed-load-resource-google-cloud-storage/#contact

中的解决方案的链接