管理 Lightsail 发行版的请求和响应行为 - Amazon Lightsail

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

管理 Lightsail 发行版的请求和响应行为

在本指南中,我们描述了您的 Amazon Lightsail 配送在处理请求并将其转发到您的来源以及处理来自您的来源的响应时的行为方式。有关分配的更多信息,请参阅内容分发网络分配

主题

分配如何处理请求并将请求转发到源

本部分包含有关分配如何处理查看器请求并将请求转发到源的信息。

内容

身份验证

对于 DELETEGETHEADPATCHPOSTPUT 请求,如果配置分配以将 Authorization 标头转发到源,您可以将源服务器配置为请求客户端身份验证。

对于 OPTIONS 请求,您可以将源服务器配置为仅在使用以下分配设置时请求客户端身份验证:

  • 配置分配以将 Authorization 标头转发到源。

  • 配置分配以不缓存对 OPTIONS 请求的响应。

您可以配置分配以使用 HTTP 或 HTTPS 将请求转发到源。

缓存持续时间

要控制对象在分配缓存中保留多长时间后分配将另一请求转发到源,您可以:

  • 配置您的源,以将 Cache-ControlExpires 标题字段添加到每个对象。

  • 对缓存寿命 (TL) 使用默认值 1 天。

有关更多信息,请参阅分配高级设置

客户端 IP 地址

如果查看器将请求发送到您的分配并且不包含 X-Forwarded-For 请求标头,您的分配将通过 TCP 连接获取查看器的 IP 地址,添加包含该 IP 地址的 X-Forwarded-For 标头,并将请求转发到源。例如,如果您的分配通过 TCP 连接获取 IP 地址 192.0.2.2,则它将以下标头转发到源:

X-Forwarded-For: 192.0.2.2

如果查看器将请求发送到您的分配并且包含 X-Forwarded-For 请求标头,分配将通过 TCP 连接获取查看器的 IP 地址,将该 IP 地址附加到 X-Forwarded-For 标头的末尾,并将请求转发到源。例如,如果查看器请求包含 X-Forwarded-For: 192.0.2.4,192.0.2.3,并且您的分配通过 TCP 连接获取 IP 地址 192.0.2.2,则它将以下标头转发到源:

X-Forwarded-For: 192.0.2.4,192.0.2.3,192.0.2.2

一些应用程序(例如,负载均衡器、Web 应用程序防火墙、反向代理、入侵防御系统以及 API Gateway)会将转发请求的分配边缘服务器的 IP 地址附加到 X-Forwarded-For 标头的末尾。例如,如果您的分配在它转发到 ELB 的请求中包含 X-Forwarded-For: 192.0.2.2,并且分配边缘服务器的 IP 地址为 192.0.2.199,则您的实例收到的请求会包含以下标头:

X-Forwarded-For: 192.0.2.2,192.0.2.199

注意

X-Forwarded-For 标头包含 IPv4 地址(例如 192.0.2.44)和 IPv6 地址(例如 2001:0db8:85a3:0000:0000:8a2e:0370:7334)。

客户端 SSL 身份验证

Lightsail 发行版不支持使用客户端 SSL 证书进行客户端身份验证。如果源请求客户端证书,则您的分配将删除请求。

压缩

Lightsail 分发会转发具有Accept-Encoding字段值"identity"和的请求。"gzip"

有条件请求

在您的分配从边缘缓存中收到已过期的对象的请求时,它将请求转发到源以获取对象的最新版本,或者从源中获得分配边缘缓存已具有最新版本的确认。通常,在源最后将对象发送到您的分配时,它在响应中包含 ETag 值和/或 LastModified 值。在您的分配转发到源的新请求中,您的分发将添加以下一项或两项:

  • If-MatchIf-None-Match 标头,其中包括对象过期版本的 ETag 值。

  • If-Modified-Since 标头,其中包含对象过期版本的 LastModified 值。

源使用该信息来确定对象是否已更新,以及是否将整个对象返回到您的分配或只返回 HTTP 304 状态代码 (Not Modified)。

Cookie

您可以配置您的分配以将 Cookie 转发到源。有关更多信息,请参阅分配高级设置

