Неправильно обрабатывается трафик субдомена через прокси F5
Трафик на второе доменное имя на нашем сервере, ws.example.org, обрабатывается неправильно. Вместо доставки контента из 2-го каталога доменных имен, он неправильно доставляется из 1-й записи доменного имени www.example.org.
Детали:
Сервер работает под управлением Apache 2.2.31 и находится за балансировщиком нагрузки F5 / прокси, который содержит сертификат SSL для рассматриваемых доменных имен. Трафик, который получает наш сервер от F5, НЕ зашифрован, но все еще доставляется через порт 443.
Запись конфигурации Apache для виртуального хоста 443 закомментирована. На сервере нет установленных или доступных сертификатов, и он не шифрует трафик.
Соответствующее содержание httpd.conf:
Listen 80
Listen 443
NameVirtualHost *:80
<VirtualHost *:80>
ServerName www.example.org
ServerAlias example.org
DocumentRoot /Apache/htdocs
<Directory "/Apache/htdocs">
Options FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName ws.example.org
DocumentRoot "/Apache/htdocs/WebServices"
<Directory "/Apache/htdocs/WebServices">
AllowOverride All
</Directory>
</VirtualHost>
Поскольку мы хотим принудительно использовать www для example.org И мы хотим принудительно шифровать трафик, используются следующие правила в.htaccess, который находится в /Apache/htdocs:
RewriteEngine On
# force www
RewriteCond %{HTTP_HOST} ^example.org [NC]
RewriteRule ^(.*)$ https://www.example.org/$1 [L,R=301]
# force HTTPS for everything
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
У меня нет доступа к F5, но я уверен, что iRules не существует, связанные с нашим доменом на F5. Мы попытались доставить трафик с F5 на наш сервер через порт 80, и хотя это частично работает для 2-го доменного имени, ws.example.org, он нарушает основной домен www.example.org (ошибка в этом случае была бесконечный цикл перенаправления).
1 ответ
Решение оказалось комбинацией изменений, которые нужно было сделать как на F5, так и на сервере Apache. На Apache мы отключили все прослушивания порта 443, убедившись, что F5 только отправляет трафик на порт 80.
На F5 нужно было добавить iRule, чтобы включить заголовок, который сообщал Apache, что это за протокол, чтобы правило перезаписи определяло, нужно ли нам переписывать на httpS. IRule, добавленный к F5, был:
when CLIENT_ACCEPTED {
if { [PROFILE::exists clientssl] } then {
set client_protocol "https"
} else {
set client_protocol "http"
}
}
when HTTP_REQUEST {
HTTP::header insert "X-Forwarded-For" [IP::client_addr]
HTTP::header insert "X-Forwarded-Proto" $client_protocol
HTTP::header insert "X-Forwarded-Port" [TCP::client_port]
}
Единственное правило, которое нам было нужно из группы 3 выше, это правило для X-Forwarded-Proto
Как только правило для F5 было добавлено, все начало работать правильно и все еще сегодня.