我正在开发使用 lambda 函数的小服务,它使用 curl
在您的 CLI 中返回“今日事实”。
首先,我开发了业务逻辑,使用 Serverless 部署和创建了 lambda。
其次,我使用 aws route 53 购买域,使用“API 网关上的自定义域名”预配证书和路由域。
此刻如果您要访问https://domain.io服务按预期工作,但如果您尝试调用 curl domain.io
,它会输出:
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>CloudFront</center>
</body>
</html>
我的目标是通过调用 curl domain.io
让服务在没有 SSL(或重定向)的情况下运行。
是否可以避免重定向?或者您可以创建没有证书的 API 自定义域名
吗?
目前我调用 curl -F domain.io
它将遵循重定向,但这不是我正在寻找的解决方案。
谢谢!
最佳答案
从 API 网关中删除自定义域配置。
等待几分钟,让 API 网关在 AWS 边缘网络中释放自定义域(无法确定何时完成,但您会在后续步骤之一中遇到错误,直到完成. 20 分钟应该足够了)。
使用分配给您的 API 阶段的通用 ...execute-api...amazonaws.com
域名创建 CloudFront 分配。
对于 Origin Protocol Policy,选择 HTTPS Only。
将 Origin Path 设置为您的阶段前缀(例如 /prod
或 /v1
)——无论您设置什么作为阶段前缀。
将查看器协议(protocol)策略设置为 HTTP 和 HTTPS。
将最小 TTL 和默认 TTL 设置为 0。
将分发的备用域名设置为您的自定义域。
如果您希望 SSL 有选择地在您的自定义域上工作,请将 ACM 证书与 CloudFront 分配相关联。
更改您的 DNS 条目以指向分配给您的分配的 *.cloudfront.net
主机名。
等待 CloudFront 分配状态从 In Progress 更改为 Deployed。
测试。
为了针对 API Gateway 启用 HTTP,这似乎需要付出很多努力,但这是必要的,因为 API Gateway 专门设计为不支持 HTTP——它仅适用于 HTTPS,因为通常来说,这是 API 的最佳实践.
Q: Can I create HTTPS endpoints?
Yes, all of the APIs created with Amazon API Gateway expose HTTPS endpoints only. Amazon API Gateway does not support unencrypted (HTTP) endpoints.
CloudFront 通常称为 CDN,但实际上它是自定义 HTTP 请求操作的瑞士军刀,这就是一个例子。
验证您的行为后,您可以选择增加 CloudFront 中的默认 TTL,这将导致它在几秒钟内缓存达到该值的响应,通过向 API 网关发送更少的实际请求并重播缓存的响应来降低成本来电者。
此设置与您现在拥有的设置不同,因为您控制的是 CloudFront 分配,而不是 API 网关...因此您可以按照 API 网关在控制时不允许的方式对其进行自定义。
关于amazon-web-services - 禁用 http 重定向到 https,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51526462/