烧瓶 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 响应的主要内容,如果未能解决你的问题,请参考以下文章