Amazon S3 重定向规则 - 保留查询参数

Posted

技术标签:

【中文标题】Amazon S3 重定向规则 - 保留查询参数【英文标题】:Amazon S3 Redirect Rule - Preserve Query Params 【发布时间】: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 中进行更改?

【问题讨论】:

出于好奇,/foo/?ping=pong 是否按预期工作? (在? 之前添加一个斜杠) 跨帖...***.com/questions/20751301/… 【参考方案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) 在/* 上踢一个新的失效


调试/测试的附加说明

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

【讨论】:

以上是关于Amazon S3 重定向规则 - 保留查询参数的主要内容,如果未能解决你的问题,请参考以下文章

Amazon S3 重定向和 Cloudfront

为 301 重定向配置 Amazon 重定向规则

如何进行重定向并保留查询字符串?

AWS CloudFront 如何遵循 S3 存储桶重定向规则?

使用查询参数和 URL 中的 ~ 进行 301 重定向

SAML HTTP 重定向绑定中未保留查询字符串