我想配置我的 Amazon CloudFront 分配,以将不同类型的请求路由到特定的原始服务器。我想根据 URL 路径将每个请求定向到相应的源。
解决方法
定义路径模式
创建 CloudFront 分配时,请定义缓存行为。如果您定义了多个缓存行为,则每个行为都必须具有唯一的路径模式。然后,CloudFront 会按照您在分配中列出的路径模式顺序,将请求路径与路径模式进行匹配。
以下示例显示了路径模式如何匹配其关联的请求路径:
- /images/* 可匹配 /images/cat.jpg 和 /images/dog.png
- /en/* 可匹配 /en/about 和 /en/contact
- /app1/* 可匹配 /app1/index.html,但不匹配 /app1app2/index.html
重要事项:
- 路径模式区分大小写。例如,/images/cat.jpg 与 /Images/cat.jpg 不匹配。
- CloudFront 会将 # 字符作为片段标识符进行处理,且在路径模式匹配时不包含片段标识符。创建 CloudFront 函数以匹配包含 # 字符的 URL。
- CloudFront 会在匹配路径之前对路径进行标准化处理。例如,/path//file 与模式 /path/ 匹配。
使用多个源
默认情况下,在一个缓存行为中,只能将每个路径模式与一个源关联。
要将具有相同路径模式的请求路由到多个源,请完成以下步骤:
- 使用查询字符串参数来区分您的源。例如,使用 /.jpg?origin=origin1 和 /*.jpg?origin=origin2。
- 为要使用相同路径模式的每个源创建单独的 CloudFront 分配。
- 使用 CloudFront Functions 或 Lambda@Edge 编写自定义代码,以检查请求并将请求动态路由到您的源。
基于地理位置路由请求
使用 CloudFront 函数检查 cloudfront-viewer-country 标头,并根据查看器的地理位置将请求路由到不同的源。
以下示例代码显示了一个 CloudFront 函数,该函数可将来自特定国家/地区的请求重定向至不同的缓存行为:
function handler(event) {
var request = event.request;
var headers = request.headers;
var country = headers['cloudfront-viewer-country'];
// List of country codes to route to the first origin
var allowedCountries = ['US', 'CA'];
// Create the new URI to redirect to
var newUri = request.uri.replace('/api/', '/api-geo/');
if (allowedCountries.includes(country.value)) {
return request;
} else {
var response = {
statusCode: 302,
statusDescription: 'Found',
headers: {
location: {
value: newUri
}
}
};
return response;
}
}
该函数会检查查看器所在的国家/地区是否在 allowedCountries 列表中。如果该国家/地区在列表中,则该函数会允许请求继续访问 /api/ 行为。如果该国家/地区不在列表中,则该函数会将请求重定向至 /api-geo/ 行为。为执行重定向,该函数会创建一个新的 URI 并返回 302 重定向响应。
防止缓存问题
默认情况下,CloudFront 会根据请求 URI 和特定标头缓存响应。如果您在请求到达源之前使用 CloudFront Functions 或 Lambda@Edge 修改请求 URI 或标头,则可能会出现缓存不一致的情况。
为防止出现缓存问题,请执行以下操作之一:
- 如果您必须仅在请求到达源之前修改请求,且希望保留当前的缓存策略,请使用 Lambda@Edge 函数。该函数必须由源请求事件触发。最佳做法是将请求修改逻辑移至 Lambda@Edge 函数。该函数必须在缓存查找后激活的源请求触发器上运行。然后,缓存键将基于来自查看器的原始请求。
- 要根据特定的请求属性创建单独的缓存条目,以更好地控制缓存,请创建自定义缓存策略。在缓存键中包含额外的请求标头或查询字符串,以便不同的请求拥有唯一的缓存键。
如果您更改缓存行为,则最佳做法是删除 CloudFront 已提供的现有缓存文件。然后,您的缓存行为更新可立即生效。
相关信息
所有分配设置参考
根据查询字符串参数缓存内容
Leverage Amazon CloudFront geolocation headers for state level geo-targeting(利用 Amazon CloudFront 地理位置标头实现州级地理定位)