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

Apache下WSGI路由失效求助:Flask接口无法响应请求

问题:Apache部署Flask WSGI接口出现404错误

在Raspbian Linux系统的Apache 2环境中,使用Flask结合WSGI部署可接收POST请求的接口。独立运行cfg.wsgi(执行python cfg.wsgi)时,curl能正常处理GET和POST请求,但部署到Apache后,访问/watchdog.cfg返回“404 Not Found”。已确认Apache已加载该.wsgi文件(错误日志及调试输出可证),但路由函数未被调用。

Apache配置

<VirtualHost *:80>
    DocumentRoot /home/http/
    WSGIScriptAlias /watchdog.cfg /home/http/cfg.wsgi
    <Directory /home/http>
        AllowOverride none
        Require all granted
    </Directory>
</VirtualHost>

cfg.wsgi代码

from flask import Flask, request, send_file
from os import path

FILE_NAME = 'watchdog.cfg'

application = Flask(__name__)

@application.route('/' + FILE_NAME, methods=['GET', 'POST'])
def cfg():
    file_path = '/home/http/' + FILE_NAME;
    if request.method == 'POST':
        jsonString = request.json
        with open(file_path, 'w') as f:
            f.write(jsonString)
        return "File updated successfully.", 200
    elif request.method == 'GET':
        if path.exists(file_path):
            return send_file(file_path, mimetype='application/json')
        else:
            return "File not found.", 404

if __name__ == '__main__':
    application.run(host='0.0.0.0', port=80)

问题原因及修复方法

核心原因

WSGIScriptAlias已经将/watchdog.cfg路径映射到cfg.wsgi应用,但Flask路由里又定义了/' + FILE_NAME(即/watchdog.cfg),导致实际传递给Flask的请求路径为空(Apache已经截取了/watchdog.cfg部分),而Flask中没有匹配空路径的路由,因此返回404。本质是路由层级重复。

修复方案(二选一)

  1. 修改Flask路由为根路径(推荐)
    将Flask的路由改为/,因为WSGI已经完成了/watchdog.cfg到应用的映射,此时Flask的根路径就对应外部访问的/watchdog.cfg:

    @application.route('/', methods=['GET', 'POST'])
    def cfg():
        # 原函数逻辑保持不变
    

    修改后重启Apache,访问/watchdog.cfg即可正常触发路由函数。

  2. 调整Apache的WSGIScriptAlias映射
    若想保留Flask原路由,可将WSGIScriptAlias的映射路径改为根目录,让所有根路径下的请求转发给cfg.wsgi:

    WSGIScriptAlias / /home/http/cfg.wsgi
    

    此时访问/watchdog.cfg会匹配Flask中的路由,但该虚拟主机下的所有请求都会指向这个Flask应用,需根据实际需求判断是否适用。

额外检查

  • 确保/home/http/watchdog.cfg文件存在,且Apache进程(通常为www-data用户)对该文件及所在目录有读写权限,避免后续出现权限相关错误。
  • 修改配置后重启Apache服务:sudo systemctl restart apache2

内容的提问来源于stack exchange,提问作者Rob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 22:02:40