尽管是ProxyPassReverse,但是通过mod_proxy的gunicorn正在重定向到项目范围之外

时间:2011-06-20 21:53:40

标签: django apache wsgi reverse-proxy gunicorn

我有一个在127.0.0.1:18731上的gunicorn下运行的WSGI-app(一个Django项目),我使用Apache和mod_proxy将请求从http://example.com/my-project/*重定向到http://127.0.0.1:18731/*。静态文件存储在/my-project/之外。如果Django应用程序不需要重定向任何东西,这可以正常工作,但如果它尝试重定向请求(例如向http://example.com/my-project/foo添加尾部斜杠),它最终会从/my-project/删除http://example.com/foo/网址,留下无效网址<Proxy *> Order deny,allow Allow from all </Proxy> ProxyRequests On ProxyPass /my-project/ http://127.0.0.1:18731/ retry=0 ProxyPassReverse /my-project/ http://127.0.0.1:18731/ retry=0 ProxyPreserveHost On ProxyErrorOverride Off

我的mod_proxy配置如下:

/my-project/

为了便于携带,我不想强​​迫Django将ProxyPassReverse添加到其所有URL前面。 Apache显然应该使用{{1}}行自己处理前缀。我做错了什么?

3 个答案:

答案 0 :(得分:6)

我有这个问题。

ProxyPreserveHost On

<Location "/my-project/">
    ProxyPass http://127.0.0.1:18173/my-project/
    ProxyPassReverse http://127.0.0.1:18173/my-project/
    RequestHeader set SCRIPT_NAME /my-project
    RequestHeader set X-FORWARDED-PROTOCOL ssl
    RequestHeader set X-FORWARDED-SSL on
</Location>

要启用WSGI应用程序以构建我们需要的绝对URL:

  • ProxyPreserveHost On,因此传递了Host:标头,并且应用知道客户看到我们的主机名。
  • 添加SCRIPT_NAME标题,以便应用知道其根目录。
  • 根据需要设置X-FORWARDED-标头。我也在使用ssl,所以我必须告诉应用它应该使用https方案。

我使用<Location>指令,因为我在这个vhost上做了很多东西。但是你可以通过将path参数传递给ProxyPassProxyPassReverse指令来轻松地重写它。

注意:ProxyRequests关闭,除非您也想要转发代理。如果你正在读这篇文章,你可能只想要一个反向代理。

Django特别说明:settings.LOGIN_URL按原样使用 ,因此您需要自己添加SCRIPT_NAME

答案 1 :(得分:2)

你尝试过这个吗?我将my-project添加到您正在代理的网址中。

<Proxy *>
    Order deny,allow
    Allow from all
</Proxy>
ProxyRequests On
ProxyPass /my-project/ http://127.0.0.1:18731/my-project/ retry=0
ProxyPassReverse /my-project/ http://127.0.0.1:18731/my-project/ retry=0
ProxyPreserveHost On
ProxyErrorOverride Off

我通常使用nginx来做这类事情,所以我不确定这是否会起作用。

更新:以上内容无效,请尝试其他方式。

尝试这样的事情,看看是否有帮助。它设置有点不同。它代理除通过别名提供的媒体之外的所有内容。这样就不需要/ my-project /了。

<VirtualHost *:80>
ServerName example.com
UseCanonicalName On
ServerAdmin webmaster@localhost

LogLevel warn
CustomLog /var/log/apache2/example.com/access.log combined
ErrorLog /var/log/apache2/example.com/error.log
ServerSignature On

Alias /media/ /home/example/example.com/pysrc/project/media/

ProxyPass /media/ !
ProxyPass / http://127.0.0.1:18731/
ProxyPassReverse / http://127.0.0.1:18731/
ProxyPreserveHost On
ProxyErrorOverride Off
</VirtualHost>

答案 2 :(得分:0)

我已将 ProxyPassReverse 配置设置为实际域名,从而解决了原始问题:

ProxyPass /my-project/ http://127.0.0.1:18731/
ProxyPassReverse /my-project/ http://mydomain.com/

提示:Apache ProxyPassReverse values