
困っています。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/stuffwsgiスクリプトを実行することすらありません。コードを台無しにしたり、他のサーバーの実装を分解したりせずに、/stuffへのリクエストをproxypassではなくdjangoに直接送信するにはどうすればいいでしょうか?私は次のように試しました
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>