Рейтинг:1

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

флаг fr

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

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

В чем проблема?

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

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

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

ОБНОВИТЬ

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

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

флаг kz
Вы упоминаете _caching_... имейте в виду, что 301 директива постоянно кэшируется (браузером и, возможно, промежуточными кэшами). Если вы ранее пропустили директиву `ServerName a.domain.com` в vHost:80 (и соответствующую директиву для `b.domain.com`), то перенаправление с `http://b.domain.com/` на ` https://a.domain.com` мог быть кэширован (зависит от порядка, в котором включены ваши файлы конфигурации). Так что да, эта директива на самом деле _необходима_.
Jetto Martínez avatar
флаг fr
Да, ваш комментарий появился как раз в то время, когда я разместил ответ. Это действительно был тайник. Я настроил свой браузер так, чтобы он ничего не кешировал, но он кешировал. Я не уверен, почему эта конфигурация была сброшена. С этим исправлением я все еще буду изучать это. Спасибо!
Рейтинг:1
флаг fr

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

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

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

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

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

флаг kz
Мелочь, но вам не нужны `ServerName` _и_ `ServerAlias`, если они относятся к одному и тому же _hostname_.
Jetto Martínez avatar
флаг fr
Отмеченный. ServerName — это то, что я должен оставить, верно?
флаг kz
Да это правильно.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.