在Heroku托管的自定义域名下,Flask捕获子域名失败求助
解决Heroku上Flask子域名访问失败的问题
核心问题排查与修复步骤
1. 修正SERVER_NAME配置
你当前硬写端口33507是错误的:
- Heroku的端口是动态分配的,会通过
PORT环境变量传递,不能在SERVER_NAME里固定写死。 - 生产环境使用自定义域名时,
SERVER_NAME只需要设置为主域名(不带端口),因为Heroku的路由层会自动处理端口转发(默认80/443端口)。
正确配置示例:
import os from flask import Flask app = Flask(__name__) # 仅设置主域名,无需添加端口 app.config['SERVER_NAME'] = "example.com" @app.route('/', subdomain='<subdomain>') def handle_subdomain(subdomain): return f"当前子域名:{subdomain}" if __name__ == '__main__': # 从环境变量获取端口,本地默认用5000 port = int(os.getenv('PORT', 5000)) app.run(host='0.0.0.0', port=port)
2. 确认子域名DNS配置
这是最容易遗漏的关键环节:
- 给所有需要捕获的子域名(
www、help等)添加CNAME记录,指向你的Heroku应用域名(格式:yourappname.herokuapp.com)。 - 等待DNS生效(通常10分钟到几小时),可以用
nslookup www.example.com命令验证是否解析到Heroku的IP地址。
3. 检查Heroku域名绑定状态
登录Heroku控制面板进入你的应用:
- 找到「Settings」→「Domains and certificates」,确认已添加所有需要的子域名(如
www.example.com、help.example.com),且域名状态显示「Verified」。
4. 确保生产服务器转发正确Host头
如果使用Gunicorn作为生产服务器(Heroku推荐),在Procfile中配置正确的启动命令,保证传递真实请求Host:
web: gunicorn --bind 0.0.0.0:$PORT app:app
Heroku的反向代理会自动将真实请求的Host传递给应用,Flask依赖这个信息解析子域名。
5. 测试注意事项
- 不要在本地直接测试子域名(除非修改本地
hosts文件做映射),必须等DNS生效后直接访问线上地址。 - 如果出现HTTPS相关错误,确认Heroku已为你的域名配置SSL证书(Heroku免费提供Let's Encrypt证书,可在域名设置中开启)。
内容的提问来源于stack exchange,提问作者didlidoo
相关产品推荐
相关产品推荐

