否定"网址"使用onBeforeRequest模式

时间:2016-05-30 23:12:36

标签: javascript google-chrome-extension

<!DOCTYPE HTML>

<html>
<head>
    <title>Checklist</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js"></script>
</head>
<body>  

    <input type="text" id="item" placeholder="Enter an item">
    <button id="add">Add Item</button>

</body>
</html>

我没有看到任何可以否定网址格式的方法。基本上我想匹配并阻止除3个域之外的所有内容。我想到了返回cancel:true for和3个域的确切内容。首先是工作或将是一个倾听者&#34;过度采取&#34;另一个?如何返回确切的内容(所以不再取消:true)。

2 个答案:

答案 0 :(得分:3)

以下示例说明了如何阻止除domain1.net和domain2.net的请求之外的所有请求:

    chrome.webRequest.onBeforeRequest.addListener(
       function(details) {
         return {cancel: details.url.indexOf(".domain2.net/") == -1 && details.url.indexOf(".domain1.net/") == -1};
       },
    {urls: ["<all_urls>"]},
    ["blocking"]);

我无法在the documentation

中看到任何否定网址格式的方法

以下答案由Xan提供,有更好的方法来验证domain1.net和domain2.net网址。

答案 1 :(得分:3)

虽然保罗·普雷斯特斯的答案大多是正确的(包括&#34;负面&#34;过滤器不可能),但建议的过滤器很容易被绕过。

考虑:https://example.com/something?foo=.domain2.net/

这符合规则,但显然不是故意的。添加意外参数不会影响大多数页面,因此它是一个非常微不足道的旁路。

调整为提取域的正则表达式集合应该更加健壮:

function validUrl(url) {
  // RegEx, explained:
  // ^              at the beginning of the string
  // http           exactly "http"
  // s?             "s" or nothing
  // :\/\/          exactly "://"
  // ([^\/]+\.)?    (one or more not-"/" followed by ".") or nothing
  // domain\.net\/  exactly "domain1.net/"

  return /^https?:\/\/([^\/]+\.)?domain1\.net\//.test(url) ||
         /^https?:\/\/([^\/]+\.)?domain2\.net\//.test(url) ||
         /^https?:\/\/([^\/]+\.)?domain3\.net\//.test(url) 
}

/* ... */
  return {cancel: !validUrl(details.url)};
/* ... */