Chrome中declarativeNetRequest规则(HeaderOperation.REMOVE)生效时机问询
Chrome中declarativeNetRequest移除响应头后webRequest仍能看到原始头的原因
结论
是的,即便某扩展通过declarativeNetRequest的HeaderOperation.REMOVE移除了响应头,其他使用webRequest API的扩展仍会接收到原始的响应头,这是Chrome扩展API的预期行为。
行为逻辑
Chrome扩展的网络拦截流程存在明确的顺序:
- 服务器返回响应头后,Chrome首先触发所有注册了
webRequest.onHeadersReceived的监听器,此时传递给监听器的是未经过任何扩展修改的原始响应头。 - 所有
webRequest监听器处理完成后,Chrome才会执行declarativeNetRequest的规则(包括移除、修改响应头的操作)。 - 最终经过
declarativeNetRequest修改后的响应头才会被传递给目标页面,这也是你通过测试工具能看到头已被移除的原因。
官方文档依据
根据Chrome扩展官方文档的定义:
webRequestAPI的事件触发时机早于declarativeNetRequest的规则应用阶段。webRequest.onHeadersReceived事件的触发条件是「响应头已被接收但尚未被修改」,因此监听器获取的是原始数据。- 文档明确指出,
webRequest监听器不会看到其他扩展(包括使用declarativeNetRequest的扩展)对请求/响应数据的修改结果,仅能访问原始的网络数据。
补充说明
两种API的设计定位不同:
webRequest提供细粒度的网络拦截能力,核心是让开发者访问原始的网络请求/响应数据。declarativeNetRequest则是为了高效批量应用网络规则,修改最终传递给页面的网络内容,其操作不会回溯影响已触发的webRequest事件。
内容的提问来源于stack exchange,提问作者Tschösi
相关产品推荐
相关产品推荐

