跳至內容

當我使用 CloudFront Functions 時,如何對 URI 重寫問題進行疑難排解?

1 分的閱讀內容
0

我嘗試使用 Amazon CloudFront Functions 來重寫或變更傳入請求的 URI 路徑,但在 URI 重寫時遇到問題。

解決方案

您未將 CloudFront 函數與正確的快取行為建立關聯

確認您已將 CloudFront 函數與正確的快取行為路徑模式設定關聯,以修改您想要的請求。如果有多個快取行為符合相同的請求,CloudFront 將使用優先順序最高的那一個。

請完成下列步驟:

  1. 開啟 CloudFront console (CloudFront 主控台)。
  2. 在導覽窗格中,選擇 Distributions (發佈項目),然後選取您的發佈項目。
  3. 選擇 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

AWS 官方已更新 4 個月前