所以我陷入了困境。我有一个使用 Django 的 Web 应用程序,我正在使用 mod_wsgi 将其与 apache 集成。但是,另一个人在同一台机器上有一个代理到另一台服务器的指令。apache 配置大致如下:
我的应用程序
WSGIScriptAlias /stuff /foo/foo/wsgi.py
WSGIPythonPath /foo
<Directory /foo/foo>
<Files wsgi.py>
Order deny,allow
Allow from all
</Files>
</Directory>
他的应用程序
<Location "/">
Order Allow,Deny
AllowFromAll
ProxyPass myotherserver
ProxyPassReverse myotherserver
</Location>
不幸的是,他的 Location 指令覆盖了我的脚本指令,我对 http/www.bar.com/stuff 的所有请求最终都被转发到了http://www.myotherserver.com/stuff甚至无需运行 wsgi 脚本。我如何才能直接向 django 而不是 proxypass 发出对 /stuff 的请求,而不会弄乱他的代码或拆开他在另一台服务器上的实现?我试过
RewriteEngine on
RewriteCond %{REQUEST_URI} ^!/stuff
RewriteRule ^.*$ /bat/$1 [NC,PT]
<Location "/bat">
Order Allow,Deny
AllowFromAll
ProxyPass myotherserver
ProxyPassReverse myotherserver
</Location>
但是,当请求到达其他服务器时,这会在我的请求上添加一个无效的 /bat 目录,并破坏其页面上的所有链接。我不想破解他的所有链接。
答案1
所以,这里有几个问题。首先,查看接收服务器上的日志告诉我,所有转发的 URL 都是“/”,导致我同事的所有照片都被破坏。这是因为我在 URI 正则表达式中错误地捕获了组。通过将组括在括号中来捕获它们。
RewriteEngine on
RewriteCond %{REQUEST_URI} ^!/stuff
RewriteRule ^(.*)$ /bat/$1 [NC,PT]
现在,我做了一些相当不靠谱的事情,但我仍然欢迎大家提出其他建议。
<Location "/bat">
Order Allow,Deny
AllowFromAll
RewriteRule /bat/(.*)$ $1 [PT]
ProxyPass myotherserver
ProxyPassReverse myotherserver
</Location>
因此,基本上,如果传入的请求不是我的子目录,我会重写它,使其具有子目录。我会传递它以允许它通过下一个位置指令。在新子目录 /bat 的位置指令中,我将其改回原来的位置,并将其传递给另一台服务器,以便地址保持不变。
答案2
我遇到了同样的问题。
根据此主题,Alias
始终取代WSGIScriptAlias
。
然而,根据modwsgi 文档,它可以被标准指令取代Alias
。您的问题的解决方案如下。请注意/东西之前定义/
Alias /stuff /foo/foo/wsgi.py
WSGIPythonPath /foo
<Directory /foo/foo>
<Files wsgi.py>
Options ExecCGI
SetHandler wsgi-script
Order deny,allow
Allow from all
</Files>
</Directory>
<Location "/">
Order Allow,Deny
Allow from all
ProxyPass myotherserver
ProxyPassReverse myotherserver
</Location>