S3网站重定向位置元似乎是浏览器的积极缓存。

问题描述 投票:0回答:1

我正在尝试用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
redirect amazon-s3 caching browser-cache
1个回答
2
投票

不幸的是,这就是现代浏览器的工作方式。他们自动缓存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控制台中的桶的静态网站托管部分添加这个。它不漂亮,但应该做的伎俩。

© www.soinside.com 2019 - 2024. All rights reserved.