位置指令覆蓋 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 指令覆蓋了我的 script 指令,而我對 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

所以,這裡有一些問題。首先,查看接收伺服器上的日誌告訴我,所有轉發的網址都是“/”,導致我同事的所有照片都被破壞。這是我錯誤地捕獲 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>

相關內容