1

我的cherrypy配置中有以下内容,但是/foo没有处理我对http://foo.bar.com的请求……cherrypy应用程序位于nginx后面,它正在传递主机标头-我正在输出/ 处的 Host 标头,它返回“foo.bar.com”,所以我希望 /foo 处理这个请求。

[/]
request.dispatch = cherrypy.dispatch.VirtualHost(**{ 
    'foo.bar.com': '/foo',
})

Nginx 正在对 127.0.0.1 执行 proxy_pass :

proxy_set_header        Host            $host;
proxy_set_header        X-Real-IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
4

2 回答 2

0

我不明白这个问题,但它似乎是一个应用程序与全局配置问题。我在 server.cfg 中设置了 VirtualHosts,它被加载到全局配置中,并且我在没有应用程序配置的情况下安装:

cherrypy.config.update("server.cfg")
cherrypy.tree.mount(root, "/")

设置应用程序配置解决了问题:

conf = {
  "/": {
    "request.dispatch": cherrypy.dispatch.VirtualHost(
      **{
        "foo.domain.com:8000": "/foo",
        "bar.domain.com:8000": "/bar"
      }
    )
  }
}
cherrypy.tree.mount(root, "/", conf)

如果有人想解释,我会接受他们的回答。我现在想知道我在 server.cfg (cherrypy.config) 中的 [/] 下放置的任何设置是否可以正常工作,或者是否所有路径特定的配置都需要在应用程序配置中。

于 2013-10-31T12:58:25.087 回答
0

您不能从全局配置中设置调度程序,我认为这并不明显,但调度程序本身负责处理配置的合并

造成混淆的另一个原因是,如果您使用该cherryd命令,它可能看起来很正常。

例如,您可以像这样部署应用程序:

cherryd -c server.cfg 

具有server.cfg

[global]
tree.app = myapp.root
[/]
request.dispatch = cherrypy.dispatch.MethodDispatcher()

通过以下实现myapp.py

import cherrypy

class Root(object):
    exposed = True

    def GET(self):
        return "Hi!"

root = cherrypy.Application(Root())

但是cherryd在他的翅膀下有一些技巧。

一种是您在其上设置的添加命名空间“树”,tree.NAME_OF_APP = INSTANCE_OF_CHERRYPY_APP更重要的是,在“全局”配置文件上设置调度程序是有效的,因为cherryd当树上只有一个应用程序时,该命令会将配置文件合并到应用程序中。

就像是:

cherrypy.tree.apps.values()[0].merge(config)

有效地使“全局”配置像“本地每个应用程序”配置。

于 2013-11-01T09:07:03.793 回答