请注意,本答案末尾还有一个警告!
适用于Chrome 96及更高版本的manifest.json,
在安装过程中不会显示单独的"阻止页面内容"权限。
"minimum_chrome_version": "96",
"permissions": ["declarativeNetRequestWithHostAccess"],
"host_permissions": ["*://*.example.com/"],
"background": {"service_worker": "bg.js"},
使用 initiatorDomains
和 requestDomains
的 Chrome 101 及更高版本的 bg.js
(不要忘记在 manifest.json 中添加 "minimum_chrome_version": "101"
)
const iframeHosts = [
'example.com',
];
chrome.runtime.onInstalled.addListener(() => {
const RULE = {
id: 1,
condition: {
initiatorDomains: [chrome.runtime.id],
requestDomains: iframeHosts,
resourceTypes: ['sub_frame'],
},
action: {
type: 'modifyHeaders',
responseHeaders: [
{header: 'X-Frame-Options', operation: 'remove'},
{header: 'Frame-Options', operation: 'remove'},
],
},
};
chrome.declarativeNetRequest.updateDynamicRules({
removeRuleIds: [RULE.id],
addRules: [RULE],
});
});
旧版Chrome 84-100
如果您的扩展程序需要与这些旧版本兼容,请使用以下内容。
适用于Chrome 84及更高版本的manifest.json,
在安装过程中显示了一个单独的权限,用于"阻止页面内容"
"permissions": ["declarativeNetRequest"],
"host_permissions": ["*://*.example.com/"],
"background": {"service_worker": "bg.js"},
使用已弃用的domains
的Chrome 84及更高版本的bg.js
const iframeHosts = [
'example.com',
];
chrome.runtime.onInstalled.addListener(() => {
chrome.declarativeNetRequest.updateDynamicRules({
removeRuleIds: iframeHosts.map((h, i) => i + 1),
addRules: iframeHosts.map((h, i) => ({
id: i + 1,
condition: {
domains: [chrome.runtime.id],
urlFilter: `||${h}/`,
resourceTypes: ['sub_frame'],
},
action: {
type: 'modifyHeaders',
responseHeaders: [
{header: 'X-Frame-Options', operation: 'remove'},
{header: 'Frame-Options', operation: 'remove'},
],
},
})),
});
});
警告:请小心网站的服务工作者
在添加iframe或打开扩展页面之前,您可能需要删除网站(s)的服务工作者并清除其缓存,因为许多现代网站使用服务工作者创建页面而无需进行网络请求,从而忽略我们的头部剥离规则。
在manifest.json中的"permissions"中添加"browsingData"。
清除SW:
```javascript
function removeSW(url) {
return chrome.browsingData.remove({
origins: [new URL(url).origin],
}, {
cacheStorage: true,
serviceWorkers: true,
});
}
```
// 如果在DOM中添加iframe元素:
```javascript
async function addIframe(url, parent = document.body) {
await removeSW(url);
const el = document.createElement('iframe');
parent.appendChild(el);
el.src = url;
return el;
}
```
// 如果在扩展页中打开一个带有