跳至内容

如何使用 CloudFront 将请求路由到特定源?

2 分钟阅读
0

我想配置我的 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/ 匹配。

使用多个源

默认情况下,在一个缓存行为中,只能将每个路径模式与一个源关联。

要将具有相同路径模式的请求路由到多个源,请完成以下步骤:

  1. 使用查询字符串参数来区分您的源。例如,使用 /.jpg?origin=origin1/*.jpg?origin=origin2
  2. 为要使用相同路径模式的每个源创建单独的 CloudFront 分配。
  3. 使用 CloudFront FunctionsLambda@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 地理位置标头实现州级地理定位)

AWS 官方已更新 7 个月前