簡體   English   中英

AWS CloudFront 重定向到 S3 存儲桶

[英]AWS CloudFront redirecting to S3 bucket

我創建了一個 CloudFront 分配來為靜態網站提供服務。 S3 是原始服務器。 現在,如果我們訪問 CloudFront URL,它會重定向到 S3 位置。

d2s18t7gwlicql.cloudfront.nettest.telekha.in

在瀏覽器中顯示https://telekha-test-www.s3.ap-south-1.amazonaws.com/index.html#/dashboard

我期待https://test.telekha.in/#/dashboard

如果我通過 curl 訪問https://test.telekha.in它會返回我的index.html文檔

如果我通過 curl 訪問http://test.telekha.in它返回

<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>CloudFront</center>
</body>
</html>

但是在瀏覽器中,HTTP 和 HTTPS 都重定向到https://telekha-test-www.s3.ap-south-1.amazonaws.com/index.html#/

請讓我知道如何解決此問題。

快速解決方案

使用 S3 存儲桶的區域域名來配置 CloudFront 分配的來源,例如: {bucket-name}.s3.{region}.amazonaws.com


說明

根據 AWS 開發人員論壇上的討論: Cloudfront 域重定向到 S3 源 URL ,為新創建的 S3 存儲桶創建和傳播 DNS 記錄需要時間。 對於在美國東部(弗吉尼亞北部)區域創建的存儲桶,此問題不可見,因為該區域是默認區域(后備)。

每個 S3 存儲桶有兩個域名,一個是全局的,一個是區域的,即:

  • 全球{bucket-name}.s3.amazonaws.com
  • 區域- {bucket-name}.s3.{region}.amazonaws.com

如果您將 CloudFront 分配配置為使用全局域名,您可能會遇到此問題,因為 DNS 配置需要時間。

但是,您可以首先在源配置中使用區域域名來避免此 DNS 問題。


CloudFormation 模板

如果您使用 CloudFormation,則可以使用AWS::S3::Bucket資源的RegionalDomainName輸出屬性:

S3Bucket:
  Type: AWS::S3::Bucket

CloudFrontDistribution:
  Type: AWS::CloudFront::Distribution
  Properties:
    DistributionConfig:
      Origins:
        - DomainName: !GetAtt S3Bucket.RegionalDomainName

更多信息

同樣,我強烈建議閱讀這篇關於 S3 不同路徑格式未來的博客文章:

我發現了這個問題。 它具有雲前端配置。 這個博客幫助了我。

在定義原點時,我直接選擇了 S3 存儲桶。 我們應該像 Telekha-test-www.s3-website.ap-south-1.amazonaws.com 這樣輸入 S3 存儲桶的域

要檢查您是否認為自己看到了這一點,首先要運行下面的 curl 命令。 如果它返回HTTP/1.1 307 Temporary Redirect ,那么您就會看到這個問題。

$ curl -I https://YOUR_CF_DOMAINNAME.cloudfront.net/

HTTP/1.1 307 Temporary Redirect
Content-Type: application/xml
Content-Length: 0
Connection: keep-alive
x-amz-bucket-region: ap-southeast-2
Location: http://yourS3bucketname.s3-ap-southeast-2.amazonaws.com/
Date: Wed, 12 Jul 2017 00:20:27 GMT
Server: AmazonS3
Age: 1775
X-Cache: Hit from cloudfront
Via: 1.1 someid.cloudfront.net (CloudFront)
X-Amz-Cf-Id: someguid==

我發現這個問題的最佳描述是:

S3 更新了全局 REST 端點層次結構 *.s3.amazonaws.com 的 DNS,並在創建存儲桶后的短時間內將請求發送到存儲桶的正確區域,而 CloudFront 似乎依賴於此將請求發送到右側地方。 在初始更新完成之前,S3 將返回一個重定向,而 CloudFront 將該重定向返回到瀏覽器。 ~邁克爾-sqlbot

鑒於此問題實際上是由於在 S3 中配置存儲桶時發生的 S3 存儲桶名稱的內部 DNS 傳播(並非 100% 明確,但似乎很有可能),那么應該可以通過配置來避免此問題在配置 Cloudfront 發行版之前,在 S3 中創建一個公共網站,並根據doco將 S3 公共網站名稱配置為 Cloudfront 來源,而不是 s3 存儲桶名稱。

作為參考,我將 S3 存儲桶名稱和 S3 網站名稱都配置為 Cloudfront 來源,我可以說它們都可以工作! (最終?)

參考資料:

事實證明,這只是一個時間問題,如果一切配置正確,它會在一段時間后自行修復。 可以在AWS 論壇主題中找到更多信息。

當前接受的答案和鏈接的博客文章建議為您的 S3 存儲桶啟用靜態網站,然后更改 CF 原點以指向該靜態網站。 此解決方案確實解決了重定向問題,但副作用是您的網站現在可以使用 CF URL 或自定義 CNAME 以及使用 S3 URL 訪問。

為了擴展已接受的答案,參考博客文章末尾的這一部分特別有用:

幾天前我發現了一個微妙的“錯誤”:當使用像 www.example.com/about/ 這樣的 URL 時,Amazon S3 實際上會返回文件夾內的“index.html”文件(因為它被配置為靜態網站存儲桶)。

有趣的是,如果省略尾部斜杠 (www.example.com/about),S3 將首先檢查名為“about”的對象是否存在。 如果不是,它會認為 about 是一個文件夾,並會發出 301 重定向到 about/。 使用 CloudFront 時,這意味着 CloudFront 實際上會緩存……重定向而不是文件本身! 因此,您必須確保所有 URL 都以斜杠結尾,以避免無用的重定向。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM