Настроено перенаправление поддомена Apache на другой поддомен

Настроено перенаправление поддомена Apache на другой поддомен

Я пытаюсь настроить два поддомена, для aи bв domain.com. Я использую два файла .conf, которые выглядят примерно одинаково с соответствующими изменениями в ServerName и ProxyPass:

<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.comи b.domain.comк 127.0.0.1. DNS в производстве имеет записи для того, что a.domain.comи b.domain.comесть, что является тем же IP (я также сделал это на машине, с которой я это тестирую).

Также обратите внимание, что я не обслуживаю контент из их корневых каталогов. Я добавил это, пытаясь исправить проблему, указанную в заголовке. Хотя в обоих каталогах есть простой html.

В чем же на самом деле проблема?

Просто, при попытке a.domain.com, результатом является веб-приложение из localhost:8444, как и ожидалось. При попытке b.domain.com, результатом также является localhost:8444, вместо localhost:8445. Оба a.confи b.confвключены, и если я отключу a.conf, то я правильно получаю localhost:8445. Если я также попробую как a.domain.com/b, перенаправление разрешается обратно на a.domain.com.

Я прочитал несколько вопросов и руководств, и большинство из них либо имеют что-то работающее, как в моей конфигурации, либо добавляют NameVirtualHost, который, как я понимаю, не нужен для моей версии Apache. Я также добавил ServerName в порт 80, так как думал, что, возможно, запрос bсопоставлялся с , a.confпоскольку у них одинаковый IP, но это тоже не сработало.

Что я здесь упускаю? Может, я что-то с mod_proxy игнорирую? Если возможно, я бы хотел сохранить один файл на веб-приложение. Спасибо!

Это сделано на 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.com, b.domain.comони оба преобразуются в a.domain.com. Это проблема, которую я описал изначально. НО если попробовать https://a.domain.comили https://b.domain.com, оба преобразуются в правильный сервер: aв 8444и bв 8445.

Поскольку это очень расстраивает, я возьму перерыв и проанализирую ситуацию через некоторое время.

ОБНОВЛЯТЬ

После долгого перерыва я попробовал еще несколько случайных настроек, чтобы посмотреть, что произойдет, и снова ничего не работало так, как ожидалось, за исключением случаев использования HTTPS. Я установил Postman, чтобы посмотреть, что отправляется в запросе, и обнаружил, что в Postman и HTTP, и HTTPS правильно используют Host. Еще лучше/хуже: фактический ответ показывает разные страницы приветствия для a.domain.comи b.domain.com, что означает, что мои конфигурации работают правильно, когда я использую Postman.

Я думаю, что все эти мытарства могут быть просто проблемой кэша, но мой тестовый браузер (Firefox dev ed) настроен так, чтобы не кэшировать ничего. Я проверю ответы с помощью curl и с помощью других моих браузеров.

решение1

Преступник:Кэш.

В какой-то момент конфигурация моего браузера изменилась (возможно, обновление?), и у меня было более 3 ГБ кэша, включая тестовые сайты, которые я пытался настроить как поддомены. Ужас.

После очистки кэша появилось предупреждение о моем самоподписанном сертификате при переходе по моим URL, как и ожидалось. После принятия рисков я был перенаправлен на нужные сайты. Это при использовании b.domain.comбез добавления протокола.

Чтобы убедиться, что это работает, я протестировал все мои остальные 7 браузеров (надо убедиться) и curl с протоколом и без него, и результаты также были желаемыми.

В конце концов, конфигурация была в порядке. Я выложу ее здесь, если понадобится.Сервер Apache, проксирующий определенные экземпляры Tomcat через поддомен, с использованием 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 Proxy и SSL предназначены для самоподписанных сертификатов. Пожалуйста, прочтите соответствующую документацию для каждого, если вы реализуете это для продуктивных сред. Также обратите внимание, что это файл конфигурации для a.domain.com. Эквивалент для b.domain.comточно такой же, с соответствующими ServerName, ServerAlias, перенаправлениями, Location и портом localhost.

Связанный контент