- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个静态生成的网站,已上传到 S3 并通过 Cloudfront 发行版公开 - 它有一个根 index.html
文件和几个静态生成的子页面(例如 /donate/index.html
)。我已将存储桶配置为充当静态主机,并使用 index.html
作为索引文档。我可以通过直接访问 S3 前缀来访问这些页面,例如/donate/
正确显示 /donate/index.html
中的 html。
问题在于 - 当我链接到 /donate?some=query¶m=here
时,S3 自动 302 将这些没有尾部斜杠的页面重定向到带有尾部斜杠的页面,从而删除了所使用的查询参数通过我的客户端 JavaScript 来轻松跟踪状态。
例如 /donate?some=query¶m=here
302 到 /donate/
并丢失该上下文,这使得人们很难构建 URL,因为他们必须记住包含尾部斜杠(如果您希望网络爬虫记住新路由,则 HTTP 302 也是一个错误的 http 响应)。
以下是不起作用的内容:
最佳答案
这就是最终破解它的方法 - 创建一个查看器请求 Cloudfront 函数来手动检查路径是否既不包含文件扩展名也不包含尾部斜杠,并在这些情况下添加一个。
function handler (event) {
var request = event.request;
var uri = request.uri;
if( !uri.includes('.') && !uri.endsWith('/') ) {
request.uri = uri + '/'
}
return request;
};
在 Cloudfront 中创建此函数(Cloudfront > 函数 > 创建函数),然后将其附加到您的分配的行为(Cloudfront > 分配 > 行为 > 编辑 > 查看者请求 > Cloudfront 函数)。
确保在分发使用新设置完成初始化后使站点失效,并通过 CURL 测试新路由 - 您应该会看到以下行为更改:
# BEFORE:
curl -v --location http://example.com/donate?please=keep > /dev/null
> GET /donate?please=keep
> RESP 302
> GET /donate/
> RESP 200
# AFTER
curl -v --location http://example.com/donate?please=keep > /dev/null
> GET /donate?please=keep
> RESP 200
还有别的办法吗?我会后悔为每次 Cloudfront 函数调用付费吗?有没有办法通过纯粹的 Cloudfront 或 S3 策略更改来实现这一点?
关于javascript - 如何在 S3 和 Cloudfront 托管的静态站点上保留不带尾部斜杠的路由查询参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71180072/
我是一名优秀的程序员,十分优秀!