金字塔:如何在request.environ中设置SCRIPT_NAME

时间:2017-01-18 02:00:14

标签: python nginx environment-variables pyramid wsgi

我在nginx后面有一个金字塔应用代理,我试图在SCRIPT_NAME中设置request.environ

我试过了:

  • 在shell pserve中导出它正在
  • 中运行
  • 在shell nginx中导出它正在
  • 中运行
  • 在Pyramid配置文件中定义它
  • gevent.wsgi.WSGIServer.environ
  • 之前在serve_forever()上手动设置

我在最后一步中定义的非标准值是可用的,但SCRIPT_NAME始终为空,这似乎表明它已被其他地方覆盖。

我该如何设置?

2 个答案:

答案 0 :(得分:1)

看看repoze.vhm。

它通常可以解决我所有的虚拟主机问题。 (子路径,虚拟根等...)。 repoze.vhm的最大优点是,您的金字塔应用程序可以完全不知道外部URL和路径。你必须要小心,在为你的网站/应用程序生成网址时使用request.route_url和其他方法(但这无论如何都应该是好的做法)。

https://github.com/repoze/repoze.vhm

答案 1 :(得分:0)

SCRIPT_NAME由WSGI服务器基于每个请求设置。如果您的服务器没有设置它的挂钩(女服务员有url_prefix=...设置),那么您可以轻松地在中间件堆栈中添加一个中间件,为您设置它。您也可以使用粘贴前缀中间件来添加SCRIPT_NAME,而不是编写自己的自定义中间件。它还支持通过翻译wsgi.url_scheme标题来覆盖X-Forwarded-Proto,这有助于https。

使用中间件的最佳方法是将其添加到您的ini文件中。服务员文档中有一些很好的例子。我将在下面复制一个,以便更清楚。 [1]

[app:myapp]
use = egg:mypackage#myapp

[filter:paste_prefix]
use = egg:PasteDeploy#prefix

[pipeline:main]
pipeline =
    paste_prefix
    myapp

[server:main]
use = egg:waitress#main
listen = 127.0.0.1:8080

http://docs.pylonsproject.org/projects/waitress/en/latest/#using-behind-a-reverse-proxy