烧瓶301响应

时间:2014-01-10 17:12:06

标签: python nginx flask varnish uwsgi

我的烧瓶应用正在对其中一个网址进行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重定向。

1 个答案:

答案 0 :(得分:50)

回溯显示路由匹配引发了重定向; 通常(例如,除非您添加了明确的重定向路由),这意味着客户端尝试访问分支 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将保持唯一,这有助于搜索引擎避免两次索引相同的页面。

如上所述,如果你想要这种行为(并且让没有的尾部斜杠改为404 Not Found),你必须设置{{路线上的1}}选项。