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

Fra*_*til 7 apache django reverse-proxy wsgi gunicorn

我有一个在gunicorn上运行的WSGI-app(一个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
Run Code Online (Sandbox Code Playgroud)

为了/my-project/便于携带,我不想强制Django为其所有URL 添加前缀.Apache显然应该使用该ProxyPassReverse行自己处理前缀.我究竟做错了什么?

Chr*_*ing 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>
Run Code Online (Sandbox Code Playgroud)

要使WSGI应用程序能够构建绝对URL,我们需要:

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

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

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

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


Ken*_*ane 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
Run Code Online (Sandbox Code Playgroud)

我通常使用 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>
Run Code Online (Sandbox Code Playgroud)