使用 SERVER_NAME 时的 Flask 404

Posted

技术标签:

【中文标题】使用 SERVER_NAME 时的 Flask 404【英文标题】:Flask 404 when using SERVER_NAME 【发布时间】:2014-04-14 11:37:12 【问题描述】:

在我的 Flask 配置中,我将 SERVER_NAME 设置为像“app.example.com”这样的域。我这样做是因为我需要将url_for_external URL 一起使用。如果 SERVER_NAME 未设置,Flask 认为服务器是 127.0.0.1:5000(它实际上是在反向代理后面运行),并返回一个外部 URL,如 http://127.0.0.1:5000/location

到目前为止一切顺利。但这是我的问题:设置 SERVER_NAME 后,每个 URL 都返回 404。我看到每个请求都到达服务器,到达正确的 URL,但 Flask 以 404 响应。如果我禁用 SERVER_NAME,则返回正确的页面。

我正在将 Apache 与 ProxyPass 和 ProxyPassReverse 一起使用(我知道,我宁愿使用 nginx,但这是必需的)。这是我要添加的标题:

Header add Host "app.example.com"
RequestHeader set Host "app.example.com"

Header add X-Forwarded-Host "app.example.com"
RequestHeader set X-Forwarded-Host "app.example.com"

有什么想法吗?

【问题讨论】:

【参考方案1】:

刚刚找到答案。 Apache 有一个名为ProxyPreserveHost 的选项。一旦设置为开启,一切都会按预期进行。

更多信息在这里:http://flask.pocoo.org/mailinglist/archive/2011/3/14/problem-with-apache-proxy-and-canonical-urls/

【讨论】:

好发现!这是 nginx 的修复:proxy_set_header Host $host; 你可能还需要proxy_redirect off; 用于 nginx @PieterEnnes 你绝对应该回答这正是我所需要的谢谢 如果发帖人编辑了他的答案以包括 @PieterEnnes 对 nginx 的答案,那就太好了,因为它确实有效。 如果您的地址中有端口并使用nginx,您可能需要使用proxy_set_header Host $http_host;,因为$http_host 包含端口。

以上是关于使用 SERVER_NAME 时的 Flask 404的主要内容,如果未能解决你的问题,请参考以下文章

Flask 请求源码分析

使用 Flask 运行计划时的问题

Flask 框架中 SQLAlchemy 使用时的乱码问题

技巧 | 写 Flask 应用时的一些优雅技巧

0_创建Flask 对象时的初始化参数

Flask 0.11 CLI 开发服务器——指定主机?