我有一个在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}}行自己处理前缀。我做错了什么?
答案 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
参数传递给ProxyPass
和ProxyPassReverse
指令来轻松地重写它。
注意:ProxyRequests
应关闭,除非您也想要转发代理。如果你正在读这篇文章,你可能只想要一个反向代理。
Django特别说明:settings.LOGIN_URL
按原样使用 ,因此您需要自己添加SCRIPT_NAME
。
答案 1 :(得分:2)
<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/