# 请求设置 (/zh/docs/requests/settings)

**设置** 标签页决定请求如何传输：使用哪个 HTTP 版本、是否跟随重定向、是否保留 Cookie、是否检查证书，以及它最多可以花多长时间。代理和证书针对整个工作区或整个 App 设置，见本页后面。

<Shot id="requests-http-settings" alt="请求的设置标签页：原始模式，HTTP 版本为“自动”并附说明，验证 TLS 证书，跟随重定向（最大重定向次数为 10），Cookie，解压缩响应，以及超时 60 秒" />

## 设置标签页 [#the-settings-tab]

| 设置 | 默认值 | 作用 |
| --- | --- | --- |
| **原始模式** | 关 | 只发送 **标头** 标签页中的标头，不添加任何内容。 |
| **HTTP 版本** | **自动** | **自动**、**HTTP/1.1**、**HTTP/2** 或 **HTTP/3**。 |
| **验证 TLS 证书** | 开 | 对 `https://` 地址检查服务器的证书。 |
| **跟随重定向** | 开 | 跟随 3xx 响应，最多 **最大重定向次数** 次。 |
| **最大重定向次数** | 10 | 从 1 到 50。 |
| **发送并储存 Cookie** | 开 | 发送窗口的存储中为该地址保留的 Cookie，并保留响应所设置的 Cookie。 |
| **解压缩响应** | 开 | 请求压缩的响应并将其解码。 |
| **超时** | 60 秒 | 整个交换最多可以花的时间，从 1 秒到一小时，步长 5 秒。 |

请求的文件中只保存你更改过的设置。任何设置与默认值不同时，标签页会显示一个圆点；原始模式开启时，标签页显示 **设置（原始）**。**恢复默认设置** 会还原每项设置。

在请求文件中，这些设置如下所示：

```toml
[settings]
http-version = "http2"
follow-redirects = false
timeout = 10.0
```

## HTTP 版本 [#http-version]

| 选项 | Echolot 的做法 |
| --- | --- |
| **自动** | 服务器支持时使用 HTTP/2，否则使用 HTTP/1.1。服务器一旦提供 HTTP/3（通过 `Alt-Svc` 标头），之后发往它的请求会使用 HTTP/3，无法连接时回退到 TCP。 |
| **HTTP/1.1** | 仅使用 HTTP/1.1。 |
| **HTTP/2** | 仅使用 HTTP/2：通过 TLS，或通过明文 `http://` 并事先知晓（h2c）。 |
| **HTTP/3** | 仅通过 QUIC 使用 HTTP/3。 |

HTTP/3 有一些限制：

- 它需要 **macOS 27 或更高版本**。在较旧的 Mac 上，标签页会说明这一点，设为 **HTTP/3** 的请求无法发送；**自动** 则保持使用 HTTP/2 和 HTTP/1.1。
- 仅限 `https://` 地址。
- 不支持代理（包括系统代理）、自定义 CA 文件和客户端证书。设为 **HTTP/3** 且需要其中任何一项的请求会被拒绝，并说明原因。设为 **自动** 时，这类请求仍使用 TCP。
- 原始模式不能与 HTTP/3 一起使用。

设为 **自动** 时，当响应提供 HTTP/3，它的详情卡片会显示 **提供 HTTP/3**。如果下一个请求的 QUIC 连接失败，Echolot 会改为通过 TCP 发送，并忘记这个提供，详情卡片会说明原因。不会重复发送。

还有两种情况会自行切换版本：

