12

我最近开始使用 Amazon S3 为我的访问者提供图像,因为这将减少服务器负载。现在,有一个新问题:今天我查看了我的 AWS 账单。我注意到我有一笔巨额账单在等着我 - 20 天内总共有 4TB 的 AWS 数据传输。

显然,这是因为大量的传出 Amazon S3 流量(到 Cloudflare,然后将其提供给访问者)。现在我应该通过设置缓存标头来减少请求文件的数量(因为 Cloudflare 的 Crawler 会尊重这一点)。我已经像这样修改了我的代码:

$s3->putObjectFile($path, $bucket , 'images/'.$id.'.jpg', S3::ACL_PUBLIC_READ);

$s3->putObjectFile($path, $bucket , 'images/'.$id.'.jpg', S3::ACL_PUBLIC_READ, array('Cache-Control' => 'public,max-age=31536000'));

尽管如此,它还是行不通。Cloudflare 不尊重缓存,因为 Cache-Control 不会在标头中显示为“Cache-Control”,而是显示为“x-amz-meta-cachecontrol”。Cloudflare 忽略了这一点。

有没有人有一个简单的解决方案?

TL;DR:我和这个人有或多或少相同的问题:http: //support.bucketexplorer.com/topic734.html(那是在 2008 年)

编辑:我偶然发现了这一点:Amazon S3 不缓存图像,但不幸的是,该解决方案对我不起作用。

编辑 2:结果它不起作用,因为我使用的是旧版本的“Amazon S3 类”。我更新了,代码现在可以工作了。

感谢您的时间。

4

2 回答 2

5

如果您收到“x-amz-meta-cachecontrol”,则很可能您没有正确设置标头。这可能只是您在代码中执行此操作的确切方式。这应该有效。我推断这是使用 Amazon S3 PHP 类的 php?

试试这个:

$s3->putObject(file_get_contents($path), $bucket, $url, S3::ACL_PUBLIC_READ, array(), array('Cache-Control' => 'max-age=31536000, public'));

S3 PHP 文档 putObjectFile中列在 Legacy Methods 下:

putObjectFile (string $file, 
               string $bucket, 
               string $uri, 
               [constant $acl = S3::ACL_PRIVATE], 
               [array $metaHeaders = array()], 
               [string $contentType = null])

与此相比:

putObject (mixed $input, 
           string $bucket, 
           string $uri, 
           [constant $acl = S3::ACL_PRIVATE], 
           [array $metaHeaders = array()], 
           [array $requestHeaders = array()])

您需要将缓存控制设置为请求标头,但似乎无法使用 设置请求标头putObjectFile,只有元标头。您必须使用putObject并为元标头提供一个空数组,然后为它提供另一个带有请求标头的数组(包括缓存控制)。

您还可以尝试我在下面列出的其他一些工作示例。

也可以看看:

如何使用 PHP 脚本(php)为 AWS S3 存储桶中的所有对象设置 Expires 和 Cache-Control 标头

更新 Amazon S3 和 CloudFront (python)的缓存标头

自动为整个 S3 存储桶设置缓存控制(使用存储桶策略?)

http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGET.html?r=5225

于 2013-01-20T12:05:12.413 回答
1

你现在可以。转到 s3 存储桶。打开文件并设置属性

AWS 控制台

于 2017-04-07T17:51:59.110 回答