天天看點

AWS CloudFront CDN + S3 CORS 跨域通路的問題

在研究 https://observablehq.com/

的載入資料的時候,我們會發現如果你資料存在 S3 上使用 CloudFront 作為 CDN 的時候,你會發現資料庫載入不進去。

提示錯誤:data6 = TypeError: Failed to fetch

實際上 F12 後,你會發現錯誤資訊為:

Access to fetch at '

https://cdn.ossez.com/json/covid19/covid19-current.json ' from origin ' https://dakoop.static.observableusercontent.com

' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

這個是提示跨域錯誤,顯然這格式 AWS 的配置問題。

如何解決問題?

AWS CloudFront CDN + S3 CORS 跨域通路的問題

是否有跨域通路問題。

你可以在 cmd 中運作下面的指令進行确認:

curl -H "origin: example.com" -v "https://cdn.ossez.com/json/covid19/covid19-current.json"

如果沒有傳回需要的資料,那麼說明你的 AWS 設定了跨域通路限制:

AWS CloudFront CDN + S3 CORS 跨域通路的問題

因為上面的限制,你需要調整 CloudFront 和 S3。

CloudFront

找到你的分發,然後找到你的要的 Behaviors,然後選擇後進行編輯。

AWS CloudFront CDN + S3 CORS 跨域通路的問題

要從您的 CloudFront 配置設定轉發标頭,請執行以下步驟:

從 CloudFront 控制台打開配置設定。

選擇行為頁籤。

選擇建立行為,或者選擇現有行為,然後選擇編輯。

在基于所選的請求标頭進行緩存中,選擇白名單。

在将标頭列入白名單下,從左側菜單中選擇标頭,然後選擇添加。

選擇是,編輯。

注意:另外,請務必将标頭作為請求的一部分轉發到源。

CloudFront 配置設定的緩存行為允許 OPTIONS 請求

如果更新 CORS 政策并将相應的标頭列入白名單後仍顯示錯誤,請嘗試在配置設定的緩存行為中允許 OPTIONS HTTP 方法。預設情況下,CloudFront 隻允許 GET 和 HEAD 方法,但某些 Web 浏覽器可能會發出 OPTIONS 方法的請求。

要在 CloudFront 配置設定中啟用 OPTIONS 方法,請執行以下步驟:

對于允許的 HTTP 方法,選擇 GET、HEAD、OPTIONS。

并進行下面的配置:

AWS CloudFront CDN + S3 CORS 跨域通路的問題

S3

針對 S3 你需要針對使用的 Bucket 設定 CORS 配置。

下面的配置,表示是針對所有的域名運作進行通路。

<?xml version="1.0" encoding="UTF-8"?>

<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>           

儲存後就可以進行測試了。

CloudFlare

如果你還使用了 CloudFlare 為緩存或者 CDN 或者 DNS 的話,你需要 Purge 所有頁面。

要不然還是可能因為 CloudFlare 的緩存而通路不了。

測試方法

因為很多公司都會使用多重緩存的方式對内容進行處理。

這裡我們需要依次确定 S3 的 CORS 已經設定好了,然後确定 CloudFront 的 CORS 已經設定好。

可以先在 S3 中設定某一個檔案為 Public 然後運作指令:

curl -H "origin: example.com" -v "https://s3.us-east-2.amazonaws.com/com.ossez/json/covid19/covid19-current.json"

上面的指令是從 S3 中拉取資料,如果能夠傳回資料則表明 S3 的 CORS 沒有問題。

當 S3 沒有問題的時候,可以開始确定 CloudFront 的配置沒有問題。

運作指令:

curl -H "origin: example.com" -v "d2t9w2kkwoel2v.cloudfront.net/json/covid19/covid19-current.json"

确定能夠傳回正常的資料。

如果能通路資料則說明 CloudFront CORS 沒有問題。

在 DNS 中,你可能設定了 CNAME,但是你可能通過域名通路不了,那有可能是你 DNS 的緩存的問題。

你需要找到 DNS 配置後重新重新整理 DNS 的頁面緩存和heard 緩存。

例如,我們使用 CloudFlare 的 DNS 的 Purge 所有頁面。

然後進行測試:

如果能夠傳回正确的資料,則說明所有的配置已經完成了。

https://www.cwiki.us/display/SpringBootZH/questions/57939099