位置指令覆盖 mod_wsgi 脚本别名挂载

位置指令覆盖 mod_wsgi 脚本别名挂载

所以我陷入了困境。我有一个使用 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>

相关内容