我尝试使用 Amazon CloudFront 函数重写或更改传入请求的 URI 路径,但是我在重写 URI 时遇到了问题。
解决方法
您未将 CloudFront 函数与正确的缓存行为相关联
验证您是否将 CloudFront 函数与要修改的请求的正确缓存行为和路径模式设置相关联。如果多个缓存行为匹配相同的请求,则 CloudFront 使用优先级最高的缓存行为。
完成以下步骤:
- 打开 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 不会更改,并允许静态资产请求未经修改地通过。
更改 URL 时 URI 中缺少斜杠
如果您使用 CloudFront 函数缩短或更改 URL,请在 URI 的开头添加正斜杠以接受 URL 请求。
缩短 URL 的 CloudFront 函数示例:
request.uri = '/' + newShortUrl;
return request;
相关信息
重定向到 CloudFront Functions 查看器请求事件中的新 URL
根据 CloudFront Functions 查看器请求事件的 KeyValueStore 配置重写请求 URI