ロケーションディレクティブは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/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>

関連情報