跨源资源共享 (CORS)

如果您希望您的分配采用跨源资源共享设置,请配置源以将 Origin 标头转发到源。

加密

您可以要求查看器使用 HTTPS 连接到您的分配,并要求您的分配使用 HTTP 或 HTTPS 将请求转发到源。

分配使用 SSLv3、TLSv1.0、TLSv1.1 和 TLSv1.2 协议将 HTTPS 请求转发到源。不支持其他版本的 SSL 和 TLS。

包含正文的 GET 请求

如果查看器 GET 请求包含正文,则您的分配会将 HTTP 状态代码 403 (Forbidden) 返回到查看器。

HTTP 方法

如果您将您的分配配置为允许其支持的所有 HTTP 方法,则分配会接受来自查看器的以下请求,并将这些请求转发到您的源:

  • DELETE

  • GET

  • HEAD

  • OPTIONS

  • PATCH

  • POST

  • PUT

分配会始终缓存对 GETHEAD 请求的响应。您也可以将分配配置为缓存对 OPTIONS 请求的响应。分配不缓存对使用其他方法的请求的响应。

有关如何配置是否让源处理这些方法的信息,请参阅该源的文档。

重要

如果将分配配置为接受其支持的所有 HTTP 方法并将这些方法转发到源,请配置源服务器以处理所有方法。例如,如果因为您想使用 POST 而将分配配置为接受并转发这些方法,则必须将您的源服务器配置为适当处理 DELETE 请求,以便查看器无法删除您不希望其删除的资源。有关更多信息,请参阅您的 HTTP 服务器的文档。

HTTP 请求标头和分配行为

