【问题标题】:Cloudflare Workers - changes are not visible on live (but are in preview)Cloudflare Workers - 更改在实时中不可见(但处于预览状态)
【发布时间】:2021-08-30 05:29:51
【问题描述】:

您好,感谢您的帮助。 遗憾的是,CF 的支持人员认为他们不需要帮助我。

我正在学习使用 worker,并编写了一个简单的 HTML 注入器,只是为了看到它在我的网站上运行。

这是我拥有的完整工作代码:

async function handleRequest(req) {
  const res = await fetch(req)
  const contentType = res.headers.get("Content-Type")

  console.log('contentType: ', contentType)
  
  // If the response is HTML, it can be transformed with
  // HTMLRewriter -- otherwise, it should pass through
  if (contentType.startsWith("text/html")) {
    return rewriter.transform(res)
  } else {
    return res
  }
}




class UserElementHandler {
    async element(element) {
        
        element.before("<div class='contbox'><img src='https://coverme.co.il/wp-content/uploads/2020/01/covermeLOGO-01-1024x183.png' style='width:200px;margin:20px;'><h1>testing inserting</h1></div>", {html: true});
        
      // fill in user info using response
    }
  }

    

const rewriter = new HTMLRewriter()
.on("h1", new UserElementHandler())


addEventListener("fetch", event => {
  event.respondWith(handleRequest(event.request))
})

它只是使用 element.before 来注入一些 HTML。 在工作人员预览窗格中,我可以看到它! 但在现场 = 什么都没有。

这是活动 URL:[https://coverme.co.il/product/%D7%A0%D7%A8-%D7%91%D7%99%D7%A0%D7%95%D7% A0%D7%99-晚香玉/]

这些是我设置的 4 条路线来尝试捕捉这一点,无论是否对字母进行编码:

coverme.co.il/product/נר-בינוני-tuberosejasmine/
*.coverme.co.il/product/נר-בינוני-tuberosejasmine/*
https://coverme.co.il/product/%D7%A0%D7%A8-%D7%91%D7%99%D7%A0%D7%95%D7%A0%D7%99-tuberosejasmine/
*.coverme.co.il/product/%D7%A0%D7%A8-%D7%91%D7%99%D7%A0%D7%95%D7%A0%D7%99-tuberosejasmine/*

提前致谢!

【问题讨论】:

    标签: cloudflare-workers


    【解决方案1】:

    我认为这里的问题是您已将路由配置为匹配未转义的“נר-בינוני”,但浏览器实际上会在发送到服务器之前对 URL 进行百分比编码,因此路由匹配实际上在百分比上运行转义的 URL。所以实际的 URL 是https://coverme.co.il/product/%D7%A0%D7%A8-%D7%91%D7%99%D7%A0%D7%95%D7%A0%D7%99-tuberosejasmine/,这与你的路由不匹配,因为%D7%A0%D7%A8-%D7%91%D7%99%D7%A0%D7%95%D7%A0%D7%99 不被认为与נר-בינוני 相同。

    编辑:不幸的是,由于已知错误,在您的路由模式中使用百分比编码不会解决问题。不幸的是,现在无法在 Workers 路由中匹配非 ASCII 字符。我们打算修复这个问题,但这很难,因为有些网站会意外地依赖于被破坏的行为,所以修复会破坏它们。

    您可以做的是匹配coverme.co.il/product/*,然后在您的工作人员内部检查路径是否也有נר-בינוני-tuberosejasmine。如果没有,那么您的 fetch 事件处理程序应该直接返回而不调用event.respondWith()。这将触发请求的“默认处理”,这意味着它将像往常一样通过并发送到您的源服务器。 (请注意,您仍然需要为工人请求付费。)

    所以,是这样的:

    addEventListener("fetch", event => {
      if (event.request.url.includes(
          "coverme.co.il/product/נר-בינוני-tuberosejasmine/")) {
        event.respondWith(handle(event.request));
      } else {
        return;  // not a match, use default pass-through handling
      }  
    })
    

    【讨论】:

    • 谢谢肯顿。我已经尝试过了,但它不起作用。我也离开了其他路线。还有其他想法吗?它在工作人员的预览窗格中工作,但不适用于常规实时浏览
    • @tarkil 坏消息,我检查了一下,结果发现这是一个已知错误...当路由包含非 ASCII 字符时,无论您是否对它们进行百分比编码,Worker 路由模式都将不起作用.错误是系统当前解码路由模式中的百分比编码,但随后尝试将它们与总是百分比编码的请求 URL 进行匹配,因此它们永远不会匹配。我们想修复它,但事实证明现在很多人都依赖于被破坏的行为并且“修复”它会破坏他们的网站,所以这很难。 :(
    • 那么,如果我在常规 URL 上进行测试,它应该可以工作吗?唯一的问题是 URL 上的字符?
    • 我添加了另一条路线,“coverme.co.il/affiliate-area” - 同样,我的 HTML 没有显示在页面上。工人没有受到影响。
    • @tarkil 页面coverme.co.il/affiliate-area 中似乎没有任何

      标签,并且您的重写器在

      上触发,所以我想预计不会进行任何重写。

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    • 2023-02-10
    相关资源
    最近更新 更多