通过F5代理的子域流量未正确处理

时间:2017-09-11 17:35:45

标签: apache ssl httpd.conf f5

我们服务器上的第二个域名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(本例中的错误是无限重定向循环)。

1 个答案:

答案 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的规则被添加,一切都开始正常工作,现在仍然是。