
所以我很受阻。我有一個使用 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>