我的烧瓶应用正在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
重定向.
回溯显示路由匹配引发了重定向; 通常(例如,除非您添加了显式重定向路由),这意味着客户端尝试访问分支 URL(以尾部斜杠结尾的URL),但请求的URL不包括最后一个斜杠.只需使用斜杠将客户端重定向到规范分支URL .
从Werkzeug Rule
文档:
以斜杠结尾的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),则必须strict_slashes=False
在路由上设置该选项.