搭配 CORS 使用 Azure CDN

什麼是 CORS?

CORS(跨原始來源資源分享)是一項 HTTP 功能,可讓 Web 應用程式在一個網域下執行,以存取另一個網域中的資源。 為了降低跨網站腳本攻擊的可能性,所有新式網頁瀏覽器都會實作稱為 相同原始原則的安全性限制。 此限制可防止網頁在不同的網域中呼叫 API。 CORS 提供安全的方式,允許某個原始來源 (原始網域) 在另一個來源中呼叫 API。

運作方式

CORS 要求有兩種類型: 簡單要求複雜要求。

針對簡單要求:

  1. 瀏覽器會傳送具有額外 原始 HTTP 要求標頭的CORS要求。 要求標頭的值是提供父頁面的來源,其定義為通訊協定、網域埠的組合當來自嘗試存取 fabrikam.com 來源使用者數據的頁面HTTPS://www.contoso.com時,會將下列要求標頭傳送至 fabrikam.com:

    Origin: https://www.contoso.com

  2. 伺服器可能會回應下列任一標頭:

    • 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。