

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 新增 CloudFront 請求標頭
<a name="adding-cloudfront-headers"></a>

您可以設定 CloudFront，將特定的 HTTP 標頭新增到 CloudFront 從檢視者接收到的請求，並轉送至您的原始伺服器或[邊緣函數](edge-functions.md)。這些 HTTP 標頭的值皆基於檢視者請求的特性。標頭提供有關檢視器的裝置類型、IP 位址、地理位置、請求通訊協定 (HTTP 或 HTTPS)、HTTP 版本、TLS 連線詳細內容以及 [JA3 指紋](https://github.com/salesforce/ja3)與 JA4 指紋。您也可以設定分佈的快取行為來轉送 WebSocket 標頭。如需詳細資訊，請參閱[使用 WebSockets 搭配 CloudFront 分佈](distribution-working-with.websockets.md)。

有了這些標題，您的原始伺服器或邊緣函數即可接收有關檢視器的資訊，而不需要您編寫自己的程式碼來判斷此資訊。如果您的原始伺服器根據這些標頭中的資訊傳回不同的回應，則可以將它們包含在*快取金鑰*中，以便 CloudFront 單獨快取不同的回應。例如，您的原始伺服器可能會根據檢視器所在國家/地區使用特定語言的內容進行回應，或者使用針對特定裝置類型訂製的內容。您的原始伺服器還可能會將這些標頭寫入日誌檔案，您可以使用這些檔案來確定有關檢視器所在位置、檢視器所在的裝置類型等資訊。

如果您想要在快取金鑰中包含標頭，請使用*快取政策*。如需更多詳細資訊，請參閱 [使用政策控制快取金鑰](controlling-the-cache-key.md) 及 [了解快取金鑰](understanding-the-cache-key.md)。

要在原始伺服器中接收這些表頭，但不將它們包含在快取金鑰中，請使用*原始伺服器請求政策*。如需詳細資訊，請參閱[使用政策控制原始伺服器請求](controlling-origin-requests.md)。

**Topics**
+ [

## 裝置類型標頭
](#cloudfront-headers-device-type)
+ [

## 檢視器位置標頭
](#cloudfront-headers-viewer-location)
+ [

## 用於判斷檢視器標頭結構的標頭
](#cloudfront-headers-viewer-headers)
+ [

## TLS 相關標頭
](#tls-related-versions)
+ [

## 其他 CloudFront 標題
](#cloudfront-headers-other)

## 裝置類型標頭
<a name="cloudfront-headers-device-type"></a>

可以新增下列標頭來判斷檢視者的裝置類型。根據 `User-Agent` 標頭的值，CloudFront 將這些標頭的值設定為 `true` 或 `false`。如果裝置屬於多個類別，一個以上的值可以是 `true`。例如，針對一些平板電腦裝置，CloudFront 將 `CloudFront-Is-Mobile-Viewer` 與 `CloudFront-Is-Tablet-Viewer` 同時設定為 `true`。
+ `CloudFront-Is-Android-Viewer` - 當 CloudFront 判斷檢視器為具有 Android 作業系統的裝置時，設定為 `true`。
+ `CloudFront-Is-Desktop-Viewer` - 當 CloudFront 判斷檢視器為桌上型裝置時，設定為 `true`。
+ `CloudFront-Is-IOS-Viewer` - 當 CloudFront 判斷檢視器為具有 Apple 行動作業系統的裝置 (例如 iPhone、iPod Touch 以及一些 iPad 裝置) 時，設定為 `true`。
+ `CloudFront-Is-Mobile-Viewer` - 當 CloudFront 判斷檢視器為行動裝置時，設定為 `true`。
+ `CloudFront-Is-SmartTV-Viewer` - 當 CloudFront 判斷檢視器為智慧型電視時，設定為 `true`。
+ `CloudFront-Is-Tablet-Viewer` - 當 CloudFront 判斷檢視器為平板電腦時，設定為 `true`。

## 檢視器位置標頭
<a name="cloudfront-headers-viewer-location"></a>

可以新增下列標頭來判斷檢視者的位置。CloudFront 會根據檢視器的 IP 位址來決定這些標頭的值。對於這些標頭值中的非 ASCII 字元，CloudFront 會根據 [RFC 3986 的 1.2 節](https://tools.ietf.org/html/rfc3986#section-2.1)對字元進行百分比編碼。
+ `CloudFront-Viewer-Address` - 包含檢視者 IP 位址以及請求的來源連接埠，例如標頭值 `198.51.100.10:46532` 表示瀏覽器的 IP 位址是 198.51.100.10，請求來源連接埠是 46532。
+ `CloudFront-Viewer-ASN` - 包含檢視器的自治系統編號 (ASN)。
**注意**  
`CloudFront-Viewer-Address` 和 `CloudFront-Viewer-ASN` 可以在原始伺服器請求政策中新增，而不是在快取政策中新增。
+ `CloudFront-Viewer-Country` – 包含檢視器國家/地區的兩個字母國家/地區代碼。如需國家/地區代碼的清單，請參閱 [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)。
+ `CloudFront-Viewer-City` - 包含檢視器所在城市的名稱。

當您新增下列標頭時，CloudFront 會將它們套用至所有請求，*但*源自 AWS 網路的請求除外：
+ `CloudFront-Viewer-Country-Name` – 包含檢視器所在國家/地區的名稱。
+ `CloudFront-Viewer-Country-Region` – 包含代表檢視器區域的代碼 (最多三個字元)。該區域是 [ISO 3166-2](https://en.wikipedia.org/wiki/ISO_3166-2) 代碼的第一層細分 (即最廣泛或最不具體的一層)。
+ `CloudFront-Viewer-Country-Region-Name` – 包含檢視器區域的名稱。該區域是 [ISO 3166-2](https://en.wikipedia.org/wiki/ISO_3166-2) 代碼的第一層細分 (即最廣泛或最不具體的一層)。
+ `CloudFront-Viewer-Latitude` – 包含檢視器的約略緯度。
+ `CloudFront-Viewer-Longitude` – 包含檢視器的約略經度。
+ `CloudFront-Viewer-Metro-Code` – 包含檢視器的地鐵代碼。只有當檢視器在美國時，才會出現此問題。
+ `CloudFront-Viewer-Postal-Code` – 包含檢視器的郵遞區號。
+ `CloudFront-Viewer-Time-Zone` 包含檢視器的時區，採用 [IANA 時區資料庫格式](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) (例如，`America/Los_Angeles`)。

**注意**  
`CloudFront-Viewer-City`、`CloudFront-Viewer-Metro-Code` 和 `CloudFront-Viewer-Postal-Code` 可能無法用於每個 IP 位址。部分 IP 位址無法以足夠的特異性進行地理位置定位以取得該資訊。

## 用於判斷檢視器標頭結構的標頭
<a name="cloudfront-headers-viewer-headers"></a>

您可以新增下列標頭，協助根據檢視者傳送的標頭來識別檢視者。例如，不同的瀏覽器可能會以特定順序傳送 HTTP 標頭。若 `User-Agent` 標頭中指定的瀏覽器與該瀏覽器的預期標頭順序不同，您可以拒絕該請求。此外，若 `CloudFront-Viewer-Header-Count` 值與 `CloudFront-Viewer-Header-Order` 中的標頭數量不同，您也可以拒絕該請求。
+ `CloudFront-Viewer-Header-Order` – 按要求的順序包含檢視者的標頭名稱，並以冒號分隔。例如：`CloudFront-Viewer-Header-Order: Host:User-Agent:Accept:Accept-Encoding`。超出 7,680 字元限制的標頭會被截斷。
+ `CloudFront-Viewer-Header-Count` – 包含檢視者標頭的總數。

## TLS 相關標頭
<a name="tls-related-versions"></a>

您可以新增下列標頭，以判斷檢視器的 JA3 指紋、JA4 指紋和 TLS 連線詳細資料：
+ `CloudFront-Viewer-JA3-Fingerprint` – 包含檢視者的 [JA3 指紋](https://github.com/salesforce/ja3)。JA3 指紋可協助您判斷請求是來自已知用戶端、惡意軟體或惡意機器人，或預期的 (允許清單中的) 應用程式。
+ `CloudFront-Viewer-JA4-Fingerprint` – 包含檢視器的 JA4 指紋。與 JA3 指紋相似，[JA4 指](https://github.com/FoxIO-LLC/ja4)紋可協助您判斷請求是來自已知用戶端、惡意軟體或惡意機器人，或預期的 (允許清單中的) 應用程式。您可以使用指紋來建置已知良好和不良行為者的資料庫，以便在檢查 HTTP 請求時套用。然後，您可以在應用程式 Web 伺服器或 [Lambda@Edge](lambda-at-the-edge.md) 和 [CloudFront Functions](cloudfront-functions.md) 中檢查標頭值，將標頭值與已知惡意軟體指紋清單進行比較，以封鎖惡意用戶端。
+ `CloudFront-Viewer-TLS` – 包含 SSL/TLS 版本、密碼以及有關用於檢視器和 CloudFront 之間連線的 SSL/TLS 交握的詳細資訊。標頭值的格式如下：

  ```
  SSL/TLS_version:cipher:handshake_information
  ```

  對於 `handshake_information`，標頭可包含下列值：
  + `fullHandshake` – 已針對 SSL/TLS 工作階段進行完整交握。
  + `sessionResumed` – 之前的 SSL/TLS 工作階段已恢復。
  + `connectionReused` – 之前的 SSL/TLS 連線已重複使用。

  下列是此標頭的一些範例值：

  ```
  TLSv1.3:TLS_AES_128_GCM_SHA256:sessionResumed
  ```

  ```
  TLSv1.2:ECDHE-ECDSA-AES128-GCM-SHA256:connectionReused
  ```

  ```
  TLSv1.1:ECDHE-RSA-AES128-SHA256:fullHandshake
  ```

  ```
  TLSv1:ECDHE-RSA-AES256-SHA:fullHandshake
  ```

  有關此標頭值中可能存在的 SSL/TLS 版本和密碼的完整列表，請參閱 [檢視器和 CloudFront 之間支援的通訊協定和密碼](secure-connections-supported-viewer-protocols-ciphers.md)。

**備註**  
JA3 和 JA4 指紋衍生自 SSL/TLS `Client Hello` 封包。它們僅適用於 HTTPS 請求。
對於這些與 TLS 相關的標頭，您可以將它們新增至[原始伺服器請求政策](controlling-origin-requests.md)，而不是在[快取政策](controlling-the-cache-key.md)中。

## 其他 CloudFront 標題
<a name="cloudfront-headers-other"></a>

您可以新增下列標頭，以判斷檢視器的原始請求 URI、原始請求查詢字串參數和值、通訊協定和版本：
+ `CloudFront-Error-Uri` – 包含從檢視器收到的原始請求 URI。
+ `CloudFront-Error-Args` – 包含原始請求查詢字串參數和值。
+ `CloudFront-Forwarded-Proto` – 包含檢視器請求的通訊協定 (HTTP 或 HTTPS)。
+ `CloudFront-Viewer-Http-Version` – 包含檢視器請求的 HTTP 版本。