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 <
错误。我的网站网址来自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 添加一些标头,例如 Origin
或 Access-Control-
... 标头。
第 2 步)转到您的分发 > 更新 Origin 请求政策
步骤 3) 在/*
上踢一个新的失效
调试/测试的附加说明
-
我建议在终端而不是浏览器中使用
curl
进行测试,以避免缓存和查看详细信息。我做curl -v https://example.com/cb?foo=bar1
。
在每次测试时不断增加查询字符串的值(上例中为bar1
,为bar2
、bar3
),以使不再有缓存。
【讨论】:
以上是关于Amazon S3 重定向规则 - 保留查询参数的主要内容,如果未能解决你的问题,请参考以下文章