下表列出了 HTTP 请求标头,您可以将其转发到源 (有例外情况需要注意)。对于每个标头,该列表会包含有关以下内容的信息:

  • 支持 - 您是否能将分配配置为根据标头的标头值缓存对象。

    您可以将分配配置为根据 DateUser-Agent 标头中的值缓存对象,但我们建议您不要这样做。这些标头具有许多可能的值,并且基于其值的缓存操作会导致分配将更多请求转发到源。

  • 未配置时的行为 - 未配置分配以将标头转发到源(这会导致分配根据标头值缓存您的对象)时的分配行为。

  • 标头 - 其他定义的标头

    支持 - 是

    未配置时的行为 - 分配会将标头转发到源。

  • 标头 - Accept

    支持 - 是

    未配置时的行为 - 分配将删除标头。

  • 标头 - Accept-Charset

    支持 - 是

    未配置时的行为 - 分配将删除标头。

  • 标头 - Accept-Encoding

    支持 - 是

    未配置时的行为 - 如果值包含 gzip,分配会将 Accept-Encoding: gzip 转发到源。如果值不包含 gzip,在将请求转发到源之前, 分配会删除 Accept-Encoding 标头字段。

  • 标头 - Accept-Language

    支持 - 是

    未配置时的行为 - 分配将删除标头。

  • 标头 - Authorization

    支持 - 是

    未配置时的行为

    • GETHEAD 请求 – 在将请求转发到源之前,分配将删除 Authorization 标头字段。

    • OPTIONS 请求 – 如果您将分配配置为缓存对 OPTIONS 请求的响应,则在将请求转发到源之前,分配将删除 Authorization 标头字段。

      如果未将分配配置为缓存 OPTIONS 请求的响应,则分配将 Authorization 标头字段转发到源。

    • DELETEPATCHPOSTPUT 请求 – 在将请求转发到源之前,分配不会删除标头字段。

  • 标头 - Cache-Control

    支持 - 否

    未配置时的行为 - 分配会将标头转发到源。

  • 标头 - CloudFront-Forwarded-Proto

    支持 - 是

    未配置时的行为 - 在将请求转发到源之前, 分配不会添加标头。

  • 标头 - CloudFront-Is-Desktop-Viewer

    支持 - 是

    未配置时的行为 - 在将请求转发到源之前, 分配不会添加标头。

  • 标头 - CloudFront-Is-Mobile-Viewer

    支持 - 是

    未配置时的行为 - 在将请求转发到源之前, 分配不会添加标头。

  • 标头 - CloudFront-Is-Tablet-Viewer

    支持 - 是

    未配置时的行为 - 在将请求转发到源之前, 分配不会添加标头。

  • 标头 - CloudFront-Viewer-Country

    支持 - 是

    未配置时的行为 - 在将请求转发到源之前, 分配不会添加标头。

  • 标头 - Connection

    支持 - 否

    未配置时的行为 - 在将请求转发到源之前, 分配不会将此标头替换为 Connection: Keep-Alive

  • 标头 - Content-Length

    支持 - 否

    未配置时的行为 - 分配会将标头转发到源。

  • 标头 - Content-MD5

    支持 - 是

    未配置时的行为 - 分配会将标头转发到源。

  • 标头 - Content-Type

    支持 - 是

    未配置时的行为 - 分配会将标头转发到源。

  • 标头 - Cookie

    支持 - 否

    未配置时的行为 - 如果将分配配置为转发 Cookie,则它会将 Cookie 标头字段转发到源。如果没有进行此配置,则分配会删除 Cookie 标头字段。

  • 标头 - Date

    支持 - 是,但建议不要这样做

    未配置时的行为 - 分配会将标头转发到源。

  • 标头 - Expect

    支持 - 是

    未配置时的行为 - 分配将删除标头。

  • 标头 - From

    支持 - 是

    未配置时的行为 - 分配会将标头转发到源。

  • 标头 - Host

    支持 - 是

    未配置时的行为 - 分配将值设置为与请求的对象关联的源的域名。

  • 标头 - If-Match

    支持 - 是

    未配置时的行为 - 分配会将标头转发到源。

  • 标头 - If-Modified-Since

    支持 - 是

    未配置时的行为 - 分配会将标头转发到源。

  • 标头 - If-None-Match

    支持 - 是

    未配置时的行为 - 分配会将标头转发到源。

  • 标头 - If-Range

    支持 - 是

    未配置时的行为 - 分配会将标头转发到源。

  • 标头 - If-Unmodified-Since

    支持 - 是

    未配置时的行为 - 分配会将标头转发到源。

  • 标头 - Max-Forwards

    支持 - 否

    未配置时的行为 - 分配会将标头转发到源。

  • 标头 - Origin

    支持 - 是

    未配置时的行为 - 分配会将标头转发到源。

  • 标头 - Pragma

    支持 - 否

    未配置时的行为 - 分配会将标头转发到源。

  • 标头 - Proxy-Authenticate

    支持 - 否

    未配置时的行为 - 分配将删除标头。

  • 标头 - Proxy-Authorization

    支持 - 否

    未配置时的行为 - 分配将删除标头。

  • 标头 - Proxy-Connection

    支持 - 否

    未配置时的行为 - 分配将删除标头。

  • 标头 - Range

    支持 - 是(默认值)

    未配置时的行为 - 分配会将标头转发到源。

  • 标头 - Referer

    支持 - 是

    未配置时的行为 - 分配将删除标头。

  • 标头 - Request-Range

    支持 - 否

    未配置时的行为-> 分配会将标头转发到源。

  • 标头 - TE

    支持 - 否

    未配置时的行为 - 分配将删除标头。

  • 标头 - Trailer

    支持 - 否

    未配置时的行为 - 分配将删除标头。

  • 标头 - Transfer-Encoding

    支持 - 否

    未配置时的行为 - 分配会将标头转发到源。

  • 标头 - Upgrade

    支持-否( WebSocket连接除外)

    行为(如果未配置)-除非您已建立 WebSocket 连接,否则您的分发会删除标题。

  • 标头 - User-Agent

    支持 - 是,但建议不要这样做

    未配置时的行为 - 分配会将此标头字段的值替换为 Amazon CloudFront

  • 标头 - Via

    支持 - 是

    未配置时的行为 - 分配会将标头转发到源。

  • 标头 - Warning

    支持 - 是

    未配置时的行为 - 分配会将标头转发到源。

  • 标头 - X-Amz-Cf-Id

    支持 - 否

    未配置时的行为 - 在将请求转发到源之前,分配会将标头添加到查看器请求。标头值包含一个用于唯一标识请求的加密字符串。

  • 标头 - X-Edge-*

    支持 - 否

    未配置时的行为 - 分配将删除所有 X-Edge-* 标头。

  • 标头 - X-Forwarded-For

    支持 - 是

    未配置时的行为 - 分配会将标头转发到源。

  • 标头 - X-Forwarded-Proto

    支持 - 否

    未配置时的行为 - 分配将删除标头。

  • 标头 - X-Real-IP

    支持 - 否

    未配置时的行为 - 分配将删除标头。

