搭配 CORS 使用 Azure CDN
什麼是 CORS?
CORS(跨原始來源資源分享)是一項 HTTP 功能,可讓 Web 應用程式在一個網域下執行,以存取另一個網域中的資源。 為了降低跨網站腳本攻擊的可能性,所有新式網頁瀏覽器都會實作稱為 相同原始原則的安全性限制。 此限制可防止網頁在不同的網域中呼叫 API。 CORS 提供安全的方式,允許某個原始來源 (原始網域) 在另一個來源中呼叫 API。
運作方式
CORS 要求有兩種類型: 簡單要求 和 複雜要求。
針對簡單要求:
瀏覽器會傳送具有額外 原始 HTTP 要求標頭的CORS要求。 要求標頭的值是提供父頁面的來源,其定義為通訊協定、網域和埠的組合。當來自嘗試存取 fabrikam.com 來源使用者數據的頁面HTTPS://www.contoso.com時,會將下列要求標頭傳送至 fabrikam.com:
Origin: https://www.contoso.com
伺服器可能會回應下列任一標頭:
Access-Control-Allow-Origin 標頭在其回應中,指出允許哪個原始網站。 例如:
Access-Control-Allow-Origin: https://www.contoso.com
檢查 Origin 標頭之後,如果伺服器不允許跨原始來源要求,則為 403 之類的 HTTP 錯誤碼
Access-Control-Allow-Origin 標頭,具有允許所有來源的通配符:
Access-Control-Allow-Origin: *
針對複雜的要求:
複雜要求是 CORS 要求,在傳送實際的 CORS 要求之前,瀏覽器必須傳送 預檢要求 (也就是初步探查)。 預檢要求會詢問伺服器許可權,如果原始 CORS 要求可以繼續,而且是 OPTIONS
相同 URL 的要求。
提示
如需 CORS 流程和常見陷阱的詳細資訊,請檢視 適用於 REST API 的 CORS 指南。
通配符或單一原始案例
當 Access-Control-Allow-Origin 標頭設定為通配符 \ 或單一原始來源時,Azure CDN 上的 CORS 會自動運作,而不會有額外的設定。 CDN 快取第一個回應和後續要求會使用相同的標頭。
如果在來源上設定 CORS 之前已對 CDN 提出要求,您必須清除端點內容上的內容,才能使用 Access-Control-Allow-Origin 標頭重載內容。
多個原始案例
如果您需要允許 CORS 使用特定的來源清單,事情會變得更複雜一點。 當 CDN 快取第一個 CORS 來源的 Access-Control-Allow-Origin 標頭時,就會發生此問題。 當不同的 CORS 來源提出後續要求時,CDN 會提供快取 的 Access-Control-Allow-Origin 標頭,但不符合。 有數種方式可以修正此問題。
Azure CDN 標準配置檔
在來自 Microsoft 的 Azure CDN Standard 上,您可以在標準規則引擎 中建立規則,以檢查 要求的 Origin 標頭。 如果是有效的原始來源,您的規則會 以所需的值設定 Access-Control-Allow-Origin 標頭。 在此情況下, 會忽略來自檔案源伺服器的 Access-Control-Allow-Origin 標頭,且 CDN 的規則引擎會完全管理允許的 CORS 來源。
提示
您可以將其他動作新增至規則,以修改其他響應標頭,例如 Access-Control-Allow-Methods。
來自 Edgio 的 Azure CDN 進階版
使用 Edgio 進階版 規則引擎,您必須建立規則來檢查要求的 Origin 標頭。 如果是有效的原始來源,您的規則會 以要求中提供的原點設定 Access-Control-Allow-Origin 標頭。 如果不允許在 Origin 標頭中指定的原點,您的規則應該省略 Access-Control-Allow-Origin 標頭,這會導致瀏覽器拒絕要求。
有兩種方式可透過 進階版 規則引擎解決此問題。 在這兩種情況下, 會忽略來自檔案源伺服器的 Access-Control-Allow-Origin 標頭,且 CDN 的規則引擎會完全管理允許的 CORS 來源。
具有所有有效原始來源的一個正則表達式
在此情況下,您會建立包含您想要允許之所有來源的正則表達式:
https?:\/\/(www\.contoso\.com|contoso\.com|www\.microsoft\.com|microsoft.com\.com)$
提示
來自 Edgio 的 Azure CDN 進階版 會使用 Perl 相容的正規表示式作為正則表達式的引擎。 您可以使用正規表示式 101 之類的工具來驗證正規表示式。 請注意,“/” 字元在正則表達式中有效,而且不需要逸出,不過,逸出該字元會被視為最佳做法,而且會由某些 regex 驗證程序預期。
如果正則表達式相符,您的規則會以傳送要求的來源取代 Access-Control-Allow-Origin 標頭(如果有的話)。 您也可以新增額外的 CORS 標頭,例如 Access-Control-Allow-Methods。
每個來源的要求標頭規則。
您可以改為為每個想要使用 要求標頭通配符比對條件的來源建立個別規則,而不是正則表達式。 如同正則表達式方法,僅規則引擎就會設定 CORS 標頭。
提示
在此範例中,使用通配符 * 會告知規則引擎符合 HTTP 和 HTTPS。