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

如何让Flask蓝图支持多域名?Apache+WSGI环境配置求助

解决Flask在Apache WSGI下多域名返回404的问题

看起来你已经走对了第一步——配置两个VirtualHost指向同一个WSGI应用,但第二个域名返回404通常是Flask的域名匹配逻辑或者Apache的请求传递设置出了问题。下面是几个最常见的修复方案,按优先级尝试:

1. 移除Flask的SERVER_NAME配置

这是导致多域名404最常见的原因。如果你在Flask应用里设置了app.config['SERVER_NAME'] = 'www.domain-a.net',Flask会严格校验请求的Host头,只有完全匹配这个值的请求才会被正常路由,其他域名的请求直接返回404。

修复方法:
删掉配置里的SERVER_NAME,或者显式设置为None:

app.config['SERVER_NAME'] = None

这样Flask会根据请求的实际Host头动态处理路由,不再限制单一域名。

2. 确保Apache VirtualHost正确传递Host头

虽然你已经配置了两个VirtualHost,但可能有些细节没到位,导致第二个域名的Host头没有正确传递给Flask。

每个VirtualHost的配置应该类似这样:

<VirtualHost *:80>
    ServerName www.domain-a.net
    ServerAlias domain-a.net  # 可选,处理不带www的主域名

    WSGIScriptAlias / /path/to/your/flask_app.wsgi

    <Directory /path/to/your/flask_app>
        Require all granted
    </Directory>

    # 确保Host头按请求原样传递(默认开启,但显式设置更保险)
    UseCanonicalName Off
</VirtualHost>

<VirtualHost *:80>
    ServerName www.domain-b.net
    ServerAlias domain-b.net

    WSGIScriptAlias / /path/to/your/flask_app.wsgi

    <Directory /path/to/your/flask_app>
        Require all granted
    </Directory>

    UseCanonicalName Off
</VirtualHost>

重点:两个VirtualHost必须指向同一个flask_app.wsgi文件,且设置UseCanonicalName Off,避免Apache强制替换Host头为当前VirtualHost的ServerName值。

3. 检查Flask路由是否绑定了特定域名

如果你的路由代码里写了针对特定域名的限制(比如@app.route('/', host='www.domain-a.net')),那其他域名的请求自然会返回404。

修复方法:

  • 如果不需要区分域名逻辑,直接去掉路由里的host参数,让路由对所有域名生效;
  • 如果需要针对不同域名做差异化处理,可以用before_request钩子根据request.host分支逻辑,或者用蓝图绑定不同域名:
from flask import Flask, request, Blueprint

app = Flask(__name__)

# 绑定domain-a的蓝图
domain_a_bp = Blueprint('domain_a', __name__, host='www.domain-a.net')
@domain_a_bp.route('/')
def index_a():
    return "欢迎访问Domain A!"

# 绑定domain-b的蓝图
domain_b_bp = Blueprint('domain_b', __name__, host='www.domain-b.net')
@domain_b_bp.route('/')
def index_b():
    return "欢迎访问Domain B!"

app.register_blueprint(domain_a_bp)
app.register_blueprint(domain_b_bp)

这种方式既能实现域名差异化逻辑,又能避免404问题。

4. 重启Apache并刷新WSGI进程

做完上述修改后,一定要重启Apache服务,确保配置和代码更改生效:

sudo systemctl restart apache2  # 适用于systemd系统
# 或者
sudo service apache2 restart

如果WSGI进程没有被重新加载,旧的配置可能还在运行,导致问题持续。

内容的提问来源于stack exchange,提问作者robbie.huffman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:27:43