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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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>
|