HTTP 版本

分配使用 HTTP/1.1 将请求转发到自定义源。

请求的最大长度与 URL 的最大长度

请求的最大长度,包括路径、查询字符串(如果有)以及标头,是 20480 个字节。

分配将根据请求来构造 URL。此 URL 的最大长度是 8192 个字节。

如果请求或 URL 超出这些最大值,则分配将 HTTP 状态代码 413(请求实体过大)返回到查看器,然后终止与查看器的 TCP 连接。

OCSP Stapling

当查看器提交对象的 HTTPS 请求时,分配或查看器必须与证书颁发机构 (CA) 确认尚未吊销域的 SSL 证书。OCSP Stapling 允许分配验证证书并缓存来自 CA 的响应,这将使客户端无需直接向 CA 验证证书,从而加快证书验证速度。

当分配收到对同一域中对象的大量 HTTPS 请求时,OCSP Stapling 的性能改进会更明显。分配边缘站点中的每个服务器必须提交一个单独的验证请求。在分配收到同一域的大量 HTTPS 请求时,边缘站点中的每个服务器很快将收到来自 CA 的响应,指出它可以在 SSL 握手中“固定”到一个数据包;在查看器认为证书有效时,分配可以提供请求的对象。如果您的分配未在分配边缘站点中产生大量流量,则新请求更有可能定向到尚未向 CA 验证证书的服务器。在这种情况下,查看器将单独执行验证步骤,并且分配服务器将提供对象。该分配服务器还会向 CA 提交验证请求,因此,在它下次收到包含同一域名的请求时,便已获得来自 CA 的验证响应。

持久性连接

当分配收到来自源的响应时,它会尝试将连接保持几秒钟,以防在此时段内有另一个请求到达。保持持久性连接可节省重新建立 TCP 连接以及针对后续请求再次进行 TLS 握手所需的时间。

协议

您的发行版根据 Lightsail 控制台中的 Origin 协议策略字段的值将 HTTP 或 HTTPS 请求转发到源服务器。在 Lightsail 控制台中,选项仅限 HTTP,仅限 HTT P S。

如果您指定仅 HTTP仅 HTTPS,则分配仅使用指定的协议将请求转发到源,而不考虑查看器请求中的协议。

重要

如果分配使用 HTTPS 协议将请求转发到源,并且源服务器返回无效的证书或自签名证书,分配将中断 TCP 连接。

查询字符串

您可配置分配是否将查询字符串参数转发到源。

源连接超时和尝试次数

默认情况下,分配在将错误响应返回给查看器之前等待长达 30 秒(3 次尝试,每次 10 秒)。

源响应超时

源响应超时(也称为源读取超时源请求超时)同时适用于以下两种情况:

  • 分配在将请求转发到源后等待响应的时间长度(以秒为单位)。

  • 分配从收到来自源的响应的一个数据包到收到下一个数据包之间等待的时间长度(以秒为单位)。

分配的行为取决于查看器请求的 HTTP 方法:

  • GETHEAD 请求 – 如果源在响应超时的持续时间内没有响应或停止响应,则分配会中断连接。如果指定的源连接尝试次数超过 1 次,分配将再次尝试获取完整响应。分配最多尝试 3 次,具体取决于源连接尝试次数 设置的值。如果源在最终尝试期间未响应,则在收到对同一个源上的内容的其他请求之前,分配都不会重试。

  • DELETEOPTIONSPATCHPUTPOST 请求 – 如果源在 30 秒内未做出响应,分配将中断连接并且不会再次尝试联系源。如有必要,客户端可以重新提交请求。

同一对象的并行请求 (流量高峰)

