阻止 Cloudfront 將部分路徑轉發到源伺服器
背景:
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/
以便相對於第二個來源的根的路徑正確規範化。