web-dev-qa-db-ja.com

Apache:ドメイン全体のリバースプロキシ

少し前に同じ質問をしましたが、正解しなかったと思います。 1つの仮想ホストドメイン全体を別の仮想ホストのサブディレクトリにリバースプロキシしようとしています。たとえば、次のようになります http://Host2.com -> http://Host1.com/Host2

Apacheのデフォルトのサイトファイルはこれです

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName "Host1.com"

    <Directory /srv/www/Host1>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order deny,allow
        Allow from all
    </Directory>

    DocumentRoot /srv/www/Host1
    WSGIScriptAlias / /srv/www/Host1/Apache/Django.wsgi

</VirtualHost>

<VirtualHost *:80>

    ServerAdmin webmaster@localhost
    ServerName "Host2.com"
    ProxyRequests Off

    <Proxy *>
    Order deny,allow
    Allow from all
    </Proxy>

    ProxyPass / http://Host1.com/Host2
    ProxyPassReverse / http://Host1.com/Host2

 </VirtualHost>

現時点での問題は、 http://Host2.com にアクセスすると、 http://Host1.comhttp://Host1.com/Host2 の代わりに。何が欠けていますか?それが重要かどうかはわかりませんが、Host1はDjangoとwsgiを使用してホストされています。

5
Neo

ProxyPassは、スラッシュについては非常に細かいです。末尾のスラッシュ(ルート、/)をプロキシするので、末尾のスラッシュにTOをプロキシする必要があります。

したがって、以下のように、末尾のスラッシュをターゲットに追加すると役立つはずです。

また、プロキシしているデバイスもローカルシステムであるため、127.0.0.1を使用して、潜在的な名前解決/ NATの混乱を回避することをお勧めします。ここに配置するものは、サーバーが受信するHostヘッダーとは関係がなく、ProxyPreserveHost Onが設定されている限り、クライアントヘッダーが渡されます。

ProxyPreserveHost On
ProxyPass / http://127.0.0.1/Host2/
ProxyPassReverse / http://127.0.0.1/Host2/

それが機能しない場合は、おそらくHost2に一時的なコンテンツページを提供して、正しい仮想ホストにアクセスしていることを確認します。

ちなみに、その<Proxy *>ブロックは必要ありません。 ProxyRequests onモードで実行している場合のために構築されており、リバースプロキシでは期待どおりに機能しません(アクセス制御には代わりに<Location>を使用してください)

6
Shane Madden