如果分配边缘站点收到对象的请求,并且对象当前没有位于缓存中或对象已过期,则分配会立即将请求发送到源。如果遇到流量高峰(即,在源响应第一个请求之前,针对同一对象的其他请求到达边缘站点),分配先短暂中止,然后再将对象的其他请求转发到源。通常,对第一个请求的响应会在对后续请求的响应之前到达分配边缘站点。此短暂中止有助于减少源服务器上的不必要负载。如果其他请求不完全相同(例如,由于将分配配置为根据请求标头或 Cookie 进行缓存),则分配会将所有唯一请求转发到源。

User-agent 标头

如果您希望分配基于用户用来查看内容的设备缓存不同版本的对象,建议您将分配配置为将一个或多个以下标头转发到源:

  • CloudFront-Is-Desktop-Viewer

  • CloudFront-Is-Mobile-Viewer

  • CloudFront-Is-SmartTV-Viewer

  • CloudFront-Is-Tablet-Viewer

根据 User-Agent 标头的值,在将请求转发到源之前,分配会将这些标头的值设置为 truefalse。如果某个设备归入多个类别中,则多个值可能为 true。例如,对于一些平板电脑设备,分配可能将 CloudFront-Is-Mobile-ViewerCloudFront-Is-Tablet-Viewer 设置为 true

您可以将分配配置为根据 User-Agent 标头中的值缓存对象,但我们建议您不要这样做。User-Agent 标头具有许多可能的值,并且根据这些值的缓存操作会导致分配将更多请求转发到源。

如果未将分配配置为根据 User-Agent 标头中的值缓存对象,在将请求转发到源之前,分配将添加具有以下值的 User-Agent 标头:

User-Agent = Amazon CloudFront

无论来自查看器的请求是否包含 User-Agent 标头,分配都会添加该标头。如果来自查看器的请求包含 User-Agent 标头,分配将删除该标头。

分配如何处理来自源的响应

本部分包含分配如何处理来自源的响应的相关信息。

内容

100-Continue 响应

源不能向分配发送多个 100-Continue 响应。在第一个 100-Continue 响应之后,分配需要 HTTP 200 OK 响应。如果源在第一个 100-Continue 响应之后又发送了该响应,分配将返回错误。

缓存

  • 确保源为 DateLast-Modified 标头字段设置有效、准确的值。

  • 如果来自查看器的请求包含 If-MatchIf-None-Match 请求标头字段,请设置 ETag 响应标头字段。如果未指定 ETag 值,分配将忽略随后的 If-MatchIf-None-Match 标头。

  • 分配通常采用来自源的响应中的 Cache-Control: no-cache 标头。有关例外的信心,请参阅同一对象的并行请求(流量高峰)

已取消的请求

如果对象没有位于边缘缓存中,或者在分配从源中获取对象后,查看器便终止了会话(例如,关闭浏览器)而没来得及传送请求的对象,则分配不会将该对象缓存在边缘站点中。

内容协商

如果您的源在响应中返回 Vary:*,并且相应缓存行为的最小 TTL 的值为 0,则分配将缓存对象,但仍会将对象的每个后续请求转发到源以确认缓存包含最新版本的对象。分配不包含任何条件标头,例如 If-None-MatchIf-Modified-Since。因此,源会将对象返回到分配以响应每个请求。

如果您的来源在响应Vary:*中返回,并且相应缓存行为的最小 TTL 值为任何其他值,则会按照分配删除或替换的 HTTP 响应标Vary头中所述 CloudFront 处理标头。

Cookie

如果您为缓存行为启用了 Cookie,并且如果源返回带对象的 Cookie, 则分配将缓存对象和 Cookie。请注意,这会降低对象的缓存能力。

中断的 TCP 连接

在源将对象返回到分配时,如果分配和源之间的 TCP 连接中断, 分配行为将取决于源是否在响应中包含 Content-Length 标头:

  • Content-Length 标头 – 分配在从源中获取对象时,会将对象返回到查看器。但是,如果 Content-Length 标头值与对象大小不匹配,则分配不会缓存对象。

  • Transfer-Encoding: Chunked – 分配在从源中获取对象时,会将对象返回到查看器。但是,如果分块响应未完成,则分配不会对该对象进行缓存。

  • 无 Content-Length 标头 – 分配将对象返回到查看器并进行缓存,但该对象可能不完整。在无 Content-Length 标头的情况下,分配无法确定 TCP 连接是偶然中断还是有意中断。

