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

Flask动态路由在Namecheap虚拟主机中出现404,如何解决?

解决Namecheap cPanel部署Flask后动态路由404问题

问题根源

本地开发服务器由Flask直接处理所有路由解析,但在Namecheap的cPanel Passenger环境中,请求会先经过Apache/Nginx处理。如果.htaccess或WSGI配置不正确,动态路由会被服务器当作静态文件路径查找,导致404,且请求根本没到达Flask应用,所以stderr日志无内容。

解决方案

1. 修正.htaccess重写规则

确保项目根目录下的.htaccess包含完整的转发规则,将所有非静态资源请求导向Flask的WSGI入口文件(假设你的Flask主文件是app.py):

RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
# 跳过已存在的文件/目录
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# 将所有请求转发到WSGI入口
RewriteRule . /app.py [L]

如果你的WSGI入口是passenger_wsgi.py(多数教程默认命名),则把最后一行改为RewriteRule . /passenger_wsgi.py [L]。

2. 确认WSGI入口文件配置

Passenger需要从WSGI文件中读取名为application的对象作为入口。如果你的Flask app定义在app.py中,创建(或修改)passenger_wsgi.py:

from app import app as application

注意:不要在WSGI文件中调用app.run(),这是本地开发专用代码,部署环境由Passenger管理进程。

3. 统一路由的斜杠规则

你的动态路由是/<string:name>/(带结尾斜杠),访问时必须严格带斜杠(比如/alice/)。如果希望同时支持带/不带斜杠的访问,可修改路由为:

@app.route("/<string:name>")
@app.route("/<string:name>/")
def say_hello(name):
    return f"Hello {name}!"

或者在.htaccess中添加斜杠重定向规则,确保所有请求自动补全结尾斜杠:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*[^/])$ /$1/ [L,R=301]

4. 重启Passenger应用

在cPanel的"Passenger Applications"面板中找到你的应用,点击"Restart"按钮;或者修改.htaccess文件(比如添加一个空格再保存),触发Passenger自动重启应用,清除缓存。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 11:52:41