跳至内容

如何解决使用 CloudFront 函数时遇到的 URI 重写问题?

2 分钟阅读
0

我尝试使用 Amazon CloudFront 函数重写或更改传入请求的 URI 路径,但是我在重写 URI 时遇到了问题。

解决方法

您未将 CloudFront 函数与正确的缓存行为相关联

验证您是否将 CloudFront 函数与要修改的请求的正确缓存行为路径模式设置相关联。如果多个缓存行为匹配相同的请求,则 CloudFront 使用优先级最高的缓存行为。

完成以下步骤:

  1. 打开 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 不会更改,并允许静态资产请求未经修改地通过。

更改 URL 时 URI 中缺少斜杠

如果您使用 CloudFront 函数缩短或更改 URL,请在 URI 的开头添加正斜杠以接受 URL 请求。

缩短 URL 的 CloudFront 函数示例:

request.uri = '/' + newShortUrl;
return request;

相关信息

重定向到 CloudFront Functions 查看器请求事件中的新 URL

根据 CloudFront Functions 查看器请求事件的 KeyValueStore 配置重写请求 URI

AWS 官方已更新 9 个月前