我们建议您配置您的 HTTP 服务器,以添加 Content-Length 标头,防止分配缓存部分对象。

分配删除或替换的 HTTP 响应标头

在将来自源的响应转发到查看器之前,分配将删除或更新以下标头字段:

  • Set-Cookie – 如果将分配配置为转发 Cookie,则会将 Set-Cookie 标头字段转发到客户端。

  • Trailer

  • Transfer-Encoding – 如果源返回该标头字段,在将响应返回到查看器之前,分配会将值设置为 chunked

  • Upgrade

  • Vary – 请注意以下几点:

    • 如果您将分配配置为将任何设备特定的标头转发到您的源 (CloudFront-Is-Desktop-ViewerCloudFront-Is-Mobile-ViewerCloudFront-Is-SmartTV-ViewerCloudFront-Is-Tablet-Viewer),并且您将源配置为将 Vary:User-Agent 返回给分配,则分配会将 Vary:User-Agent 返回给查看器。

    • 如果配置源以将 Accept-EncodingCookie 包含在 Vary 标头中,则分配会将这些值包含在对查看器的响应中。

    • 如果您将分配配置为将标题的允许列表转发到您的源,并且将源配置为在标题中将标头名称返回给您的分发(例如,Vary:Accept-Charset,Accept-Language),则您的分配会将包含这些值的Vary标题返回给查看者。Vary

    • 有关分配如何处理 Vary 标头中的 * 值的信息,请参阅内容协商

    • 如果配置源以将任何其他值包含在 Vary 标头中,在将响应返回到查看器之前,分配将删除这些值。

  • Via – 在对查看器的响应中,分配会将值设置为以下内容:

    Via: http-version alphanumeric-string.cloudfront.net (CloudFront)

    例如,如果客户端通过 HTTP/1.1 发出请求,该值类似于如下所示:

    Via: 1.1 1026589cc7887e7a0dc7827b4example.cloudfront.net (CloudFront)

最大文件大小

分配将返回到查看器的响应正文最大为 20 GB 大小。这包括未指定 Content-Length 标头值的分块传输响应。

源不可用

如果源服务器不可用,并且分配收到位于边缘缓存中但已过期的对象的请求(例如,由于在 Cache-Control max-age 指令中指定的期限已过),分配将提供该对象的已过期版本或提供自定义错误页面。

某些情况下,将逐出很少被请求的对象且不再在边缘缓存中提供。分配不能提供已被逐出的对象。

重新导向

如果更改对象在源服务器上的位置,您可以配置 Web 服务器以重新导向请求到新位置。在您配置重新导向后,查看器第一次提交对象请求时, 分配会将请求发送到源,源则响应重新导向(例如 302 Moved Temporarily)。分配缓存重新导向并将其返回给查看器。您的分配不会遵照重新导向。

您可以配置 Web 服务器以将请求重新导向到以下位置之一:

  • 对象在源服务器上的新 URL。在查看器进行重新导向以访问新的 URL 时,查看器将绕过分配,直接到达源。因此,我们建议您不要将请求重新导向到对象在源上的新 URL。

  • 对象新的分配 URL。当查看器提交包含新分配 URL 的请求时,分配将从源上的新位置获取对象,并将其缓存在边缘站点中,然后将该对象返回到查看器。对象随后的请求将由边缘站点提供。这避免了查看器从源请求对象相关的延迟和负载。但是,对象的每个新请求将产生两个分配请求的费用。

传输编码

Lightsail 发行版仅支持标chunked题的Transfer-Encoding值。如果源返回 Transfer-Encoding: chunked,则分配在边缘站点中收到对象后将该对象返回到客户端,然后以分块格式缓存该对象以提供给后续请求。

如果查看器发出 Range GET 请求,并且源返回Transfer-Encoding: chunked ,则分配会将整个对象返回到查看器,而不是请求的范围。

如果无法预先确定响应的内容长度,建议您使用分块编码。有关更多信息,请参阅中断的 TCP 连接