我们服务器上的第二个域名ws.example.org的流量未正确处理。它不是从第二个域名目录中提供内容,而是从第一个域名条目www.example.org错误地传递出来。
细节:
服务器正在运行Apache 2.2.31,并且位于包含相关域名的SSL证书的F5负载均衡器/代理后面。我们的服务器从F5获得的流量是非加密但仍然在端口443上传送。
默认:443虚拟主机的Apache配置条目已被注释掉。服务器没有安装或可用的任何证书,也不加密任何流量。
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 for example.org并且我们希望强制加密流量,因此正在使用驻留在/ Apache / htdocs中的.htaccess中的以下规则:
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的可见性,但已确保在F5上没有与我们的域相关的iRule。我们尝试将来自F5的流量通过端口80传送到我们的服务器,虽然这部分适用于第二个域名ws.example.org,但它打破了主域www.example.org(本例中的错误是无限重定向循环)。
答案 0 :(得分:0)
解决方案结果是需要在F5和Apache服务器上进行的更改组合。在确保F5仅在端口80上发送流量之后,我们关闭了所有侦听端口443的所有内容。
在F5上需要添加一个iRule来包含告诉Apache协议的标题,以便确定我们是否需要重写为httpS的重写规则可行。添加到F5的iRule是:
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的规则被添加,一切都开始正常工作,现在仍然是。