diff --git a/files/zh-cn/_redirects.txt b/files/zh-cn/_redirects.txt index 9ebb1c52918944..134ffa426a45cb 100644 --- a/files/zh-cn/_redirects.txt +++ b/files/zh-cn/_redirects.txt @@ -2446,6 +2446,7 @@ /zh-CN/docs/Web/HTTP/HTTP请求方法 /zh-CN/docs/Web/HTTP/Methods /zh-CN/docs/Web/HTTP/HTTP请求方法/GET /zh-CN/docs/Web/HTTP/Methods/GET /zh-CN/docs/Web/HTTP/HTTP请求方法/POST /zh-CN/docs/Web/HTTP/Methods/POST +/zh-CN/docs/Web/HTTP/Headers/Accept-Charset /zh-CN/docs/Web/HTTP/Headers /zh-CN/docs/Web/HTTP/Headers/Content-Security-Policy/require-sri-for /zh-CN/docs/Web/HTTP/Headers/Content-Security-Policy /zh-CN/docs/Web/HTTP/Headers/Content-Security-Policy__by_cnvoid /zh-CN/docs/Web/HTTP/Headers/Content-Security-Policy /zh-CN/docs/Web/HTTP/Headers/Content-Security-Policy__by_cnvoid/base-uri /zh-CN/docs/Web/HTTP/Headers/Content-Security-Policy/base-uri diff --git a/files/zh-cn/_wikihistory.json b/files/zh-cn/_wikihistory.json index f8f59a468a57c0..99d94ba43c5cd4 100644 --- a/files/zh-cn/_wikihistory.json +++ b/files/zh-cn/_wikihistory.json @@ -22640,10 +22640,6 @@ "modified": "2020-10-15T22:24:12.153Z", "contributors": ["xuhui98"] }, - "Web/HTTP/Headers/Accept-Charset": { - "modified": "2020-10-15T21:50:53.082Z", - "contributors": ["shinken008", "Dorllen", "WayneCui", "xgqfrms-GitHub"] - }, "Web/HTTP/Headers/Accept-Encoding": { "modified": "2020-10-15T21:53:10.909Z", "contributors": [ diff --git a/files/zh-cn/glossary/forbidden_header_name/index.md b/files/zh-cn/glossary/forbidden_header_name/index.md index a0077236082534..12de22e0311191 100644 --- a/files/zh-cn/glossary/forbidden_header_name/index.md +++ b/files/zh-cn/glossary/forbidden_header_name/index.md @@ -2,18 +2,25 @@ title: 禁止修改的标头 slug: Glossary/Forbidden_header_name l10n: - sourceCommit: e72890bafe775a38620def9a74beda8cf9c47411 + sourceCommit: 56cbe48e4426172461d9297523b68716922690e5 --- {{GlossarySidebar}} **禁止修改的标头**指的是不能在代码中通过编程的方式进行修改的 [HTTP 标头](/zh-CN/docs/Web/HTTP/Headers),具体地,这是 HTTP **请求**标头名称(和{{Glossary("Forbidden response header name", "禁止修改的响应标头")}}形成对比)。 -因为用户代理保留对此类标头的完全控制,所以它们被禁止修改。保留以 `Sec-` 开头的名称,以用于在使用 [fetch 算法](https://fetch.spec.whatwg.org/#concept-fetch)的请求中创建安全的新标头,这些 {{glossary("API")}} 授予开发人员对标头的控制权,例如:{{domxref("XMLHttpRequest")}}。 +因为用户代理保留对此类标头的完全控制,所以它们被禁止修改。例如,{{HTTPHeader("Date")}} 标头是禁止修改的标头,因此代码无法设置消息的 `Date` 字段: -禁止修改的标头包括以 `Proxy-` 和 `Sec-` 开头的标头,以及下面列出的标头: +```js example-bad +fetch("https://httpbin.org/get", { + headers: { + Date: new Date().toUTCString(), + }, +}); +``` + +保留以 `Sec-` 开头的名称,以用于创建新的,不会受到授予开发者控制标头权限的 API(如 {{domxref("Window/fetch", "fetch()")}})的影响的标头。禁止修改的标头包括以 `Proxy-` 和 `Sec-` 开头的标头,以及下面列出的标头: -- {{HTTPHeader("Accept-Charset")}} - {{HTTPHeader("Accept-Encoding")}} - {{HTTPHeader("Access-Control-Request-Headers")}} - {{HTTPHeader("Access-Control-Request-Method")}} @@ -27,8 +34,8 @@ l10n: - {{HTTPHeader("Host")}} - {{HTTPHeader("Keep-Alive")}} - {{HTTPHeader("Origin")}} -- `Proxy-` -- `Sec-` +- `Proxy-` 标头 +- `Sec-` 标头 - {{HTTPHeader("Referer")}} - {{HTTPHeader("TE")}} - {{HTTPHeader("Trailer")}} @@ -37,11 +44,12 @@ l10n: - {{HTTPHeader("Via")}} > [!NOTE] -> 根据[规范](https://fetch.spec.whatwg.org/#terminology-headers)中的禁止修改的标头列表(Firefox 43 中实现了它),{{HTTPHeader("User-Agent")}} 标头不再被禁止,现在可以设置在 Fetch 的 [Headers](/zh-CN/docs/Web/API/Headers) 对象中,或者通过 `XMLHttpRequest` 的 [setRequestHeader()](/zh-CN/docs/Web/API/XMLHttpRequest/setRequestHeader) 方法设置。但是,Chrome 会不做提示地从 Fetch 请求中丢弃这个标头(请参阅 [Chromium bug 571722](https://bugs.chromium.org/p/chromium/issues/detail?id=571722))。 +> 根据[规范](https://fetch.spec.whatwg.org/#terminology-headers)中的禁止修改的标头列表(Firefox 43 中实现了它),{{HTTPHeader("User-Agent")}} 标头不再被禁止,现在可以设置在 Fetch 的 [Headers](/zh-CN/docs/Web/API/Headers) 对象中,或者通过 `XMLHttpRequest` 的 [setRequestHeader()](/zh-CN/docs/Web/API/XMLHttpRequest/setRequestHeader) 方法设置。但是,Chrome 会静默地从 Fetch 请求中丢弃这个标头(请参阅 [Chromium bug 571722](https://bugs.chromium.org/p/chromium/issues/detail?id=571722))。 > [!NOTE] -> 虽然[规范](https://fetch.spec.whatwg.org/#forbidden-request-header)中将 {{HTTPHeader("Referer")}} 标头列为禁止修改的标头,但是用户代理并没有完全对其进行控制,因此可以通过编程的方式修改此标头。例如,当使用 [`fetch()`](/zh-CN/docs/Web/API/fetch) 时,可以通过 [`referrer` 选项](/zh-CN/docs/Web/API/fetch#referrer)对 {{HTTPHeader("Referer")}} 标头进行编程修改。 +> 虽然[规范](https://fetch.spec.whatwg.org/#forbidden-request-header)中将 {{HTTPHeader("Referer")}} 标头列为禁止修改的标头,但是用户代理并没有完全对其进行控制,因此可以通过编程的方式修改此标头。例如,当使用 [`fetch()`](/zh-CN/docs/Web/API/Window/fetch) 时,可以通过 [`referrer` 选项](/zh-CN/docs/Web/API/RequestInit#referrer)对 {{HTTPHeader("Referer")}} 标头进行编程修改。 ## 参见 -{{Glossary("Forbidden response header name", "禁止修改的响应标头")}}(术语表) +- 相关术语: + - {{Glossary("Forbidden response header name", "禁止修改的响应标头")}} diff --git a/files/zh-cn/learn/server-side/first_steps/client-server_overview/index.md b/files/zh-cn/learn/server-side/first_steps/client-server_overview/index.md index 45073059d99a8b..92dcd2d7700ac4 100644 --- a/files/zh-cn/learn/server-side/first_steps/client-server_overview/index.md +++ b/files/zh-cn/learn/server-side/first_steps/client-server_overview/index.md @@ -11,13 +11,12 @@ slug: Learn/Server-side/First_steps/Client-Server_overview 前提: - 基本电脑素养、对于什么是网络服务器的基本了解 + 基本电脑素养、对于什么是 Web 服务器的基本了解。 目标: - 理解在动态网站中的客户端 - - 服务器端交互过程,尤其是服务器端代码需要承担的工作 + 理解在动态网站中的客户端与服务器端的交互过程,尤其是服务器端代码需要承担的工作。 @@ -25,9 +24,9 @@ slug: Learn/Server-side/First_steps/Client-Server_overview 到目前为止的讨论中还没有真正的代码,因为我们还没有选择一个 web 框架来写我们的代码呢!然而这个讨论仍旧十分重要,因为我们描述的行为必须通过你的服务器端代码来实现,不管你选择什么编程语言和 web 框架。 -## 网络服务器和 HTTP(入门) +## Web 服务器和 HTTP(入门) -网络浏览器通过超文本标记语言传输协议([HTTP](/zh-CN/docs/Web/HTTP))与网络服务器([web servers](/zh-CN/docs/Learn/Common_questions/What_is_a_web_server))。当你在网页上点击一个链接、提交一个表单、或者进行一次搜索的时候,浏览器发送一个 HTTP 请求给服务器。 +Web 浏览器通过超文本标记语言传输协议([HTTP](/zh-CN/docs/Web/HTTP))与 [Web 服务器](/zh-CN/docs/Learn/Common_questions/Web_mechanics/What_is_a_web_server)。当你在网页上点击一个链接、提交一个表单、或者进行一次搜索的时候,浏览器发送一个 HTTP 请求给服务器。 这个请求包含: @@ -36,7 +35,7 @@ slug: Learn/Server-side/First_steps/Client-Server_overview - `GET`:获取一份指定(比如一个包含了一个产品或者一系列产品相关信息的 HTML 文档)。 - `POST`:创建一份新的资源(比如给 wiki 增加一片新的文章、给数据库增加一个新的节点)。 - - `HEAD`: 获取有关指定资源的元数据信息,而不会得到像 GET 的内容部分。例如,你可以使用 HEAD 请求来查找上次更新资源的时间,然后仅使用(更“昂贵”)GET 请求下载资源(如果已更改)。 + - `HEAD`:获取有关指定资源的元数据信息,而不会得到像 GET 的内容部分。例如,你可以使用 HEAD 请求来查找上次更新资源的时间,然后仅使用(更“昂贵”)GET 请求下载资源(如果已更改)。 - `PUT`:更新一份已经存在的资源(或者在该资源不存在的情况下创建一份新的)。 - `DELETE`:删除指定的资源。 - `TRACE`、`OPTIONS`、`CONNECT、PATCH`:这些动作是为一些不常见任务设计的,因此我们在这里的讲解不会涉及到它们。 @@ -45,11 +44,11 @@ slug: Learn/Server-side/First_steps/Client-Server_overview - URL 参数:GET 请求通过在 URL 末尾增加的键值对,来编码包含在发送给服务器的 URL 中的数据——比如,`http://mysite.com?name=Fred&age=11`,你经常会用到问号(?)来将 URL 剩余的部分和 URL 参数分隔开来,一个赋值符号(=)将名称和与之相关的值分隔开来,然后一个“&”符号分割不同的键值对。当他们被用户改变然后提交时,URL 参数具有与生俱来地“不安全性”。因此,一个 URL 参数或者 GET 请求是不会用来在服务器上更新数据的。 - POST 数据:POST 请求会增加新的资源,这些数据将会在请求体中编码。 - - 客户端 cookie:cookies 包含与客户相关的会话数据,服务器可以用这些数据来判断用户的登录状态以及用户是否有访问资源的权限。 + - 客户端 cookie:cookie 包含与客户相关的会话数据,服务器可以用这些数据来判断用户的登录状态以及用户是否有访问资源的权限。 -网络服务器等待来自客户的请求信息,当请求到达时处理它们,然后发给浏览器 HTTP 响应消息。回应包含一个 HTTP 响应状态码([HTTP Response status code](/zh-CN/docs/Web/HTTP/Status))来暗示请求是否成功 (比如 "`200 OK`" 连接成功, "`404 Not Found`" 资源没有找到,"`403 Forbidden`" 用户没有被授权查看资源,等等). 一个成功的响应主体,会包含 GET 请求所请求的资源。 +Web 服务器等待来自客户的请求信息,当请求到达时处理它们,然后发给浏览器 HTTP 响应消息。回应包含一个 [HTTP 响应状态码](/zh-CN/docs/Web/HTTP/Status)来暗示请求是否成功(比如 {{HTTPStatus("200", "200 OK")}} 连接成功,{{HTTPStatus("404", "404 Not Found")}} 资源没有找到,{{HTTPStatus("403", "403 Forbidden")}} 用户没有被授权查看资源,等等)。一个成功的响应主体,会包含 GET 请求所请求的资源。 -当一个 HTML 页面被返时,页面会被网络浏览器呈现出来。作为处理工作的一部分,浏览器会发现指向其他资源的链接(比如,一个 HTML 页面通常会参考 Javascript 和 CSS 页面),并且会发送独立的 HTTP 请求来下载这些文件。 +当一个 HTML 页面被返时,页面会被 Web 浏览器呈现出来。作为处理工作的一部分,浏览器会发现指向其他资源的链接(比如,一个 HTML 页面通常会参考 Javascript 和 CSS 页面),并且会发送独立的 HTTP 请求来下载这些文件。 静态网站和动态网站(在接下来的部分讨论到的)正是使用同一种通信协议/模式 @@ -58,15 +57,14 @@ slug: Learn/Server-side/First_steps/Client-Server_overview 你可以通过点击一个链接或者在网站进行一次搜索(比如搜索引擎的首页)做出一次简单的 GET 请求。比如,当你在 MDN 上进行一次对“客户端概览”词条的搜索时,HTTP 请求就被发送出去了,你将会看到正如下面一样被展示出来的文本信息(展示出来的信息不一定是相同的,因为其中一部分信息还取决于你的浏览器)。 > [!NOTE] -> HTTP 消息的格式是在“网络标准”([RFC7230](http://www.rfc-editor.org/rfc/rfc7230.txt))中定义的。你不需要知道这个标准的细节,但是现在你至少得知道所有这些是来自哪儿的! +> HTTP 消息的格式是在“Web 标准”([RFC9110](https://httpwg.org/specs/rfc9110.html#messages))中定义的。你不需要知道这个标准的细节,但是现在你至少得知道所有这些是来自哪儿的! #### 请求 -每一行请求都包含着相关信息。第一部分被称为**header**,并且包含着关于这个请求的有用信息,同样地一个[HTML head](/zh-CN/docs/Learn/HTML/Introduction_to_HTML/The_head_metadata_in_HTML)包含着关于 HTML 文档的有用信息(但是却没有自身的实际内容,内容在主体里面)。 +每一行请求都包含着相关信息。第一部分被称为**标头**(header),并且包含着关于这个请求的有用信息,同样地,[HTML head](/zh-CN/docs/Learn/HTML/Introduction_to_HTML/The_head_metadata_in_HTML) 包含着关于 HTML 文档的有用信息(但是却没有自身的实际内容,内容在主体里面)。 ```plain -GET https://developer.mozilla.org/en- -US/search?q=client+server+overview&topic=apps&topic=html&topic=css&topic=js&topic=api&topic=webdev HTTP/1.1 +GET /zh-CN/search?q=client+server+overview&topic=apps&topic=html&topic=css&topic=js&topic=api&topic=webdev HTTP/1.1 Host: developer.mozilla.org Connection: keep-alive Pragma: no-cache @@ -74,40 +72,39 @@ Cache-Control: no-cache Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 -Referer: https://developer.mozilla.org/en-US/ +Referer: https://developer.mozilla.org/zh-CN/ Accept-Encoding: gzip, deflate, sdch, br -Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7 -Accept-Language: en-US,en;q=0.8,es;q=0.6 +Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.7,en;q=0.6 Cookie: sessionid=6ynxs23n521lu21b1t136rhbv7ezngie; csrftoken=zIPUJsAZv6pcgCBJSCj1zU6pQZbfMUAT; dwf_section_edit=False; dwf_sg_task_completion=False; _gat=1; _ga=GA1.2.1688886003.1471911953; ffo=true ``` 第一行和第二行包含了我们在上面讨论过的大部分信息 - 请求类型(GET)。 -- 目标资源的 URL(`/en-US/search`)。 +- 目标资源的 URL(`/zh-CN/search`)。 - URL 参数(`q=client%2Bserver%2Boverview&topic=apps&topic=html&topic=css&topic=js&topic=api&topic=webdev`)。 - 目标网站(developer.mozilla.org)。 - 第一行的末尾也包含了一个简短的包含了标识协议版本的字符串(`HTTP/1.1`)。 -最后一行包括一些关于客户端 cookies 的信息——你可以看到在这种情况下 cookies 包含一个为处理远程会话准备的 ID(`Cookie: sessionid=6ynxs23n521lu21b1t136rhbv7ezngie; ...`)。 +最后一行包括一些关于客户端 cookie 的信息——你可以看到在这种情况下 cookie 包含一个为处理远程会话准备的 ID(`Cookie: sessionid=6ynxs23n521lu21b1t136rhbv7ezngie; ...`)。 剩余几行包含着所使用的浏览器以及浏览器所能处理的回应类型等信息。比如,你可以在下面看到这些相关信息: -- 我的浏览器上 (`User-Agent`) 是火狐 (`Mozilla/5.0`). -- 它可以接收 gzip 压缩信息 (`Accept-Encoding: gzip`). -- 它可以接收的具体编码类型 (`Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7`) 和语言 (`Accept-Language: de,en;q=0.7,en-us;q=0.3`). -- The `Referer` line 提示包含资源链接的网络地址 (或者说请求的来源是 `https://developer.mozilla.org/en-US/`). +- 我的浏览器上(`User-Agent`)是火狐(`Mozilla/5.0`)。 +- 它可以接收 gzip 压缩信息(`Accept-Encoding: gzip`)。 +- 它可以接收的具体语言(`Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.7,en;q=0.6`)。 +- `Referer` 这一行提示包含资源链接的网页地址(或者说请求的来源是 `https://developer.mozilla.org/zh-CN/`)。 请求也可以有一个请求体,不过在这个例子中请求的请求体是空的。 #### 回应 -针对这个请求的回应的第一部分内容展示如下。The header 包含了如下信息: +针对这个请求的回应的第一部分内容展示如下。标头包含了如下信息: - 第一行包括了回应状态码 200 OK,这告诉我们请求是成功的。 - 我们可以看到回应是文本 `html` 格式的(`Content-Type`)。 -- 我们也可以看到它使用的是 UTF-8 字符集 (`Content-Type: text/html; charset=utf-8`). -- The head 也告诉我们它有多大 (`Content-Length: 41823`). +- 我们也可以看到它使用的是 UTF-8 字符集(`Content-Type: text/html; charset=utf-8`)。 +- head 也告诉我们它有多大(`Content-Length: 41823`)。 在消息的末尾我们可以看到**主体**内容——包含了针对请求返回的真实的 HTML。 @@ -134,7 +131,7 @@ Content-Length: 41823 ... ``` -header 的剩余部分还包括一些回应的其他信息(比如回应在什么时候生成的),有关服务器的信息,还有它期望浏览器如何处理这个包(比如, `X-Frame-Options: DENY` 告诉浏览器不允许这个网页嵌入在其他网站的 HTML 元素{{htmlelement("iframe")}}上。 +header 的剩余部分还包括一些回应的其他信息(比如回应在什么时候生成的),有关服务器的信息,还有它期望浏览器如何处理这个包(比如,`X-Frame-Options: DENY` 告诉浏览器不允许这个网页嵌入在其他网站的 HTML 元素 {{htmlelement("iframe")}} 上。 ### POST 请求/响应举例 @@ -145,7 +142,7 @@ header 的剩余部分还包括一些回应的其他信息(比如回应在什 下面的文本展示了当用户在网站上提交新的文件的时候,生成的一个 HTTP 请求的格式和之前展示的 GET 请求是非常相似的,只是第一行标识这个请求为 POST。 ```http -POST https://developer.mozilla.org/en-US/profiles/hamishwillee/edit HTTP/1.1 +POST /zh-CN/profiles/hamishwillee/edit HTTP/1.1 Host: developer.mozilla.org Connection: keep-alive Content-Length: 432 @@ -156,19 +153,19 @@ Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Content-Type: application/x-www-form-urlencoded Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 -Referer: https://developer.mozilla.org/en-US/profiles/hamishwillee/edit +Referer: https://developer.mozilla.org/zh-CN/profiles/hamishwillee/edit Accept-Encoding: gzip, deflate, br -Accept-Language: en-US,en;q=0.8,es;q=0.6 +Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.7,en;q=0.6 Cookie: sessionid=6ynxs23n521lu21b1t136rhbv7ezngie; _gat=1; csrftoken=zIPUJsAZv6pcgCBJSCj1zU6pQZbfMUAT; dwf_section_edit=False; dwf_sg_task_completion=False; _ga=GA1.2.1688886003.1471911953; ffo=true -csrfmiddlewaretoken=zIPUJsAZv6pcgCBJSCj1zU6pQZbfMUAT&user-username=hamishwillee&user-fullname=Hamish+Willee&user-title=&user-organization=&user-location=Australia&user-locale=en-US&user-timezone=Australia%2FMelbourne&user-irc_nickname=&user-interests=&user-expertise=&user-twitter_url=&user-stackoverflow_url=&user-linkedin_url=&user-mozillians_url=&user-facebook_url= +csrfmiddlewaretoken=zIPUJsAZv6pcgCBJSCj1zU6pQZbfMUAT&user-username=hamishwillee&user-fullname=Hamish+Willee&user-title=&user-organization=&user-location=Australia&user-locale=zh-CN&user-timezone=Australia%2FMelbourne&user-irc_nickname=&user-interests=&user-expertise=&user-twitter_url=&user-stackoverflow_url=&user-linkedin_url=&user-mozillians_url=&user-facebook_url= ``` -最主要的不同在于 URL 不再包含任何参数。正如你所见,表单提交的信息被编码后放入消息主体中了。(比如:使用以下命令设置新的用户全名:`&user-fullname=Hamish+Willee`) +最主要的不同在于 URL 不再包含任何参数。正如你所见,表单提交的信息被编码后放入消息主体中了(比如:使用以下命令设置新的用户全名:`&user-fullname=Hamish+Willee`)。 #### 响应 -请求的响应如下。状态码"302 FOUND"告知浏览器,服务端已收到它提交的 post 请求,它必须再发出第二个 HTTP 请求来加载`Location`字段中指定的页面。对于其他方面的信息含义,则与`GET`请求的响应信息类似。 +请求的响应如下。状态码 `302 FOUND` 告知浏览器,服务端已收到它提交的 post 请求,它必须再发出第二个 HTTP 请求来加载 `Location` 字段中指定的页面。对于其他方面的信息含义,则与 `GET` 请求的响应信息类似。 ```http HTTP/1.1 302 FOUND @@ -178,7 +175,7 @@ Vary: Cookie Vary: Accept-Encoding Content-Type: text/html; charset=utf-8 Date: Wed, 07 Sep 2016 00:38:13 GMT -Location: https://developer.mozilla.org/en-US/profiles/hamishwillee +Location: https://developer.mozilla.org/zh-CN/profiles/hamishwillee Keep-Alive: timeout=5, max=1000 Connection: Keep-Alive X-Frame-Options: DENY @@ -191,7 +188,7 @@ Content-Length: 0 ## 静态网站 -静态网站是指每当请求一个特定的资源时,会从服务器返回相同的硬编码内容。因此,例如,如果你在 `/static/myproduct1.html` 有一个关于产品的页面,则该页面将返回给每个用户。如果你添加另一个类似的产品到你的网站,你将需要添加另一个页面(例如 `myproduct2.html` )等。这可能开始变得非常低效:当你访问数千个产品页面时会发生什么——你会在每个页面(基本的页面模板,结构等等)上重复很多代码,如果你想改变页面结构的任何东西,比如添加一个新的“相关产品”部分,必须单独更改每个页面。 +静态网站是指每当请求一个特定的资源时,会从服务器返回相同的硬编码内容。因此,例如,如果你在 `/static/myproduct1.html` 有一个关于产品的页面,则该页面将返回给每个用户。如果你添加另一个类似的产品到你的网站,你将需要添加另一个页面(例如 `myproduct2.html`)等。这可能开始变得非常低效:当你访问数千个产品页面时会发生什么——你会在每个页面(基本的页面模板,结构等等)上重复很多代码,如果你想改变页面结构的任何东西,比如添加一个新的“相关产品”部分,必须单独更改每个页面。 > [!NOTE] > 当你有少量页面时,向每个用户发送相同的内容时,静态网站是最佳选择,然而随着页面数量的增加,它们的维护成本也会很高。 diff --git a/files/zh-cn/web/api/headers/headers/index.md b/files/zh-cn/web/api/headers/headers/index.md index 54491d965236a0..c82f5d08e6c9f5 100644 --- a/files/zh-cn/web/api/headers/headers/index.md +++ b/files/zh-cn/web/api/headers/headers/index.md @@ -1,66 +1,78 @@ --- -title: Headers() +title: Headers:Headers() 构造函数 slug: Web/API/Headers/Headers +l10n: + sourceCommit: 2c641e08878722bf29fb784d58c61873ce4a133a --- -{{APIRef("Fetch")}}{{ SeeCompatTable() }} +{{APIRef("Fetch API")}} {{AvailableInWorkers}} -使用 `Headers()` 构造方法创建一个新的 {{domxref("Headers")}} 对象。 +`Headers()` 构造方法创建一个新的 {{domxref("Headers")}} 对象。 -## Syntax +## 语法 -```js -var myHeaders = new Headers(init); +```js-nolint +new Headers() +new Headers(init) ``` -### Parameters +### 参数 -- _init_ {{optional_inline}} - - : 通过一个包含任意 [HTTP headers](/zh-CN/docs/Web/HTTP/Headers) 的对象来预设你的 `Headers`. 可以是一个{{domxref("ByteString")}} 对象; 或者是一个已存在的 `Headers` 对象。 +- `init` {{optional_inline}} + - : 通过一个包含任意 [HTTP 标头](/zh-CN/docs/Web/HTTP/Headers)的对象来预设你的 `Headers`。可以是一个带有 {{jsxref("String")}} 值的简单对象字面量、一个名称—值对(每个队组均为二元字符串数组)的数组,或者是一个已存在的 `Headers` 对象。对于最后一种情况,新的 `Headers` 对象从已存在的 `Headers` 对象中拷贝数据。 -## Example +## 示例 创建一个空的 `Headers` 对象: ```js -var myHeaders = new Headers(); // Currently empty +const myHeaders = new Headers(); // 目前为空 ``` -你可以使用{{domxref("Headers.append")}}方法添加一个 header 并赋值: +你可以使用 {{domxref("Headers.append")}} 方法添加一个标头: ```js myHeaders.append("Content-Type", "image/jpeg"); -myHeaders.get("Content-Type"); // Returns 'image/jpeg' +myHeaders.get("Content-Type"); // 返回“image/jpeg” ``` -或者你可以在 Headers 对象创建时添加多个 header. 在下面的示例中我们创建了一个新的{{domxref("Headers")}} 对象,并通过 Headers 构造函数中 init 属性来添加多个 header: +或者你可以在 `Headers` 对象创建时添加多个标头。在下面的片段中,我们通过向构造函数传递一个 init 对象作为参数来创建一个新的 {{domxref("Headers")}} 对象: ```js -var httpHeaders = { +const httpHeaders = { "Content-Type": "image/jpeg", - "Accept-Charset": "utf-8", "X-My-Custom-Header": "Zeke are cool", }; -var myHeaders = new Headers(httpHeaders); +const myHeaders = new Headers(httpHeaders); +``` + +你可以通过传入一个已存在的 `Headers` 对象作为 init 对象来创建另一个新的 `Headers` 对象: + +```js +const secondHeadersObj = new Headers(myHeaders); +secondHeadersObj.get("Content-Type"); // 会返回“image/jpeg”——其继承自第一个 headers 对象 ``` -`你可以通过 init 属性将一个已存在的 Headers 对象来创建另一个新的 Headers 对象`: +你还可以在创建 `Headers` 对象时使用一个二维数组来添加多个具有相同值的标头。在下面的片段中,我们通过向构造函数传递一个 init 数组作为参数来创建一个新的、具有多个 `Set-Cookie` 标头的 {{domxref("Headers")}} 对象: ```js -var secondHeadersObj = new Headers(myHeaders); -secondHeadersObj.get("Content-Type"); // Would return 'image/jpeg' — it inherits it from the first headers object +const headers = [ + ["Set-Cookie", "greeting=hello"], + ["Set-Cookie", "name=world"], +]; +const myHeaders = new Headers(headers); ``` -## Specifications +## 规范 {{Specifications}} -## Browser compatibility +## 浏览器兼容性 {{Compat}} -## See also +## 参见 -- [ServiceWorker API](/zh-CN/docs/Web/API/ServiceWorker_API) -- [HTTP access control (CORS)](/zh-CN/docs/Web/HTTP/Access_control_CORS) +- [ServiceWorker API](/zh-CN/docs/Web/API/Service_Worker_API) +- [HTTP 访问控制(CORS)](/zh-CN/docs/Web/HTTP/CORS) - [HTTP](/zh-CN/docs/Web/HTTP) diff --git a/files/zh-cn/web/api/htmlformelement/index.md b/files/zh-cn/web/api/htmlformelement/index.md index 7855b63f6dc018..32b40dcc341172 100644 --- a/files/zh-cn/web/api/htmlformelement/index.md +++ b/files/zh-cn/web/api/htmlformelement/index.md @@ -2,7 +2,7 @@ title: HTMLFormElement slug: Web/API/HTMLFormElement l10n: - sourceCommit: c99afd3cafe73c93831bd73ad1dac285c3c713b1 + sourceCommit: 56cbe48e4426172461d9297523b68716922690e5 --- {{APIRef("HTML DOM")}} @@ -30,7 +30,7 @@ _此接口还从其父接口 {{domxref("HTMLElement")}} 继承属性。_ - {{domxref("HTMLFormElement.encoding")}} 或 {{domxref("HTMLFormElement.enctype")}} - : 反映表单的 [`enctype`](/zh-CN/docs/Web/HTML/Element/form#enctype) HTML 属性值的字符串,表示用于将表单传输到服务器的内容类型。只能设置特定的值。这两个属性是同义词。 - {{domxref("HTMLFormElement.acceptCharset")}} - - : 反映表单的 [`accept-charset`](/zh-CN/docs/Web/HTML/Element/form#accept-charset) HTML 属性值的字符串,表示服务器接受的字符编码。 + - : 反映表单的 [`accept-charset`](/zh-CN/docs/Web/HTML/Element/form#accept-charset) HTML 属性值的字符串。 - {{domxref("HTMLFormElement.autocomplete")}} - : 反映表单的 [`autocomplete`](/zh-CN/docs/Web/HTML/Element/form#autocomplete) HTML 属性值的字符串,表示此表单中的控件是否可以由浏览器自动填充其值。 - {{domxref("HTMLFormElement.noValidate")}} @@ -91,13 +91,13 @@ _此接口还从其父接口 {{domxref("HTMLElement")}} 继承方法。_ 例如: -- `` 会优先于 `
`。这意味着 `form.id` 不会引用表单的 id,而是引用名称为“`id`”的元素。这也适用于其他表单属性,例如 `` 或 ``。 +- `` 会优先于 ``。这意味着 `form.id` 不会引用表单的 id,而是引用名称为 `"id"` 的元素。这也适用于其他表单属性,例如 `` 或 ``。 - `` 会使表单的 `elements` 集合无法访问。引用 `form.elements` 现在将引用单个元素。 要避免这些元素名称的问题,你应该: - *始终*使用 `elements` 集合来避免元素名称和表单属性之间的歧义。 -- *切勿*将“`elements`”作为元素名称。 +- *切勿*将 `"elements"` 作为元素名称。 如果你不使用 JavaScript,这不会造成问题。 @@ -187,10 +187,10 @@ f.submit(); // 调用表单的 submit() 方法

- +

- +

diff --git a/files/zh-cn/web/html/attributes/index.md b/files/zh-cn/web/html/attributes/index.md index 15f19225aa3da4..661a985a889e18 100644 --- a/files/zh-cn/web/html/attributes/index.md +++ b/files/zh-cn/web/html/attributes/index.md @@ -32,7 +32,7 @@ HTML 中的元素拥有**属性**(attribute);这些额外的值可以配 accept-charset {{ HTMLElement("form") }} - 支持的字符集列表。 + 字符集,必须为 "UTF-8"(如果提供)。 diff --git a/files/zh-cn/web/html/element/form/index.md b/files/zh-cn/web/html/element/form/index.md index 27a966af6e40e0..1300d353dde955 100644 --- a/files/zh-cn/web/html/element/form/index.md +++ b/files/zh-cn/web/html/element/form/index.md @@ -22,8 +22,7 @@ slug: Web/HTML/Element/form > **备注:** **此属性已在 HTML5 中被移除并且不再被使用**。作为替代,可以使用 `` 元素中的 [`accept`](/zh-CN/docs/Web/HTML/Element/input#accept) 属性。 - `accept-charset` - - : 一个空格分隔或逗号分隔的列表,此列表包括了服务器支持的字符编码。浏览器以这些编码被列举的顺序使用它们。默认值是一个保留字符串 `"UNKNOWN"`。此字符串指的是,和包含此表单元素的文档相同的编码。 - 在之前版本的 HTML 中,不同的字符编码可以用空格或逗号分隔。在 HTML5 中,只有空格可以允许作为分隔符。 + - : 服务器接受的{{Glossary("character encoding", "字符编码")}}。规范允许使用单个不区分大小写的值——`"UTF-8"`,反应了这种编码的普遍性(历史上,可以以逗号分隔列表或空格分隔列表的形式指定多个字符编码)。 - `autocapitalize` {{non-standard_inline}} - : 这是一个被 iOS Safari 使用的非标准属性。当用户在一些表单的文本后代控件中,输入/编辑一些文本值时,此属性控制了这些文本值的首字母是否大写或者使用其他的大写样式。如果 `autocapitalize` 属性在某个单独的表单后代控件被指定的话,那么此单独的设定会覆盖原来表单范围内的 `autocapitalize` 设定。默认值为 `sentences`。可以选择的值如下: diff --git a/files/zh-cn/web/http/content_negotiation/index.md b/files/zh-cn/web/http/content_negotiation/index.md index 0a418fe0bd0def..8fbf8f21ab3a9f 100644 --- a/files/zh-cn/web/http/content_negotiation/index.md +++ b/files/zh-cn/web/http/content_negotiation/index.md @@ -29,7 +29,7 @@ slug: Web/HTTP/Content_negotiation ![客户端请求一个 URL,其中标头表示对内容类型的偏好。服务器有多个由 URL 表示的资源并根据偏好的语言发回内容,然后根据客户端的请求标头压缩请求主体](httpnegoserver.png) -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)的运作更有效。 +HTTP/1.1 规范指定了一系列的标准标头用于启动服务端驱动型内容协商({{HTTPHeader("Accept")}}、{{HTTPHeader("Accept-Encoding")}}、{{HTTPHeader("Accept-Language")}})。尽管严格来说 {{HTTPHeader("User-Agent")}} 并不在此列,有时候它还是会被用来确定给客户端发送的所请求资源的特定表示形式,不过这种做法不提倡使用。服务器会使用 {{HTTPHeader("Vary")}} 标头来说明实际上哪些标头被用作内容协商的参考依据(确切来说是与之相关的响应标头),这样可以使[缓存](/zh-CN/docs/Web/HTTP/Caching)的运作更有效。 除此之外,有一个向可供选择的列表中增加更多标头的实验性提案,称为*客户端提示*(Client Hint)。客户端示意机制可以告知运行用户代理的设备类型(例如,是桌面计算机还是移动设备)。 diff --git a/files/zh-cn/web/http/headers/accept-charset/index.md b/files/zh-cn/web/http/headers/accept-charset/index.md deleted file mode 100644 index 90a3fdc49a96ad..00000000000000 --- a/files/zh-cn/web/http/headers/accept-charset/index.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: Accept-Charset -slug: Web/HTTP/Headers/Accept-Charset -l10n: - sourceCommit: 0880a90f3811475d78bc4b2c344eb4146f25f66c ---- - -{{HTTPSidebar}} - -> [!WARNING] -> 请勿使用此标头。浏览器会省略此标头,服务器也应当忽略它。 - -**`Accept-Charset`** 请求 HTTP 标头曾是一个用于声明客户端支持的{{glossary("character encoding", "字符编码")}}的标头。如今已不再广泛使用。 - -UTF-8 得到广泛支持,并且是字符编码的压倒性首选方案。为了[通过减少基于配置的熵来确保更好的隐私](https://www.eff.org/deeplinks/2010/01/primer-information-theory-and-privacy),所有浏览器均省略了 `Accept-Charset` 标头。 - -如今,`Accept-Charset` 值得注意之处在于它是几个[禁止修改的标头](/zh-CN/docs/Glossary/Forbidden_header_name)之一。 - - - - - - - - - - - - -
标头类型{{Glossary("Request header", "请求标头")}}
{{Glossary("Forbidden header name", "禁止修改的标头")}}
- -## 参见 - -- HTTP [内容协商机制](/zh-CN/docs/Web/HTTP/Content_negotiation) -- [不要再用 Accept-Charset 了](https://hsivonen.fi/accept-charset/) -- 用来表示内容协商结果的标头:{{HTTPHeader("Content-Type")}} -- 其他类似的标头:{{HTTPHeader("TE")}}、{{HTTPHeader("Accept-Encoding")}}、{{HTTPHeader("Accept-Language")}}、{{HTTPHeader("Accept")}} diff --git a/files/zh-cn/web/http/status/406/index.md b/files/zh-cn/web/http/status/406/index.md index 888c25503482e3..680b7bd934fe76 100644 --- a/files/zh-cn/web/http/status/406/index.md +++ b/files/zh-cn/web/http/status/406/index.md @@ -5,7 +5,7 @@ slug: Web/HTTP/Status/406 {{HTTPSidebar}} -HTTP 协议中的 **`406 Not Acceptable`** 状态码表示客户端错误,指代服务器端无法提供与 {{HTTPHeader("Accept-Charset")}} 以及 {{HTTPHeader("Accept-Language")}} 消息头指定的值相匹配的响应。 +HTTP **`406 Not Acceptable`** [客户端错误响应](/zh-CN/docs/Web/HTTP/Status#客户端错误响应)状态码表示服务器无法根据请求的[主动内容协商](/zh-CN/docs/Web/HTTP/Content_negotiation#服务端驱动型内容协商机制)标头中定义的可接受值的列表产生匹配的响应,并且服务器不愿意提供默认表示。 主动内容协商标头包括: @@ -19,7 +19,7 @@ HTTP 协议中的 **`406 Not Acceptable`** 状态码表示客户端错误,指 ## 状态 -```plain +```http 406 Not Acceptable ``` @@ -29,6 +29,8 @@ HTTP 协议中的 **`406 Not Acceptable`** 状态码表示客户端错误,指 ## 参见 +- [HTTP 响应状态码](/zh-CN/docs/Web/HTTP/Status) +- {{HTTPHeader("Accept")}} +- {{HTTPHeader("Accept-Encoding")}} - {{HTTPHeader("Accept-Language")}} -- {{HTTPHeader("Accept-Charset")}} - HTTP [内容协商](/zh-CN/docs/Web/HTTP/Content_negotiation)