烧瓶 301 响应

Posted

技术标签:

【中文标题】烧瓶 301 响应【英文标题】:Flask 301 Response 【发布时间】:2014-01-29 18:44:00 【问题描述】:

我的烧瓶应用正在为其中一个网址执行301 重定向。

New Relic 中的回溯是:

Traceback (most recent call last):
  File "/var/www/app/env/local/lib/python2.7/site-packages/flask/app.py", line 1358, in full_dispatch_request
    rv = self.dispatch_request()
  File "/var/www/app/env/local/lib/python2.7/site-packages/flask/app.py", line 1336, in dispatch_request
    self.raise_routing_exception(req)
  File "/var/www/app/env/local/lib/python2.7/site-packages/flask/app.py", line 1319, in raise_routing_exception
    raise request.routing_exception
RequestRedirect: 301: Moved Permanently

看起来它甚至没有命中我的代码,或者追溯没有显示我的任何文件。在某一时刻,我确实让 nginx 将所有非 SSL 请求重定向到 HTTPS,但不得不禁用它,因为 Varnish 无法在没有错误的情况下向端口 443 发出请求......可能是我做过或没有做过的一些配置制作。

虽然它并不总是返回 301,但我可以请求 URL 并轻松获取它。但是世界上某个请求该 URL 的人收到了 301 响应。

这是一个 GET 请求,带有一些自定义标头以将其链接到帐户。

我的代码中没有301 重定向。

【问题讨论】:

您是否正在使用诸如 Flask-Login 之类的基于会话的身份验证方法?在这种情况下,通常会使用 301 重定向重定向到登录屏幕。 这个特定页面是一个简单的 JSON 文档,不需要登录,但标题中的有效 API 密钥是。 Werkzeug 默认重定向到带有 / 的版本,如果路由映射到以 / 结尾的路径但在没有 / 的情况下访问。 我们能看到路线/代码吗? 【参考方案1】:

回溯表明是路由匹配引发了重定向; 通常(例如,除非您添加了显式重定向路由),这意味着客户端尝试访问 branch URL(以 尾部斜杠 结尾的 URL ),但请求的 URL 不包含最后一个斜杠。客户端只是被重定向到规范的分支 URL 斜线。

来自Werkzeug Rule documentation:

以斜杠结尾的 URL 规则是分支 URL,其他的是叶子。如果您启用了strict_slashes(这是默认设置),所有匹配的不带尾部斜杠的分支 URL 将触发重定向到附加缺少斜杠的相同 URL。

来自routing documentation:

Flask 的 URL 规则基于 Werkzeug 的路由模块。该模块背后的想法是根据 Apache 和早期 HTTP 服务器制定的先例确保美观且唯一的 URL。

采取以下两条规则:

@app.route('/projects/')
def projects():
    return 'The project page'

@app.route('/about')
def about():
    return 'The about page'

虽然它们看起来很相似,但它们在 URL 定义中对尾部斜杠的使用有所不同。在第一种情况下,项目端点的规范 URL 有一个尾部斜杠。从这个意义上说,它类似于文件系统上的文件夹。不带斜杠访问它会导致 Flask 重定向到带有斜杠的规范 URL。

然而,在第二种情况下,URL 的定义没有尾部斜杠,就像类 UNIX 系统上文件的路径名一样。使用尾部斜杠访问 URL 将产生 404“未找到”错误。

这种行为允许相对 URL 继续工作,即使尾部斜杠被省略,这与 Apache 和其他服务器的工作方式一致。此外,URL 将保持唯一性,这有助于搜索引擎避免将同一页面编入两次索引。

如文档所述,如果您确实 想要这种行为(并且将 url 没有 尾部斜杠改为 404 Not Found),则必须设置 @987654326路线上的 @ 选项。

【讨论】:

以上是关于烧瓶 301 响应的主要内容,如果未能解决你的问题,请参考以下文章

在烧瓶中重定向时丢弃响应正文

视图函数未返回有效响应。烧瓶棉花糖,RestAPI [重复]

使用烧瓶返回布尔作为POST响应[重复]

没有 Location 标头的 301 http 响应

处理跨域 REST 响应的 301 和位置标头

分析和查找烧瓶应用程序的瓶颈---当前响应时间为 30 秒 [关闭]