在使用NameVirtualHosts并redirect到www时,如何configuration我的ELB健康检查?

我的ELB不断让我的实例退出服务,因为HTTP健康检查失败。

我们有一个DNS通配符,并将所有内容redirect到www:

vhost.conf:

ServerName www.example.com ServerAlias *.example.com RewriteEngine on RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC] RewriteRule ^ http://www.example.com/$1 [R=301,L] 

这适用于实际的浏览器,但HTTP健康检查/失败,大概是因为它得到了302。

是使用TCP健康检查的最佳select,还是有办法让HTTP工作?

这个问题已经在AWS论坛上提出,答案是设置一个默认的虚拟主机来处理裸IP地址上的stream量,并且不会做任何redirect。 这将意味着打IP地址的普通用户也不会被redirect。

您也可以指定您希望ELB请求的URL的path部分,并通过添加另一个RewriteCond来忽略该path:

 RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC] RewriteCond %{REQUEST_URI} !^/health-check$ RewriteRule ^ http://www.example.com/$1 [R=301,L] 

访问该URL的普通用户将不会被redirect。

您也可以使用相同的技术来检测ELB的用户代理。

 RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC] RewriteCond %{HTTP_USER_AGENT} !^ELB-HealthChecker RewriteRule ^ http://www.example.com/$1 [R=301,L] 

欺骗用户代理的普通用户不会被redirect。

或ELB的内部IP地址。

 RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC] RewriteCond %{REMOTE_ADDR} !^10\. RewriteRule ^ http://www.example.com/$1 [R=301,L] 

要使此选项mod_rpaf ,您将需要mod_rpaf (用于Apache 2.2)或mod_remoteip (用于Apache 2.4)来修改REMOTE_ADDRvariables以包含X-Forwarded-For标头内容的正确部分。 只要你正确地设置了它,普通用户就不可能避免redirect响应。

添加虚拟主机不是一个好主意,因为必须重新启动虚拟主机的httpd服务才能得到体现。 有一个替代的方法来做到这一点

  1. 忽略.htaccess文件中的ELB健康检查path
    将dns名称的所有四个部分分开,如下所示
    elb_dns_name:elb-name.subnet_zone.elb.amazonaws.com
  2. 对于所有其余的url都有内部重写规则
    directory_scructure:code_folder /网站

    RewriteEngine On
    RewriteCond%{HTTP_HOST}!$ [NC]
    RewriteCond%{REQUEST_URI}!^ / index.php $
    RewriteRule ^(。*)$ / $ 1 [L,QSA]

这对我来说工作得很好。 请build议如果有更好的方法欢呼!