跳至內容

如何使用 CloudFront 將請求路由到特定原始伺服器?

2 分的閱讀內容
0

我想設定 Amazon CloudFront 發佈項目,以將不同類型的請求路由到特定的原始伺服器。我想根據 URL 路徑將每個請求導向到適當的原始伺服器。

解決方法

定義路徑模式

當您建立 CloudFront 發佈項目時,請定義快取行為。如果定義多個快取行為,則每個行為都必須具有唯一的路徑模式。然後,CloudFront 會依照您在發佈項目中列出的順序,將請求路徑與路徑模式進行比對。

以下範例展示路徑模式如何配對其關聯的請求路徑:

  • /images/* 會配對 /images/cat.jpg/images/dog.png
  • /en/* 會配對 /en/about/en/contact
  • /app1/* 會配對 /app1/index.html,但不會配對 /app1app2/index.html

重要:

  • 路徑模式區分大小寫。例如,/images/cat.jpg 不會配對 /Images/cat.jpg
  • CloudFront 會將 # 字元視為片段識別碼處理,不會將片段識別碼納入路徑模式的配對範圍。建立 CloudFront 函式來配對包含 # 字元的網址。
  • CloudFront 會在配對路徑之前,先對路徑進行標準化。例如,/path//file 會配對模式 /path/

使用多個原始伺服器

預設情況下,每個快取行為中的路徑模式只能關聯一個原始伺服器。

若要將具有相同路徑模式的請求路由至多個原始伺服器,請完成下列步驟:

  1. 使用查詢字串參數來區分您的原始伺服器。例如,使用 /.jpg?origin=origin1/*.jpg?origin=origin2
  2. 為每個想要使用相同路徑模式的原始伺服器建立一個單獨的 CloudFront 發佈項目。
  3. 使用 CloudFront FunctionsLambda@Edge撰寫自訂程式碼,檢查請求並動態地將請求路由到您的原始伺服器。

根據地理位置路由請求

使用 CloudFront 函式檢查 cloudfront-viewer-country 標頭,並根據觀看者的地理位置將請求路由到不同的原始伺服器。

以下範例程式碼展示了一個 CloudFront 函式,可將來自特定國家/地區的請求重新導向到不同快取行為:

function handler(event) {
  var request = event.request;
  var headers = request.headers;
  var country = headers['cloudfront-viewer-country'];

  // List of country codes to route to the first origin
  var allowedCountries = ['US', 'CA'];

  // Create the new URI to redirect to
  var newUri = request.uri.replace('/api/', '/api-geo/');

  if (allowedCountries.includes(country.value)) {
    return request;
  } else {
    var response = {
      statusCode: 302,
      statusDescription: 'Found',
      headers: {
        location: {
          value: newUri
        }
      }
    };
    return response;
  }
}

此函式會檢查觀看者所在的國家/地區是否在 allowedCountries 清單中。如果該國家/地區在清單中,則函式會允許請求繼續執行 /api/ 行為。如果該國家/地區不在清單中,則函式會將請求重新導向到 /api-geo/ 行為。為了執行重新導向,該函式會建立一個新的 URI 並傳回 302 重新導向回應。

防止快取問題

預設情況下,CloudFront 會根據請求 URI 和某些標頭快取回應。如果您使用 CloudFront Functions 或 Lambda@Edge 在請求 URI 或標頭到達原始伺服器之前對其進行修改,則可能會出現快取不一致的情況。

為防止快取問題,請執行下列其中一個動作:

  • 如果您必須在請求到達原始伺服器之前對其進行修改,並且希望保留目前的快取策略,則請使用 Lambda@Edge 函式原始伺服器請求事件必須觸發該函式。最佳實務是將請求修改邏輯移至 Lambda@Edge 函式。該函式必須在原始請求觸發程序上執行該觸發程序會在快取查詢之後觸發。然後,快取鍵將根據來自觀看者的原始請求進行設定。
  • 若要根據特定的請求屬性建立單獨的快取項目,以更好地控制快取,請建立自訂快取政策。在快取鍵中包含額外的請求標頭或查詢字串,以便為不同的請求產生唯一的快取鍵。

如果您變更快取行為,最佳實務是移除 CloudFront 已提供的既有快取檔案。如此一來,您的快取行為更新就能立即生效。

相關資訊

所有發佈項目設定參考

根據查詢字串參數快取內容

利用 Amazon CloudFront 地理位置標頭進行州層級地理定位

AWS 官方已更新 1 年前