我嘗試使用 Amazon CloudFront Functions 來重寫或變更傳入請求的 URI 路徑,但在 URI 重寫時遇到問題。
解決方案
您未將 CloudFront 函數與正確的快取行為建立關聯
確認您已將 CloudFront 函數與正確的快取行為及路徑模式設定關聯,以修改您想要的請求。如果有多個快取行為符合相同的請求,CloudFront 將使用優先順序最高的那一個。
請完成下列步驟:
- 開啟 CloudFront console (CloudFront 主控台)。
- 在導覽窗格中,選擇 Distributions (發佈項目),然後選取您的發佈項目。
- 選擇 Behaviors (行為) 索引標籤,然後檢查每個行為的路徑模式。
CloudFront 函數執行後 URI 路徑不相符
檢查您的 CloudFront Functions 日誌是否有「URI path mismatch」錯誤。如果收到此錯誤,代表函數執行後重寫的 URI 路徑與預期格式不符。
檢查 CloudFront 函數程式碼,確保它正確更改 URI 路徑。URI 路徑不得包含錯誤字元,且必須包含前置正斜線 (/)。
URI 路徑範例:
/analytics.js/v1/xT5Qstsd35FL5WgikA1ABwyCQUDDYPHx/analytics.min.js';
如需了解更多資訊,請參閱檢視 CloudFront 及邊緣函數指標。
SSL 憑證與來源及請求的網域不符
當 CloudFront 函數重寫主機標頭值後,若它不再與 SSL 憑證的網域相符,便會發生此問題。CloudFront 函數接著會將請求轉發到與 SSL 憑證中網域不同的網域。
若要解決此問題,請修改 CloudFront 函數,將主機標頭值重寫為與來源的 SSL 憑證網域相符。
例如,如果來源的 SSL 憑證使用 example.com,但請求的網域是 www.example.com,則在 CloudFront 函數中加入以下程式碼:
request.headers['host'] = ['example.com'];
主機標頭在將請求轉發到來源之前,會先重寫為 example.com。
SPA 部署中的 URI 不正確
如果您透過 CloudFront 部署單頁應用程式 (SPA),請檢查是否需要重寫請求以提供 index.html 檔案 (靜態資產除外)。例如,請求不會檢查 JavaScript 或 CSS 等靜態資產。
在 CloudFront 函數中使用以下程式碼,以檢查 URI 中的檔案副檔名或結尾斜線:
function handler(event) {
var request = event.request;
var uri = request.uri;
// Check whether the URI is missing a file name or a file extension.
if (uri.endsWith('/') || !uri.includes('.')) {
request.uri = '/index.html';
}
return request;
}
如果請求來自 SPA,則將 URI 重寫為 /index.html。如果請求不是來自 SPA,則 URI 不會更改,靜態資產的請求可以不受修改地通過。
在變更網址時 URI 缺少斜線
如果您使用 CloudFront 函數縮短或更改網址,請在 URI 開頭加入正斜線以接受網址請求。
用於縮短網址的 CloudFront 函數範例:
request.uri = '/' + newShortUrl;
return request;
相關資訊
在 CloudFront Functions 檢視器請求事件中重新導向至新網址
根據 KeyValueStore 組態重寫 CloudFront Functions 檢視器請求事件的 URI