Apache サブドメインを別のサブドメインにリダイレクトするように設定

Apache サブドメインを別のサブドメインにリダイレクトするように設定

との2 つのサブドメインを設定しようとしていaます。 2 つの .conf ファイルを使用しますが、これらは ServerName と ProxyPass の変更に応じてほぼ同じように見えます。bdomain.com

<VirtualHost *:80>
        ServerName a.domain.com #This was added as a try for a fix. 
        Redirect permanent /  https://a.domain.com/
</VirtualHost>

<VirtualHost *:443>

        ServerName a.domain.com
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html/a

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        #SSL stuff

        #Proxies

        ProxyPass        /        https://a.domain.com:8444/
        ProxyPassReverse /        https://a.domain.com:8444/
        ProxyPass        /a/      https://a.domain.com:8444/
        ProxyPassReverse /a/      https://a.domain.com:8444/
        ProxyPass        /b/      https://b.domain.com:8445/
        ProxyPassReverse /b/      https://b.domain.com:8445/

</VirtualHost>

これは私のテスト環境で実行されており、現在運用中のものと似たものを複製しています。/etc/hosts で、a.domain.comb.domain.comを 127.0.0.1 に追加しました。運用中の DNS には と のレコードがありa.domain.comb.domain.comこれらは同じ IP です (これをテストしているマシンでもこれを実行しました)。

また、ルート ディレクトリからコンテンツを提供していないことにも注意してください。タイトルに記載されている問題を修正するためにこれを追加しました。ただし、両方のディレクトリに単純な HTML があります。

実際の問題は何でしょうか?

単純に言えば、 を試みると、結果は予想どおりa.domain.comからの Web アプリケーションになります。 を試みると、結果はではなく になります。と は両方とも有効になっており、 を無効にすると、正しく が得られます。 のようにも試すと、リダイレクトは に戻ります。localhost:8444b.domain.comlocalhost:8444localhost:8445a.confb.confa.conflocalhost:8445a.domain.com/ba.domain.com

いくつかの質問とチュートリアルを読みましたが、そのほとんどは私の設定で機能しているもの、または NameVirtualHost を追加するものでしたが、これは私のバージョンの Apache では必要ないことがわかりました。また、同じ IP であるため、要求がb一致しているのではないかと考え、ポート 80 に ServerName を追加しましたがa.conf、それでも機能しませんでした。

ここで何が欠けているのでしょうか? mod_proxy に関する何かを無視しているのでしょうか? 可能であれば、Web アプリケーションごとに 1 つのファイルを保持したいと思います。 ありがとうございます!

これは、Ubuntu 18.04.2、Apache 2.4 (mod_proxy および mod_ssl)、Tomcat 9 上で実行されています。他に必要な情報があれば、できる限り提供します。

アップデート

この構成でも試してみました。同じ望ましくない結果になりました。

<VirtualHost *:80>
        ServerAlias a.domain.com
        Redirect permanent /  https://a.domain.com/
</VirtualHost>

<VirtualHost *:443>

        ServerName a.domain.com
        ServerAdmin webmaster@localhost

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        #SSL stuff

        #Proxies

        Redirect /b https://b.domain.com

        <Location />
                ProxyPass               https://localhost:8444/
                ProxyPassReverse        https://localhost:8444/
        </Location>

        <Location /a>
                ProxyPass               https://localhost:8444/
                ProxyPassReverse        https://localhost:8444/
        </Location>

</VirtualHost>

アップデート

さて、非常に厄介なことが分かりました。ブラウザで または を入力するとa.domain.comb.domain.com両方とも に解決されます。a.domain.comこれが最初に説明した問題です。ただし、 または を入力するとhttps://a.domain.comhttps://b.domain.com両方とも正しいサーバーに解決されます:aおよび8444に。b8445

これは非常にイライラすることなので、しばらく休憩してこれを分析します。

アップデート

長い休止の後、何が起こるかを見るために他のランダムな調整をいくつか試してみましたが、やはり HTTPS を使用する場合を除いて、何も期待どおりに動作しませんでした。リクエストで何が送信されているかを確認するために Postman をインストールしたところ、Postman では HTTP と HTTPS の両方がホストを正しく使用していることがわかりました。さらに良い/悪い点: 実際の応答には、a.domain.comとの異なるウェルカム ページが表示されていますb.domain.com。つまり、Postman を使用する場合、構成は適切に機能しているということです。

このすべての問題は単にキャッシュの問題である可能性があると思いますが、私がテストに使用しているブラウザ (Firefox dev ed) はキャッシュしないように設定されています。curl と他のブラウザで応答を確認します。

答え1

犯人:キャッシュ

ある時点で、ブラウザの設定が変わり (おそらくアップデート?)、サブドメインとして設定しようとしていたテスト サイトを含めて 3 GB を超えるキャッシュが存在していました。ひどい。

キャッシュをクリアした後、予想どおり、URL にアクセスしたときに自己署名証明書に関する警告が表示されました。リスクを受け入れた後、適切なサイトにリダイレクトされました。これは、b.domain.comプロトコルを追加せずに使用することで実現しました。

これが機能していることを確認するために、他の 7 つのブラウザーすべて (確認が必要) とプロトコルありとなしの curl でテストしたところ、結果も期待どおりでした。

結局、設定は大丈夫でした。必要な場合に備えてここに投稿します。サブドメインによって特定の Tomcat インスタンスにプロキシする Apache サーバー。proxy_mod を使用してポート 80 からポート 433 に即座にリダイレクトします。

<VirtualHost *:80>
        ServerName a.domain.com
        Redirect permanent /  https://a.domain.com/
</VirtualHost>

<VirtualHost *:443>
        
        ServerName a.domain.com
        ServerAdmin [email protected]

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        #SSL stuff

        SSLEngine On
        SSLCertificateFile /etc/ssl/certs/DONT_USE_SELF_SIGNED.pem
        SSLCertificateKeyFile /etc/ssl/private/CERTS_IN_PRODUCTIve.key
        SSLVerifyClient none

        #Proxies
        ProxyRequests Off
        SSLProxyEngine on
        SSLProxyVerify none
        SSLProxyCheckPeerCN off
        SSLProxyCheckPeerName off
        SSLProxyCheckPeerExpire off

        #Redirections
        Redirect /b https://b.domain.com

        <Location />
                ProxyPass               https://localhost:8444/
                ProxyPassReverse        https://localhost:8444/
        </Location>

        <Location /a>
                ProxyPass               https://localhost:8444/
                ProxyPassReverse        https://localhost:8444/
        </Location>

</VirtualHost>

SSL プロキシと SSL の設定は自己署名証明書用であることを考慮してください。これを実稼働環境に実装する場合は、それぞれの関連ドキュメントをお読みください。また、これは の構成ファイルであることにも注意してください。a.domain.comの同等のものはb.domain.com、適切な ServerName、ServerAlias、リダイレクト、場所、および localhost のポートを使用してまったく同じです。

関連情報