为什么 URL 重定向权限在 Chrome Manifest v2 而不是 v3 中有效?

Why does URL redirect permission work in Chrome Manifest v2 but not v3?

我正在尝试使用 Chrome declarativeWebRequest API 重定向 URL 但它不起作用。

“权限”键中的匹配模式适用于 Manifest V2,但它现在在 V3 中抛出 Permission '*://www.youtube.com/*' is unknown or URL pattern is malformed 错误。

manifest.json:

{
  "manifest_version": 3,
  "name": "Redirect Test",
  "version": "0.0.1",
  "permissions": [
    "declarativeNetRequest",
    "*://www.youtube.com/*"
  ],
  "host_permissions": [
    "*://www.youtube.com/*"
  ],
  "declarative_net_request": {
    "rule_resources": [
      {
        "id": "1",
        "enabled": true,
        "path": "rules.json"
      }
    ]
  }
}

rules.json:

[
    {
        "id": 1,
        "priority": 1,
        "action": {
            "type": "redirect",
            "redirect": {"url": "https://www.google.com"}
        },
        "condition": {
            "urlFilter": "*://www.youtube.com/*",
            "resourceTypes": [
                "main_frame"
            ]
        }
    }
]

我正在使用 Chrome 88.0.4324.104

发布时声明性网络请求的 manifest documentation 并不完全准确。

这是 文档中 manifest.json 中的权限键:

"permissions": [
    "declarativeNetRequest",
    "declarativeNetRequestFeedback",
    "*://example.com/*"
  ],

但是,应该仅在 host_permissions 中指定站点:

"host_permissions": [
    "*://example.com/*"
  ],

应该注意的是,只有在指定了 action.redirect 时才需要此显式声明,如本例所示:

{
        "id": 1,
        "priority": 3,
        "action": {
            "type": "redirect",
            "redirect": {
                "regexSubstitution": "www.youtube.com/embed/"
            }
        },
        "condition": {
            "regexFilter": "(www\.youtube\.com\/watch\?v=)",
            "resourceTypes": [
                "main_frame"
            ]
        }
}