当使用 NameVirtualHosts 并重定向到 www 时,我应该如何配置我的 ELB 健康检查?

当使用 NameVirtualHosts 并重定向到 www 时,我应该如何配置我的 ELB 健康检查?

由于 HTTP 健康检查失败,我的 ELB 不断使我的实例停止服务。

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

虚拟主机.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 健康检查是最好的选择吗,或者有没有办法让 HTTP 正常工作?

答案1

这个问题已经在 AWS 论坛上提问答案是设置一个默认虚拟主机,处理裸 IP 地址上的流量,不进行任何重定向。这意味着访问您 IP 地址的普通用户也不会被重定向。

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

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

访问该 URL 的普通用户将不会被重定向。

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

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

欺骗其用户代理的普通用户将不会被重定向。

或者 ELB 的内部 IP 地址。

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

要使此选项有效,您需要mod_rpaf(对于 Apache 2.2)或mod_remoteip(对于 Apache 2.4)修改REMOTE_ADDR变量以包含标头内容的正确部分X-Forwarded-For。只要您正确设置,普通用户就不可能避免重定向响应。

答案2

添加虚拟主机不是一个好主意,因为必须重新启动 httpd 服务才能反映虚拟主机。有另一种方法可以做到这一点

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

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

这对我来说非常有效。如果有更好的方法,请提出建议,谢谢!

相关内容