

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

# 为 Amplify 应用程序设置自定义 HTTP 标头
<a name="custom-headers"></a>

使用自定义 HTTP 标头可以让您能够指定每个 HTTP 响应的标头。响应标头可用于调试、安全和信息等用途。您可以在 Amplify 控制台中指定标头，也可以通过下载和编辑应用程序的 `customHttp.yml` 文件并将其保存在项目的根目录中来指定标头。有关详细步骤，请参阅 [设置自定义标头](setting-custom-headers.md)。

以前，为应用程序指定自定义 HTTP 标头的方法是在 Amplify 控制台中编辑构建规范（buildspec），或者下载并更新 `amplify.yml` 文件并将其保存在项目的根目录中。我们强烈推荐将以这种方式指定的自定义标头从 buildspec 和 `amplify.yml` 文件中迁移出来。有关说明，请参阅[将自定义标头从构建规范和 amplify.yml 中迁移出来](migrate-custom-headers.md)。

**Topics**
+ [自定义标头 YAML 参考](custom-header-YAML-format.md)
+ [设置自定义标头](setting-custom-headers.md)
+ [将自定义标头从构建规范和 amplify.yml 中迁移出来](migrate-custom-headers.md)
+ [Monorepo 自定义标头要求](monorepo-custom-headers.md)

# 自定义标头 YAML 参考
<a name="custom-header-YAML-format"></a>

使用以下 YAML 格式指定自定义标头：

```
customHeaders:
  - pattern: '*.json'
    headers:
    - key: 'custom-header-name-1'
      value: 'custom-header-value-1'
    - key: 'custom-header-name-2'
      value: 'custom-header-value-2'
  - pattern: '/path/*'
    headers:
    - key: 'custom-header-name-1'
      value: 'custom-header-value-2'
```

对于 monorepo，请使用以下 YAML 格式：

```
applications:
  - appRoot: app1
    customHeaders:
    - pattern: '**/*'
      headers:
      - key: 'custom-header-name-1'
        value: 'custom-header-value-1'
  - appRoot: app2
    customHeaders:
    - pattern: '/path/*.json'
      headers:
      - key: 'custom-header-name-2'
        value: 'custom-header-value-2'
```

当您向应用程序添加自定义标头时，您需要为以下内容指定自己的值：

**模式**  
应用于与模式匹配的所有 URL 文件路径的标头。

**标头**  
定义与文件模式相匹配的标头。

**键**  
自定义标头的名称。

**值**  
自定义标头的值。

要了解有关 HTTP 标头的更多信息，请参阅 Mozilla 的[ HTTP 标头](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers)列表。

# 设置自定义标头
<a name="setting-custom-headers"></a>

有两种方法可以为 Amplify 应用程序指定自定义 HTTP 标头。您可以在 Amplify 控制台中指定标头，也可以通过下载和编辑应用程序的 `customHttp.yml` 文件并将其保存在项目的根目录中来指定标头。

**要在控制台中为应用程序设置并保存自定义标头**

