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

使用Apache2与mod_wsgi部署Flask应用:根路径与子路径冲突问题

解决Flask应用在Apache根路径与子路径共存的部署问题

这个问题我之前碰到过,本质是Apache的WSGIScriptAlias前缀匹配优先级导致的——当你把第一个应用设为WSGIScriptAlias /时,所有请求(包括/menus)都会被优先转发给根路径的Flask应用,而你的第一个应用里没有/menus对应的路由,自然就返回404了。

要解决这个冲突,我们需要调整根路径应用的匹配规则,让它只处理/或者除了/menus之外的请求,同时保证/menus的请求能正确路由到第二个应用。下面是两种可行的配置方案:

方案一:精确匹配根路径(仅localhost/由第一个应用处理)

如果你的第一个应用只需要响应根路径的访问,不需要处理根路径下的其他子路由,那么可以用WSGIScriptAliasMatch做精确匹配:

<VirtualHost *:80>
    ServerName localhost

    # logs configuration
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    # 先配置menus应用(顺序不影响,但放在前面更清晰)
    WSGIDaemonProcess menus user=#1000 group=#1000 threads=5
    WSGIScriptAlias /menus /var/www/flask_ac/projects/menus/hookup.wsgi
    <Directory "/var/www/flask_ac/projects/menus/">
        WSGIProcessGroup menus
        WSGIApplicationGroup menus
        Require all granted
    </Directory>

    # 配置根路径应用:仅匹配精确的/路径
    WSGIDaemonProcess flask_ac user=#1000 group=#1000 threads=5
    WSGIScriptAliasMatch ^/$ /var/www/flask_ac/hookup.wsgi
    <Directory /var/www/flask_ac>
        WSGIProcessGroup flask_ac
        WSGIApplicationGroup flask_ac
        Require all granted
    </Directory>
</VirtualHost>

方案二:排除/menus路径(根路径下其他子路由也由第一个应用处理)

如果你的第一个应用需要处理根路径下的其他子路由(比如/about、/contact),但要排除/menus,可以用正则匹配来过滤路径:

<VirtualHost *:80>
    ServerName localhost

    # logs configuration
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    # 先配置menus应用
    WSGIDaemonProcess menus user=#1000 group=#1000 threads=5
    WSGIScriptAlias /menus /var/www/flask_ac/projects/menus/hookup.wsgi
    <Directory "/var/www/flask_ac/projects/menus/">
        WSGIProcessGroup menus
        WSGIApplicationGroup menus
        Require all granted
    </Directory>

    # 配置根路径应用:匹配所有不以/menus开头的路径
    WSGIDaemonProcess flask_ac user=#1000 group=#1000 threads=5
    WSGIScriptAliasMatch ^/(?!menus)(.*)$ /var/www/flask_ac/hookup.wsgi/$1
    <Directory /var/www/flask_ac>
        WSGIProcessGroup flask_ac
        WSGIApplicationGroup flask_ac
        Require all granted
    </Directory>
</VirtualHost>

配置完成后的操作

  1. 保存修改后的Apache配置文件
  2. 重启Apache服务(命令:sudo systemctl restart apache2,根据你的系统可能略有不同)
  3. 测试访问:
    • 访问localhost:应该正常显示第一个Flask应用
    • 访问localhost/menus:应该正常显示第二个Flask应用

额外注意事项

  • 确保两个Flask应用的hookup.wsgi脚本配置正确,比如都正确导入了Flask实例(通常是from app import app as application)
  • 检查Apache用户对/var/www/flask_ac及其子目录的访问权限,避免因权限问题导致无法加载应用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:44:05