Apache-2.2

使用 NameVirtualHosts 並重定向到 www 時,我應該如何配置我的 ELB 健康檢查?

  • May 21, 2014

我的 ELB 不斷讓我的實例停止服務,因為 HTTP 執行狀況檢查失敗。

我們有一個 DNS 萬用字元,並將所有內容重定向到 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 健康檢查的最佳選擇,還是有辦法讓 HTTP 工作?

這個問題已在 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。只要您正確設置,普通使用者就不可能避免重定向響應。

引用自:https://serverfault.com/questions/470015