我正在尝试用S3创建一个URL重定向服务,虽然工作的肉体已经完成,但我遇到了一些边缘情况,例如在创建重定向后编辑重定向。 我是AWS的Javascript SDK和putObject()方法来创建这些键,我有一个域名映射到桶--mybucket.com,并没有坐在Cloudfront后面。
如果我创建key,foo,并将 WebsiteRedirectionLocation 设置为类似于 https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property
一切都很正常。访问 https://mybucket.com/foo
重定向到 https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property
.
然而,我犯了一个错误,需要更改URL,所以我登录AWS控制台,编辑该键的元数据,将网站重定向改为 https://google.com
再访 https://mybucket.com/foo
,但它 还 重定向到 https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property
. 然而,如果我在私人浏览器中访问的URL,它正确地重定向到谷歌,告诉我重定向是浏览器缓存。
因此,看来我的浏览器正在缓存重定向。 现在,当我用putObject方法创建key时,我已经设置了以下属性。
CacheControl: 'no-store',
Expires: 123456789,
这可能是多余的,因为 CacheControl: no-store
应该告诉浏览器永远不要缓存这个吧? 我在浏览器中设置了 Expires
到123456789,而123456789在1973年就过期了,所以我以为浏览器会说,好吧,它比1973年晚得多,所以取新版本。 我还应该指出,我只是在浏览器中添加了 Expires
后的属性。CacheControl
设置没有效果。
我所做的整个putObject调用看起来是这样的。
S3.putObject(
{
Bucket: BUCKET_NAME,
Key: 'foo',
CacheControl: 'no-store',
Expires: 123456789,
WebsiteRedirectLocation: 'https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property',
Metadata: {
someOtherThing: 'whatever',
},
}
);
我看到的一个问题是S3对象的响应头似乎缺少缓存控制和过期属性。
Content-Length: 0
Date: Tue, 14 Apr 2020 14:29:34 GMT
Location: https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property
Server: AmazonS3
x-amz-id-2: ldfskg;lksdjfgl;kdfjslgk;jdsflk;gjfsd
x-amz-request-id: ;fdjsglsfdkglfldsjglksf
不幸的是,这就是现代浏览器的工作方式。他们自动缓存HTTP 301响应。这有一定的意义,因为响应被称为 Moved Permanently
. 你需要做的是返回HTTP 302,也就是 Moved Temporarily
这让我们想到了你的另一个问题:你想用S3 Website-Redirect-Location
元标签 302
响应。不幸的是,没有办法做到这一点。
我确实找到了一个用S3来实现的变通方法:你可以创建一个重定向规则。
<RoutingRules>
<RoutingRule>
<Condition>
<KeyPrefixEquals>foo</KeyPrefixEquals>
</Condition>
<Redirect>
<HttpRedirectCode>302</HttpRedirectCode>
<HostName>example.com</HostName>
<Protocol>https</Protocol>
</Redirect>
</RoutingRule>
</RoutingRules>
上面的路由规则基本上是这样的 mybucket.com/foo
将重定向到 https://example.com
与302响应代码。
路由规则是S3静态网站托管的一个功能,所以你可以在AWS控制台中的桶的静态网站托管部分添加这个。它不漂亮,但应该做的伎俩。