根據地理位置,為來自同一域的兩個靜態 S3 網站提供服務
我目前的設置是 www.domain.com 通過 CloudFront 為 S3 託管的靜態網站提供服務,因此 www.domain.com CNAME 指向 CloudFront 分配,而後者又指向 S3 靜態網站 URL。CloudFront 分配已
www.domain.com
設置為備用域名。我想使用 Route53 的地理位置功能將來自北美的請求路由到目前的 CloudFront (A),而所有其他請求都轉到託管另一個 S3 靜態網站的另一個 CloudFront (B)。由於我無法
www.domain.com
為兩個 CloudFront 分配添加備用域名,因此我使用萬用字元*.domain.com
代替 CloudFront A。萬用字元有效,例如
eu.domain.com
我設置正確地為 CloudFront B 站點提供服務。我已經在 Route53 中正確設置了地理位置規則,並
dig
返回了正確的 CloudFront 端點。同樣,Route53 Web 測試平台會根據 IP 位置提供正確的端點。但是,curl
Web 瀏覽器提供了錯誤的內容——即 CloudFront A,即使我在歐盟。我的配置有問題嗎?出於某種原因,是否在 A 發行版的 DNS 級別上進行了靜默故障轉移?還是一些討厭的記憶體?這完全可以做到嗎?謝謝!
然而,curl 和 web 瀏覽器給出了錯誤的內容
實際上,它們在上下文中給出了正確的內容。(堅持我,這裡……)
問題 - 從技術上講 - 是您實際上想要/期望一個實際上不正確的響應 - 如果它實際上按照您所期望的方式工作,那麼根據提出的請求,行為將是錯誤的。
使用 . 查看請求標頭
curl -v
。他們可能正在連接到通過查詢檢索到的地址,eu.example.com
但請檢查此請求標頭:> Host: www.example.com
瀏覽器實際上得到了它所要求的。
這就是您不能將相同的備用域名分配給兩個 CloudFront 分配的原因。CloudFront - 基本上與所有 Web 伺服器一樣 - 使用
Host:
瀏覽器發送的標頭來了解瀏覽器想要查看的站點。Web 伺服器看不到引導您訪問它們的 DNS 路徑。您可以在連接到為不同站點返回的 IP 地址時執行此操作這一事實並不令人驚訝——選擇任何 CloudFront IP 並Host:
為不同站點偽造標頭,這很可能會奏效,因為很有可能偵聽該地址的 CloudFront 設備可以在 CloudFront 中找到配置並為請求提供服務。僅使用 CloudFront 和 Route 53 無法完成此配置。
您需要歐盟目標區域的 EC2 中的代理伺服器充當 DNS 中 eu 域的目標,重寫
Host:
標頭,並將修改後的請求轉發到 CloudFront。