问题描述
我有一个使用 Zappa 部署的 Flask 应用程序。我已成功将其部署到 www.my_domain.com 。但是很多人告诉我“您的网站已关闭”,当我跟进时,是因为他们访问了 https://my_domain.com(没有 www)。
我想从那个重定向到工作站点。我的证书是通过 AWS 获得的,技术上用于 www.my_domain.com、*.my_domain.com 和 my_domain.com(尽管当我进行基于电子邮件的批准时 *.my_domain.com 和 my_domain.com 都被解释为 my_domain.com ).
我尝试更改我的 zappa_settings.json 域,但没有更改。
解决方法
出于此答案的目的,我假设裸域是次要域,而 www
是主要域。如果您选择相反的选项,只需在阅读时颠倒术语即可。
将一个站点重定向到另一个站点
重定向意味着浏览器可以加载 my_domain.com
但接收到
301 moved permanently 的 HTTP 响应。
这意味着浏览器会重定向到 www.my_domain.com
并导航到该站点。
用户看到地址栏变成了www.my_domain.com
(虽然现在很多浏览器都隐藏了
地址的 www
部分),并加载新页面。
重定向需要在 my_domain.com
运行的某种类型的 HTTP 服务器。如果你已经有
一个 HTTP 服务器正在运行,那么配置 Web 服务器以发送重定向非常简单。
如果你没有服务器,那么你可以使用像 S3、Github、Netlify 这样的静态网站服务来 提供重定向。
必须设置整个网络服务器才能仅发送 301 代码,这有点烦人。但是这个方法 得到很好的理解和支持。
一个站点到另一个站点的别名
别名意味着 my_domain.com
和 www.my_domain.com
都可以工作并且只使用一个 Zappa 项目。
这就像进入同一个房间的两扇门。
浏览器地址栏没有变化,用户在网站上正常操作。一个警告 如果您是using cookies to make sure they are shared between the two domains,这种方法要更加小心。
别名需要对 AWS 服务进行一些高级配置。
API 网关配置
- 在 AWS 控制台中,转到 API Gateway service
- 在左侧菜单中,点击自定义域名
- 点击您的域 (
www.my_domain.com
) - 点击左侧的API 映射并记下 API 和 Stage 的设置
- 点击左侧的创建按钮
- 输入裸域名(例如
my_domain.com
) - 选择
Edge optimized
- 在 ACM 证书下,选择与您创建的域名称相同的证书
- 点击创建域名
- 输入裸域名(例如
- 点击新创建的裸域 (
my_domain.com
) - 选择API 映射
- 点击配置 API 映射
- 添加您之前记下的相同映射
- 点击保存
Route 53 配置
- 在 AWS 控制台中,转到 Route 53 service
- 在左侧菜单中,选择托管区域
- 选择您的域(例如 my_domain.com)
- 点击创建记录
- 在记录名称中,什么也不输入
- 在“记录类型”中,选择
A
记录(如果相反,则选择CNAME
) - 在值中,输入
www
域名 (www.my_domain.com
) - 在 TTL 中,您可以放置任何您想要的内容,但
172800
会将请求缓存两天,这还不错。 - 点击创建记录
ACM 配置
您必须确保证书涵盖 my_domain.com
和 www.my_domain.com
。
Zappa 配置
确保在 ALLOWED_HOSTS
中添加两个域名,否则 Django 将拒绝请求。
我关注了this thread。
以下是有效的步骤(虽然我不确定为什么):
- 转到 API 网关
- 创建一个新的自定义域:
my_domain.com
- 使用之前批准的
my_domain.com
记录 - 在新域中,在“API 映射”下复制
www.my_domain.com
中的设置 - 回到 53 号公路
- 创建A记录
- 将前缀留空
- 从新的 API 网关域复制“将流量路由到”中的 cloudfront 网址