由于 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 服务才能反映虚拟主机。有另一种方法可以做到这一点
- 忽略 .htaccess 文件中的 ELB 健康检查路径,
将 DNS 名称的所有四个部分分开,如下所示
elb_dns_name: elb-name.subnet_zone.elb.amazonaws.com 对于所有剩余的 URL,都有内部重写规则
directory_scructure: code_folder/websiteRewriteEngine 在
RewriteCond %{HTTP_HOST} !$ [NC]
RewriteCond %{REQUEST_URI} !^/index.php$
RewriteRule ^(.*)$ /$1 [L,QSA]
这对我来说非常有效。如果有更好的方法,请提出建议,谢谢!