You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 03:10:02