我的烧瓶应用正在对其中一个网址进行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并毫不费力地获取它。但是,世界上有人要求提供此网址的301
响应。
这是一个GET
请求,其中包含一些自定义标题以将其链接到该帐户。
我的代码中没有任何一个301
重定向。
答案 0 :(得分:50)
回溯显示路由匹配引发了重定向; 通常(例如,除非您添加了明确的重定向路由),这意味着客户端尝试访问分支 URL(以尾部斜杠结尾的URL) ),但请求的URL不包括最后一个斜杠。只需将客户端重定向到带有斜杠的规范分支URL 。
来自Werkzeug Rule
documentation:
以斜杠结尾的URL规则是分支URL,其他是叶子。如果您启用了
strict_slashes
(这是默认设置),那么匹配时没有尾部斜杠的所有分支URL都会触发重定向到相同的URL,并附加缺少的斜杠。
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将保持唯一,这有助于搜索引擎避免两次索引相同的页面。
如上所述,如果你不想要这种行为(并且让没有的尾部斜杠改为404 Not Found),你必须设置{{路线上的1}}选项。