【问题标题】:URL missing trailing slash does not get redirected in CherryPy在 CherryPy 中,缺少尾部斜杠的 URL 不会被重定向
【发布时间】:2013-01-23 06:53:39
【问题描述】:

我在 CherryPy 处理静态文件时遇到了困难。问题与处理 URL 的尾部斜杠有关。有时会添加缺少的斜线,有时则不会:行为是不可预测的。我确信那里潜伏着一个错误。当我添加或删除一些静态文件时,该错误似乎出现了。看起来可能有一个未初始化的变量在处理斜杠的函数中创建了一个未确定的状态。我已经整理了一个显示问题的最小应用程序(至少在我的机器中)。我在 Ubuntu 12.10 下使用 CherryPy 3.2.2。

import cherrypy

class Root(object): pass

conf = {
    '/':{
    'tools.staticdir.on': True,
    'tools.staticdir.dir': '/home/bob/www',
    'tools.staticdir.index': 'index.htm',
    'tools.staticdir.debug': True,
    },
}

cherrypy.tree.mount(Root(), '/', config=conf)
cherrypy.engine.start()
cherrypy.engine.block()

我的实验性静态文件夹 (/home/bob/www) 的结构非常简单:

/home/bob/www/index.htm         <-- This file is just <html><body>Hello</body></html>
/home/bob/www/dir/index.htm     <-- This files includes a <img src="picture.jpg"> tag in it
/home/bob/www/dir/picture.jpg   <-- Any picture will do

如果我浏览 localhost:8080/dir/,结果页面会显示图像。
如果我浏览 localhost:8080/dir,结果页面显示图像。

任何帮助将不胜感激。也许我没有正确配置应用程序,因为我是 CherryPy 的新手。

谢谢,
鲍勃

附:我已经阅读了 stackoverflow.com/questions/10276060,它有类似的问题,但使用了 Routes。我不使用路由。

【问题讨论】:

  • 可能会尝试在您的配置中使用'tools.trailing_slash.on': True 行启用trailing_slash 工具。咨询Docs page
  • @Felix,我尝试了您的建议,但无济于事。无论如何,我认为'tools.trailing_slash.on': True 是默认值。演示迷你应用程序很简单,我想做的是非常基本的。我想知道其他人是否遇到过这个问题。
  • 我认为这是浏览器级别的 URI 中“目录”的含义的一些基本混淆。在 Chrome 中,当我访问 localhost:8080/dir 时,它会将“picture.jpg”请求发送到 localhost:8080/picture.jpg 基本上,Chrome 无法知道 localhost:8080/dir 是一个目录,而不仅仅是一个 file。它假定它是一个文件,因此它将路径“picture.jpg”解析为/picture.jpg(这是正确的)。但是,如果 URI 以斜杠结尾,则浏览器似乎会假设“嘿,这是一个目录,而不是文件”并相应地对待它。
  • @Felix,有趣的观察。我已经用 Firefox 和 Chromiun 测试了这个“错误”,并且都显示了相同的结果。我不是这方面的专家,但在我看来,在这方面 CherryPi 服务器的行为应该类似于 Apache 的行为。当 Apache 收到对“目录”的请求并且尾部斜杠丢失时,它会将浏览器重定向到包含尾部斜杠的新 URI。从此时起,所有相关 URI 都按预期工作。我的原始站点使用 Apache 和 mod_python,我想切换到 CherryPy。
  • 似乎有一种单行破解方法可以解决此问题。查看文件“static.py”(cherrypy/lib)。在staticdir() 函数的末尾,有一个语句:if handled: request.is_index = filename[-1] in (r"\/") 似乎用if handled: request.is_index = True 替换它会给出你想要的行为,并结合'trailing_slash' 工具。 (它与那里的切换有关,request.is_index。不能保证这是 100% 安全或正确的做法。建议在 Google Groups 上的 cherrypy-users 组上提问,你会得到更好的回答。

标签: python cherrypy static-files trailing-slash


【解决方案1】:

临时解决方案

此处显示的临时解决方案需要对其中一个 CherryPy 源文件进行小补丁。我要感谢告诉我这件事的 Felix Bonkoski。我做了一些谷歌搜索,并在 bitbucket.org/cherrypy/cherrypy/issue/895/ 找到了对它的引用。

以下是说明:

找到并编辑文件 static.py(在我的 Ubuntu 机器中,它位于 /usr/local/lib/python2.7/dist-packages/cherrypy/lib/static.py)。在函数 staticdir() 中,找到下面的行。它们位于该函数的末尾。

 if handled:
    request.is_index = filename[-1] in (r"\/")   <--- Line in question

编辑有问题的行,使其如下所示:

 if handled:
    request.is_index = True

并保存文件。

此时我重新启动了计算机,CherryPy 现在可以正常工作了。

【讨论】:

    猜你喜欢
    • 2015-06-10
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    相关资源
    最近更新 更多