9

我有一个在 gunicorn 下运行的 WSGI 应用程序(一个 Django 项目)127.0.0.1:18731,我使用 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/从 URL 中删除,给我留下无效的 URL http://example.com/foo/

我的 mod_proxy 配置如下:

<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

为了可移植性,我不想强/my-project/​​制 Django 为其所有 URL 加上前缀。Apache 显然应该使用该行自己处理前缀ProxyPassReverse。我究竟做错了什么?

4

3 回答 3

7

我有这个问题。

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>指令,因为我在这个虚拟主机上做了很多事情。但是您可以通过将path参数传递给ProxyPassandProxyPassReverse指令轻松地重写它。

注意:ProxyRequests应该是Off,除非你也想要一个转发代理。如果您正在阅读本文,您可能只需要反向代理。

Django 特定注释:按原样settings.LOGIN_URL使用,因此您需要自己添加 。SCRIPT_NAME

于 2011-10-20T12:47:31.830 回答
2

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

<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>
于 2011-06-21T00:39:32.157 回答
0

我通过将ProxyPassReverse配置设置为实际域名解决了原始问题:

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

提示:Apache ProxyPassReverse 值

于 2013-03-21T18:03:10.610 回答