- [NTLM](/docs/requests/auth#ntlm) 需要 HTTP/1.1。设为 **自动** 时，NTLM 请求通过 HTTP/1.1 发送；设为 **HTTP/2** 或 **HTTP/3** 时则被拒绝。
- 当服务器以 `HTTP_1_1_REQUIRED` 重置某个 HTTP/2 请求时，Echolot 此后对该服务器使用 HTTP/1.1。可安全重复的请求会立即通过 HTTP/1.1 重新发送；其他请求会停止并显示相应的错误，
  你再次发送时则通过 HTTP/1.1 发出。

响应的详情卡片会在 TLS 版本旁边显示所使用的版本。

## 重定向 [#redirects]

**跟随重定向** 开启时，Echolot 会跟随指向 `http://` 和 `https://` 地址的 `301`、`302`、`303`、`307` 和 `308` 响应：

- `303` 变成不带正文的 `GET`（`HEAD` 仍是 `HEAD`）。
- `301` 和 `302` 像浏览器一样，把 `POST` 变成 `GET`。
- `307` 和 `308` 保持方法和正文不变。

每一跳都会被记录。详情卡片显示 **3 次重定向**（或实际次数）；点按它可查看每一跳的状态、方法、地址和耗时，以及最终地址。可以用 Alpenglow 中的 **Echo › Follow redirects** 试一试。

重定向到另一个源会丢弃你的凭据：`Authorization` 和 `Cookie` 标头、API 密钥标头、含有机密的标头、签名（Digest、AWS、Hawk、EdgeGrid、NTLM）以及客户端证书。
见[凭据只留在其来源](/docs/requests/auth#credentials-stay-with-their-origin)。

**跟随重定向** 关闭时，3xx 响应就是最终的响应。

## Cookie [#cookies]

每个窗口都有一个 Cookie 存储。**发送并储存 Cookie** 开启时，请求会发送存储中与其地址匹配的 Cookie，响应所设置的 Cookie 会进入存储。对于既不该发送也不该保留任何 Cookie 的请求，请将其关闭。

响应的 **Cookie** 标签页显示 **随请求发送** 的内容、**由响应设置** 的内容，以及 **储存在此窗口中** 的内容。用 Cookie 对应的按钮移除其中一个，或用 **全部清除** 移除全部。见[响应](/docs/requests/responses#cookies)。

存储遵循浏览器的规则：响应不能为整个公共后缀（例如 `.com` 或 `.co.uk`）设置 Cookie。可以试一试 Alpenglow 中的 **Echo › Set a cookie**，然后再向 `demo.echolot.dev` 发送任何其他请求。

## 解压缩响应 [#decompress-responses]

**解压缩响应** 开启时，Echolot 会发送 `Accept-Encoding: gzip, deflate, br, zstd`（除非你自己设置了该标头），并解码 gzip、deflate、Brotli 和 Zstandard 响应。**正文** 标签页显示解码后的正文；
原样到达的字节保留在 **传输** 标签页中，正文的存储菜单则提供 **存储编码的正文…**。详情卡片会显示，例如 `br, 12 KB → 48 KB`。

关闭它，可以看到服务器压缩后的响应原样，或不发送 `Accept-Encoding` 标头。

## 验证 TLS 证书 [#verify-tls-certificates]

除非你要对一个证书不被你的 Mac 信任、而你又无法添加其 CA 的服务器进行测试，否则请保持开启。关闭后，详情卡片会显示橙色的打开的锁，它的弹出窗口显示 **证书验证已关闭**。

对于私有 CA，更好的办法是仅为该主机信任它：见[证书](#certificates)。

## 超时 [#timeout]

超时是交换可以花费的总时间，从连接到最后一个字节。时间用尽时，请求会停止并显示 **请求超时**，连接随即关闭。

## 原始模式 [#raw-mode]

原始模式用于把请求逐字节按你写的样子发送，包括格式错误的请求，以测试服务器如何处理它。Echolot 会省去它为每个请求添加的标头（`Host`、`User-Agent`、`Accept`、
`Accept-Encoding`、`Cookie`、`Content-Length` 和分帧），也不检查请求是否格式良好。在 **自动生成** 下，**标头** 标签页显示 **原始模式：Echolot 不添加任何标头，只发送上方的标头。**

对于只发送你自己标头的请求，还要把 **认证** 设为 **无认证**，并且如果正文需要，请写上你自己的 `Content-Type`。原始模式写出的是 HTTP/1.1，所以不能与 HTTP/3 一起使用。

## 重试 [#retries]

Echolot 会保持连接打开并复用它们，这样可以节省 DNS、连接和 TLS 的时间；复用时，详情卡片会显示 **复用的连接**。有时服务器恰好在请求发出时关闭了保持打开的连接。这时：

- 可安全重复的请求会在新连接上重新发送：`GET`、`HEAD`、`OPTIONS`、`TRACE`、`PUT` 或 `DELETE`，或带有 `Idempotency-Key` 标头的任何请求。详情卡片会说明它被重新发送了。
- 其他任何请求（比如不带 `Idempotency-Key` 的 `POST`）不会重新发送，因为服务器可能已经处理了它。它会停止并显示 **在收到任何响应前连接已关闭；服务器可能已处理该请求**。

Echolot 在其他任何情况下都不会重试。

## 代理 [#proxies]

请求默认经过 **设置 › 网络** 中选择的代理：

| 代理 | 含义 |
| --- | --- |
| **系统设置** | 来自 **系统设置 › 网络** 的 HTTP、HTTPS 和 SOCKS 代理，连同其例外。不使用自动代理配置（PAC）。 |
| **无** | 每个请求都直接连接。 |
| **手动** | HTTP、HTTPS（与代理之间使用 TLS）或 SOCKS5 代理，例如 `http://proxy:3128` 或 `socks5://host:1080`，可带用户名和密码（保存在钥匙串中），并在 **直接连接到** 下列出直连的主机（`localhost, *.internal`）。 |

工作区可以设置自己的代理，它会随工作区传给队友和命令行工具：

1. 从边栏底部的工作区切换器中打开 **工作区设置…**。
2. 选取 **代理** 标签页，并关闭 **使用 App 的代理设置**。
3. 选取 **系统设置**、**环境（HTTPS_PROXY…）**（读取 `HTTPS_PROXY`、`HTTP_PROXY` 和 `NO_PROXY`）、**无** 或 **手动**。
4. 对于 **手动**，填写 **代理**（可以使用变量，例如 `{{proxy}}`）、**用户名** 和 **密码**，以及 **直接连接到**。把密码写成机密变量 `{{proxy_password}}`：工作区文件从不保存机密。
   字面的密码会提供 **移到钥匙串**。

HTTP/3 从不经过代理。见[工作区](/docs/workspaces)。

## 证书 [#certificates]

对于使用私有证书颁发机构、或要求客户端证书（双向 TLS）的主机，请在工作区中添加一条规则：

1. 打开 **工作区设置…** 并选取 **证书** 标签页。
2. 点按 **添加主机** 并输入主机，例如 `api.example.com`，或用 `*.internal` 表示每个子域名。
3. 在 **信任的 CA** 旁边，点按 **选取…** 并选取一个或多个 PEM 文件。除系统的 CA 之外，它们也会被信任。
4. 对于客户端证书，在 **客户端证书** 旁边选取文件：PEM 文件或 `.p12`（`.pfx`）。对于文件中没有密钥的 PEM 证书，还要选取 **私钥** 文件。
5. 如果密钥或 `.p12` 有密码短语，请在 **密码短语** 中把它写成机密变量，例如 `{{p12_passphrase}}`。

第一条与主机匹配的规则生效。工作区内的文件以相对于工作区的路径存储，所以这条规则对拥有该工作区的每个人都有效。每条规则的证书只用于它自己的主机：重定向到另一个主机时，绝不会出示第一个主机的客户端证书。

<Edition only="appstore">
  App Store 版本只能读取你选取过的文件。你在这里选取的 CA 文件、客户端证书和密钥，在之后的发送中仍可读取。队友创建的、指向工作区之外文件的规则，需要你把这些文件一次性提供给应用：
  发送会停止，响应窗格会提供 **允许访问…**。
</Edition>

## App 级设置 [#app-wide-settings]

代理是唯一带有 App 级默认值的请求设置（**设置 › 网络**）。其他每项设置，对每个请求都从上表中的默认值开始，请求的文件保存你所更改的内容。要一次更改许多请求的设置，请在边栏中选中它们，
并用 **编辑 N 个请求…** 修改它们的标头、参数和认证，或者直接编辑文件。
