在 Namecheap 共享主机部署 Flask 应用时,根路径 / 可正常访问,但带变量的动态路由(如 //)返回 404,根本原因是其默认启用的 Website Builder 的 .htaccess 重写规则劫持了所有请求。

如果你在 Namecheap 的共享主机上部署 Flask 应用,很可能会遇到一个让人头疼的坑:根路径 / 访问得好好的,可一旦换成带变量的动态路由,比如 //,直接给你返回 404 页面。别急着怀疑代码写错了——问题十有八九出在 Namecheap 默认开启的 Website Builder 规则上,它悄悄在 .htaccess 里埋了一行重写,把本该交给 Flask 的请求全部截胡了。

Flask 在共享主机上跑,依赖的是 Apache + mod_wsgi(或者通过 passenger_wsgi.py 来驱动)。但 Namecheap 为了照顾使用“Website Builder”功能的用户,默认会在 public_html/.htaccess 里自动生成一条强制重写规则,内容长这样:

RewriteRule ^(.*)$ ncsitebuilder/$1 [L,QSA]

这条规则的意思很简单粗暴:所有 HTTP 请求,不管路径是什么,一律重定向到 ncsitebuilder/ 子目录。这样一来,Flask 应用根本收不到 /username/ 这类动态路由请求——Apache 直接把请求扔给了 Website Builder,压根没到 WSGI 应用那一步。所以返回 404 是必然的,而且你在 Flask 的应用日志里看不到任何记录,因为请求根本没进到你的代码里。

解决方案其实很简单:手动编辑 public_html/.htaccess 文件,把上面那行 RewriteRule 注释掉或者删掉即可:

# RewriteRule ^(.*)$ ncsitebuilder/$1 [L,QSA]

这里有几个注意事项,值得留意:

@app.route("/", strict_slashes=False)
def say_hello(name):
    return f"Hello {name}!"

验证步骤也很清晰:

  1. 通过 FTP 或 cPanel 文件管理器打开 public_html/.htaccess
  2. 找到并注释掉 RewriteRule ^(.*)$ ncsitebuilder/$1 [L,QSA]
  3. 保存文件;
  4. 访问 https://yoursite.com/test/ —— 应该返回 "Hello test!"。

至此,Flask 的完整路由机制(包括变量捕获、HTTP 方法区分、URL 参数解析等)就可以在 Namecheap 共享主机上正常工作了。核心原则始终是那一句:确保 Web 服务器将请求准确传递给 WSGI 应用,而不是被中间层的规则拦腰截断。

本文转载于:https://www.php.cn/faq/2812545.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。