【问题标题】:Amazon S3 Redirect Rule - Preserve Query ParamsAmazon S3 重定向规则 - 保留查询参数
【发布时间】:2015-08-26 19:27:35
【问题描述】:

我注意到 Amazon S3 Redirect rule - GET data is missing 但在遵循接受的答案后,我的查询参数仍然没有被保留。

我有一个使用 React 和 React Router 的网站,这意味着我有几个 URL 可以加载相同的 HTML 和 JS,然后 JS 会根据 URL 确定要加载应用程序的哪个部分。

例如:

/foo、/bar、/baz 都应该加载 index.html,它加载 bundle.js。然后 bundle.js 观察到一些 React 组件(也在 bundle.js 中)的 URL 和路由。

但是 S3 中不存在 foo、bar 或 baz 文件,只有 index.html。我想要做的是当我收到 404 时,重定向到 /#!/{URL}(例如 /foo 重定向到 /#!/foo)。这适用于我的重定向规则(如下)。但是,我也想带上查询参数(例如 /foo?ping=pong 重定向到 /#!/foo?ping=pong),但 /foo?ping=pong 只是重定向到 /#!/foo。

这是我的重定向规则:

<RoutingRules>
    <RoutingRule>
        <Condition>
            <HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals>
        </Condition>
        <Redirect>
            <Protocol>http</Protocol>
            <HostName>www.mydomain.com</HostName>
            <ReplaceKeyPrefixWith>#!/</ReplaceKeyPrefixWith>
        </Redirect>
    </RoutingRule>
</RoutingRules>

有什么想法可以通过某种方式实现吗?理想情况下,每次添加新页面时都不必在 S3/CloudFront 中进行更改?

【问题讨论】:

标签: redirect amazon-web-services amazon-s3 amazon-cloudfront react-router


【解决方案1】:

问题是我在 CloudFront 中设置了不转发查询字符串的源,因此当 S3 收到请求时,它会在没有查询参数的情况下正确重定向。您可以在 CloudFront > 行为 > 转发查询字符串中找到此设置。

【讨论】:

  • 是的!救命稻草!
  • @doublejosh:你的意思是直接上S3?查询参数不应该被忽略。就我而言,CloudFront 正在删除查询参数,这是我的问题。如果您没有使用 CloudFront,则应该不会遇到同样的问题。
  • 查询参数似乎只被 S3 文件夹重定向剥离,例如:/my-page?this=that >>> /my-page/
  • 运气好@doublejosh?有同样的问题。
  • 对于任何寻找这方面详细信息的人,目前是 CloudFront Distributions > [click distribution] > Behaviors > [check behavior] > Edit > Cache Policy -> Create New Policy > Query strings > [select All] .保存。保存。保存。
【解决方案2】:

如果您想获得清晰的网址,您也可以查看this trick。您需要设置云端分发,然后在分发的“错误页面”部分更改 404 行为。这样你就可以再次domain.com/foo/bar 链接:)

【讨论】:

  • 感谢您的提示 - 我尝试在云端进行设置,但是当我查看 Chrome 检查器中的源选项卡时,正在将 index.html 页面作为我的 bundle.js 文件加载,所以我我收到unexpected token &lt; 错误。我的网站网址来自https://mydomain.io/search/0.1/index.html/article/uuid. And in react router I have a basename of search/0.1/index.html',因此其中一个路由定义是article/:id。 S3 似乎仍在寻找文件夹/search/0.1/index.html/article。有什么想法可以解决这个问题吗?
【解决方案3】:

CloudFront/S3 中的菜单和选项会随着时间发生很大变化。

这是 2021 年 12 月的解决方案。

步骤 1) 在 CloudFront 中创建允许 QueryStrings 的“请求”策略

注意:您可能还想为 CORS 添加一些标头,例如 OriginAccess-Control-... 标头。

第 2 步)转到您的分发 > 更新 Origin 请求政策

步骤 3) 在/* 上踢一个新的失效


调试/测试的附加说明

  1. 我建议在终端而不是浏览器中使用curl 进行测试,以避免缓存和查看详细信息。我做curl -v https://example.com/cb?foo=bar1
  2. 在每次测试时不断增加查询字符串的值(上例中为bar1,为bar2bar3),以使不再有缓存。

【讨论】:

    猜你喜欢
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    相关资源
    最近更新 更多