1. 登录 AWS 管理控制台 并打开 [Amplify](https://console.aws.amazon.com/amplify/) 控制台。

1. 选择要为其设置自定义标头的应用程序。

1. 在导航窗格中依次选择**托管**和**自定义标头**。

1. 在**自定义标头**页面中选择**编辑**。

1. 在**编辑自定义标头**窗口中，使用[自定义标头 YAML 格式](custom-header-YAML-format.md)输入自定义标头的信息。

   1. 对于 `pattern`，输入要匹配的模式。

   1. 对于 `key`，输入自定义标头的名称。

   1. 对于 `value`，输入自定义标头的值。

1. 选择**保存**。

1. 重新部署应用程序以应用新的自定义标头。
   + 对于 CI/CD 应用程序，请导航到要部署的分支并选择**重新部署此版本**。您也可以从 Git 存储库中执行新构建。
   + 对于手动部署应用程序，请在 Amplify 控制台中再次部署该应用程序。

**要在存储库根目录中为应用程序设置并保存自定义标头**

1. 登录 AWS 管理控制台 并打开 [Amplify](https://console.aws.amazon.com/amplify/) 控制台。

1. 选择要为其设置自定义标头的应用程序。

1. 在导航窗格中依次选择**托管**和**自定义标头**。

1. 在**自定义标头**页面中选择**下载 YML**。

1. 在您选择的代码编辑器中打开下载的 `customHttp.yml` 文件，然后使用[自定义标头 YAML 格式](custom-header-YAML-format.md)输入自定义标头的信息。

   1. 对于 `pattern`，输入要匹配的模式。

   1. 对于 `key`，输入自定义标头的名称。

   1. 对于 `value`，输入自定义标头的值。

1. 将编辑后的 `customHttp.yml` 文件保存在项目的根目录中。如果您使用的是 monorepo，请将 `customHttp.yml` 文件保存在存储库的根目录中。

1. 重新部署应用程序以应用新的自定义标头。
   + 对于 CI/CD 应用程序，请从包含新`customHttp.yml`文件的 Git 存储库中执行新构建。
   + 对于手动部署应用程序，请在 Amplify 控制台中再次部署应用程序，并将新 `customHttp.yml` 文件与您上传的构件一起包括在内。

**注意**  
在 `customHttp.yml` 文件中设置并部署在应用程序根目录中的自定义标头，将覆盖在 Amplify 控制台的**自定义标头**部分中定义的自定义标头。

## 安全自定义标头示例
<a name="example-security-headers"></a>

自定义安全标头可以强制执行 HTTPS，防止 XSS 攻击，并保护您的浏览器免受点击劫持。使用以下 YAML 语法将自定义安全标头应用于您的应用程序。

```
customHeaders:
  - pattern: '**'
    headers:
      - key: 'Strict-Transport-Security'
        value: 'max-age=31536000; includeSubDomains'
      - key: 'X-Frame-Options'
        value: 'SAMEORIGIN'
      - key: 'X-XSS-Protection'
        value: '1; mode=block'
      - key: 'X-Content-Type-Options'
        value: 'nosniff'
      - key: 'Content-Security-Policy'
        value: "default-src 'self'"
```

## 设置 Cache-Control 自定义标头
<a name="example-cache-headers"></a>

使用 Amplify 托管的应用程序会保留源站发送的 `Cache-Control` 标头，除非您使用自己的自定义标头将其覆盖。Amplify 只会为带有 `200 OK` 状态码的成功响应应用 Cache-Control 自定义标头。这样可以防止系统缓存错误的响应，并将其提供给发出相同请求的其他用户。

您可以手动调整 `s-maxage` 指令，以便更好地控制应用程序的性能和部署可用性。例如，要延长内容在边缘缓存的时间长度，您可以通过更新 `s-maxage` 到比默认 600 秒（10 分钟）更长的值来手动延长生存时间 (TTL)。

要指定 `s-maxage` 的自定义值，请使用以下 YAML 格式。此示例将关联内容保留在边缘缓存 3600 秒 (1 小时)。

```
customHeaders:
  - pattern: '/img/*'
    headers:
      - key: 'Cache-Control' 
        value: 's-maxage=3600'
```

有关使用标头控制应用程序性能的更多信息，请参阅 [使用 Cache-Control 标头提高应用程序性能](Using-headers-to-control-cache-duration.md)。

# 将自定义标头从构建规范和 amplify.yml 中迁移出来
<a name="migrate-custom-headers"></a>

以前，要为应用程序指定自定义 HTTP 标头，要么在 Amplify 控制台中编辑构建规范，要么下载并更新 `amplify.yml` 文件并将其保存到项目的根目录中。强烈建议您将自定义标头从构建规范和 `amplify.yml` 文件中迁移出来。

在 Amplify 控制台的**自定义标头**部分中指定自定义标头，或者通过下载和编辑 `customHttp.yml` 文件来指定自定义标头。

**迁移 Amplify 控制台中存储的自定义标头**

1. 登录 AWS 管理控制台 并打开 [Amplify](https://console.aws.amazon.com/amplify/) 控制台。

1. 选择要执行自定义标头迁移的应用程序。

1. 在导航窗格中，依次选择**托管**和**构建设置**。在**应用程序构建规范**部分，您可以查看应用程序的构建规范。

1. 选择**下载**以保存当前构建规范的副本。稍后如果需要恢复任何设置，您可以引用此副本。

1. 下载完成后，选择**编辑**。

1. 请记下文件中的自定义标头信息，因为稍后将在步骤 9 中使用这些信息。在**编辑**窗口中，从文件中删除所有自定义标头，然后选择**保存**。

1. 在导航窗格中，依次选择**托管**、**自定义标头**。

1. 在**自定义标头**页面中选择**编辑**。

1. 在**编辑自定义标头**窗口中，输入您在步骤 6 中删除的自定义标头的信息。

1. 选择**保存**。

1. 重新部署您想要将新自定义标头应用到的任何分支。

**将自定义标头从 amplify.yml 迁移到 customHttp.yml**

1. 导航到当前部署在应用程序根目录中的 `amplify.yml` 文件。

1. 在选定的代码编辑器中打开 `amplify.yml` 文件。

1. 请记下文件中的自定义标头信息，因为稍后将在步骤 8 中使用这些信息。删除文件中的自定义标头。保存并关闭 文件。

1. 登录 AWS 管理控制台 并打开 [Amplify](https://console.aws.amazon.com/amplify/) 控制台。

1. 选择要为其设置自定义标头的应用程序。

1. 在导航窗格中，依次选择**托管**、**自定义标头**。

1. 在**自定义标头**页面中选择**下载**。

1. 在您选择的代码编辑器中打开下载的 `customHttp.yml` 文件，然后输入您在步骤 3 中从 `amplify.yml` 中删除的自定义标头的信息。

1. 将编辑后的 `customHttp.yml` 文件保存在项目的根目录中。如果您使用的是 monorepo，请将文件保存在存储库的根目录中。

1. 重新部署应用程序以应用新的自定义标头。
   + 对于 CI/CD 应用程序，请从包含新`customHttp.yml`文件的 Git 存储库中执行新构建。
   + 对于手动部署应用程序，请在 Amplify 控制台中再次部署该应用程序，并添加包含您上传的构件的新 `customHttp.yml` 文件。

**注意**  
在 `customHttp.yml` 文件中设置并部署在应用程序根目录中的自定义标头，将覆盖在 Amplify 控制台的**自定义标头**部分中定义的自定义标头。

# Monorepo 自定义标头要求
<a name="monorepo-custom-headers"></a>

在 monorepo 中为应用程序指定自定义标头时，请注意以下设置要求：
+ monorepo 有一种特定的 YAML 格式。有关正确的语法，请参见 [自定义标头 YAML 参考](custom-header-YAML-format.md)。
+ 您可以使用 Amplify 控制台的**自定义标头**部分，为 monorepo 中的应用程序指定自定义标头。您必须重新部署应用程序才能应用新的自定义标头。
+ 作为使用控制台的替代方法，您可以在 `customHttp.yml` 文件中为 monorepo 中的应用程序指定自定义标头。您必须将 `customHttp.yml` 文件保存在存储库的根目录中，然后重新部署应用程序以应用新的自定义标头。`customHttp.yml` 文件中指定的自定义标头会覆盖使用 Amplify 控制台的**自定义标头**部分指定的任何自定义标头。