Amazon-Web-Services

阻止 Cloudfront 將部分路徑轉發到源伺服器

  • December 22, 2021

背景:example.com我有一個 S3 儲存桶(Origin 1),它使用 Cloudfront 為域下的靜態網站提供服務。

目標:

另外我想example.com/subfolder提供來自second.com(Origin 2)的內容。以下為真example.com/subfolder = second.com

目前:

在 Cloudfront 發行版下,我將 Origin 1 設置為行為Default (*) ,將 Origin 2 設置為行為/subfolder*

問題:

去的時候example.com/subfolder我被送達second.com/subfolder

問: 我將如何以及在何處調整 Cloudfronts 行為以不轉發 URL 的第一部分。

CloudFront 本身並不支持這一點。

原始請求路徑原封不動地轉發到源伺服器,只有一個例外:如果源配置了源路徑,則在將請求發送到源之前將該值添加到路徑的開頭(當然,這沒有幫助,在這裡)。

但是,您可以在 CloudFront 處理期間使用Lambda@Edge源請求觸發器修改路徑。

這種類型的觸發器僅在記憶體未命中時觸發 - 在檢查 CloudFront 記憶體之後但在請求發送到源之前 - 並允許修改將發送到源的請求……包括路徑。來自源的響應(如果可記憶體)儲存在 CloudFront 中瀏覽器最初請求的路徑(不是修改後的路徑)下,因此即使觸發器修改了路徑,記憶體仍然可以正常工作。

從路徑中刪除第一級的觸發程式碼可能如下所示:

'use strict';

exports.handler = (event, context, callback) => {
   const request = event.Records[0].cf.request;           // extract the request object
   request.uri = request.uri.replace(/^\/[^\/]+\//,'/');  // modify the URI
   return callback(null, request);                        // return control to CloudFront
};

我對 Stack Overflow 上一個非常相似的問題的回答中對此進行了更多討論,這是上面程式碼片段的原始來源。它最初是用 Node.js 6.10 編寫的,但仍與 Lambda@Edge 介面兼容,後者現在使用更新版本的 Node.js。或者,如果您願意,也可以用 Python 編寫觸發程式碼。

您可能還需要安排/subfolder重定向到,/subfolder/以便相對於第二個來源的根的路徑正確規範化。

引用自:https://serverfault.com/questions/1001886