Google App Engine Flex自定义域名访问出现404错误求助
我之前帮不少开发者处理过一模一样的问题,结合你的配置和症状,大概率是这几个环节出了问题,咱们一步步来排查:
1. 检查Flask应用的路由是否限制了域名
不少开发者会在Flask路由里加host参数绑定特定域名,比如只允许appspot域名访问,这就会导致自定义域名的请求直接匹配不到路由,返回404。
比如如果你的代码里写了这种:
@app.route('/', host='<你的项目ID>.appspot.com') def home(): return "正常返回内容"
那自定义域名的请求肯定会404。你先检查所有路由有没有加host限制,或者有没有中间件在过滤请求的Host头。
另外,你可以给Flask加个全局日志,看看请求到底有没有到达应用,以及请求的Host和路径是什么:
from flask import request import logging @app.before_request def log_request_info(): logging.info(f"收到请求 - Host: {request.host}, Path: {request.path}")
部署后去GAE日志里看自定义域名的请求日志,确认Host是不是host.mydomain.io,路径是不是正确的(比如根路径/)。
2. 确认域名映射的状态和SSL证书
虽然你用了AUTOMATIC SSL管理,但有时候证书颁发会有延迟,或者域名映射的状态不是ACTIVE。你可以用这个命令查一下:
gcloud app domain-mappings list
如果状态是CREATING或者其他非ACTIVE的状态,那就等一会儿,或者删除重新创建映射。另外,访问自定义域名时,看看浏览器的证书信息,确认是Google颁发的有效证书——虽然证书问题通常是证书错误,但偶尔也会间接导致请求异常。
3. 检查dispatch.yaml配置(如果存在的话)
如果你的项目里有dispatch.yaml,这个文件会控制请求的分发规则。如果自定义域名没被正确配置在里面,请求就找不到对应的服务,返回404。
正确的配置应该像这样:
dispatch: - url: "host.mydomain.io/*" service: default # 这里要和你的服务名称对应,默认是default
如果没有这个文件,GAE默认会把所有域名请求转发到默认服务,但如果之前有过配置又删除了,可能有缓存问题。你可以创建一个正确的dispatch.yaml,然后部署:
gcloud app deploy dispatch.yaml
4. 确认DNS解析的完整性
你用nslookup验证了解析到ghs.googlehosted.com,但还要确认A记录和AAAA记录(IPv6)都配置正确。如果是子域名,CNAME指向ghs.googlehosted.com是对的;如果是顶级域名,必须用A/AAAA记录(Google会提供对应的IP列表)。
另外,DNS有缓存,你可以用dig host.mydomain.io +trace看看全球解析是否生效,或者换个网络(比如手机热点)测试,排除本地DNS缓存的问题。
5. 检查服务版本的流量分配
如果你的服务有多个版本,而自定义域名的请求被分配到了一个没部署正确应用的版本,也会404。你可以用这个命令查看流量分配:
gcloud app versions list
确保默认服务的100%流量都分配到了你正在使用的版本,或者在域名映射里指定了正确的版本(默认是跟着流量分配走的)。
按照上面的步骤逐一排查,应该能快速定位问题。我遇到最多的情况是Flask路由加了host限制,或者dispatch.yaml配置错误,你可以先从这两个方向入手。
内容的提问来源于stack exchange,提问作者CraigH

