Вопрос или проблема
Я использую конфигурацию, подобную следующей:
Listen 443
<VirtualHost *:443>
ServerName test.na.xyz.com
У меня настроены корневая директория документа и сертификаты, ключи и т.д. в этом виртуальном хосте.
Мой вопрос: предположим, я перенаправляю с использованием условия /postResponse на, скажем, https://www.efg.com/xyz следующим образом:
RewriteCond %{REQUEST_URI} ^/postResponse$
RewriteRule ^/postResponse$ https://www.efg.com/xyz
Могу ли я сохранить имя хоста, упомянутое в параметре server name?
После редиректа на указанный URL, я хочу, чтобы это выглядело как:
https://test.na.xyz.com/xyz, но при этом оставалось URL, на который я перенаправляю, который отображается в браузере на основе условия после редиректа.
Это возможно с использованием rewriteRule в Apache, или только proxypreservehost с использованием proxy pass является единственным способом сохранить имя хоста?
Ответ или решение
Для ответа на ваш вопрос о том, возможно ли сохранить DNS имя URL, с которого мы перенаправляем на другой URL с использованием правил перезаписи в Apache 2.4.51, необходимы следующие подробности.
Контекст использования RewriteRule
Вы упомянули о конфигурации вашего виртуального хоста, где используется команда ServerName
, а также об использовании правил перезаписи. Для того чтобы перенаправить запрос с одного URL на другой, вы используете RewriteCond
и RewriteRule
. В приведенном вами примере, как только пользователь обращается к /postResponse
, происходит перенаправление на https://www.efg.com/xyz
.
Вот как это выглядит в вашей конфигурации:
RewriteCond %{REQUEST_URI} ^/postResponse$
RewriteRule ^/postResponse$ https://www.efg.com/xyz
Сохранение имени хоста
Ваш вопрос заключается в том, возможно ли сохранить имя хоста, упомянутое в параметре ServerName
, и по-прежнему показывать https://test.na.xyz.com/xyz
в адресной строке браузера.
К сожалению, простое применение RewriteRule не позволяет сохранить имя хоста в URL адресной строки. Правила перезаписи действуют на уровне Apache с точки зрения управления запросами, и когда происходит перенаправление, браузер получает новый URL и отображает его в адресной строке.
Решение с помощью ProxyPass и ProxyPreserveHost
Для достижения желаемого результата вам нужно использовать ProxyPass
в связке с ProxyPreserveHost
. Это позволит вам обрабатывать запросы к вашему серверу и в то же время сохранять исходное имя хоста. Пример конфигурации будет выглядеть следующим образом:
<VirtualHost *:443>
ServerName test.na.xyz.com
DocumentRoot /path/to/your/document/root
SSLEngine on
SSLCertificateFile /path/to/your/cert.pem
SSLCertificateKeyFile /path/to/your/key.pem
ProxyPreserveHost On
ProxyPass /postResponse https://www.efg.com/xyz
ProxyPassReverse /postResponse https://www.efg.com/xyz
</VirtualHost>
В этом случае, когда пользователь запросит https://test.na.xyz.com/postResponse
, Apache будет пересылать этот запрос на удаленный сервер https://www.efg.com/xyz
, сохраняя оригинальное имя хоста в адресной строке браузера.
Заключение
Таким образом, если ваша цель – сохранять отображаемое имя хоста test.na.xyz.com
в адресной строке браузера, вам следует применить ProxyPass
и ProxyPreserveHost
. Использование только RewriteRule
не позволит достичь этой цели, так как оно обеспечит полное перенаправление на другой адрес, что приведет к изменению имени хоста в адресной строке.
Надеюсь, это ответит на ваши вопросы и поможет вам сконфигурировать ваш сервер в соответствии с вашими требованиями. Если у вас будут дополнительные вопросы, пожалуйста, не стесняйтесь задавать их.