我们有一个托管设置,我们有一个顶级域名,我们在子路径下托管Web应用程序。例如:
/projects -> Plone /interal -> Tomcat etc
在这种情况下,我们需要一种方法来告诉后端的Web应用程序它的基本路径是什么,以便它可以正确地生成其视图和静态内容的链接。对于上面的例子,这很好。
我们刚刚开始使用由女服务员服务的金字塔,但到目前为止我们还没弄清楚如何做到这一点。有没有一种干净的方法在Waitress中配置这个基本路径,或者是否有一个更灵活的应用服务器,我们可以使用它来支持Pyramid?
答案 0 :(得分:5)
WSGI中的所有内容都与当前请求相关。您只需要正确设置environ
(通常由WSGI服务器)。
例如,如果/projects
,您的网络应用程序会知道它已安装在子路径request.environ['SCRIPT_NAME'] == '/projects'
上。如果您希望应用程序与其挂载点无关,则可以简单地对其进行编码,就像它在/foo/bar
处提供视图一样。然后通过一些可以正确改变/projects
的中间件在environ
上挂载您的应用程序(mod_wsgi和其他一些服务器应该能够自动为您执行此操作)。现在,当传入的网址为/projects/foo/bar
environ['SCRIPT_NAME'] == '/projects'
和environ['PATH_INFO'] == '/foo/bar'
时,您的应用可以专注于相对路径。
在金字塔中,这可以归结为你的ini中的一个额外步骤,在那里你将前缀中间件添加到你的WSGI堆栈。中间件会为您改变PATH_INFO
中的SCRIPT_NAME
和environ
个键。
[app:myapp]
use = egg:myapp
# ...
[filter:proxy-prefix]
use = egg:PasteDeploy#prefix
prefix = /projects
[pipeline:main]
pipeline =
proxy-prefix
myapp
答案 1 :(得分:0)
在我的金字塔应用程序中,在.ini配置文件(生产和开发)中,我做了类似的事情:
filter-with = urlprefix
[filter:urlprefix]
use = egg:PasteDeploy#prefix
prefix = /mysubfolder
我认为它可能与迈克尔的答案完成相同;我对金字塔来说还是比较新的,而且我会像你这样的食谱。但最终的结果是它从我的root创建了/ mysubfolder的基本URL,而应用程序的其余部分与此相关。这是在本地pserve下运行的,我认为我的网站主机上有nginix。
答案 2 :(得分:0)
repoze.vhm应该可以正常使用。
如果您想使用虚拟根功能,我认为它不起作用。即,您的代理网络应用( https://hidden.tld/root/ 的子路径应显示为 https://example.com/ )
为了在外部域的子路径上公开您的应用程序repoze.vhm工作得很好。 IMO最好的事情是,您不需要将任何子路径配置或任何内容放入您的Web应用程序部署中。这允许您将URL更改为代理上的任何内容,甚至可以在多个域名和/或子路径上公开相同的应用程序实例。