云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

云解析_360云存储_0元

小七 141 0

使用Cloudflare Workers进行技术搜索引擎优化

这是伊戈尔·克雷斯托夫和丹·泰勒的客座帖子。Igor是盐业代理,和丹的首席技术搜索引擎优化顾问,并已被认为是创造了术语"边缘搜索引擎优化"。盐业代理是一家技术搜索引擎优化机构,在伦敦、利兹和波士顿设有办事处,为世界各地的品牌提供定制咨询服务。你可以通过推特。用这篇文章我们展示了Cloudflare Workers在搜索引擎优化方面的潜在应用,使用我们过去一年的研究和测试,通常称之为"搜索引擎优化"懒惰。这个post的目标读者既有精通编写performantjavascript的读者,也有完全新手,以及技术含量较低的利益相关者,他们没有真正编写过多少行代码以前。没完没了实际应用为了克服多年来与不同客户和项目的合作障碍,我们不断遇到同样的问题和障碍,使他们的网站达到"卓越的技术搜索引擎优化"。这些问题很多来自于企业级的平台限制、遗留技术堆栈、不正确的构建以及多年来将各种服务和基础设施一个由SEO技术顾问组成的团队,我们常常会因为这些障碍而感到沮丧,这通常会导致必要的修复和实现要么不可能实现,要么一次延迟几个月(如果不是几年),而在这个时候,业务经常会失去流量,而且收入。工人为我们提供了一个万岁解决方案,以解决许多常见的挫折,在获得技术搜索引擎优化,我们相信,从长远来看,可以成为这是克服遗留问题、降低DevOps成本、加快交付周期的一个重要组成部分,此外,还利用了一个全球分布的无服务器平台,具有快速的冷启动功能时代。创造scale的可访问性当我们刚开始时,我们需要实现简单的重定向,这应该很容易在大多数平台,但在此中不受支持实例。什么时候第二个障碍出现了,我们需要注入Hreflang标签,将定制平台上的一个旧的多语言网站交叉链接到一个过时的规范中。这需要实验来找到一种有效的方法来实现标签,而不会增加延迟或向服务器添加新代码-以适合搜索引擎的方式爬行。在在这一点上,我们有许多其他的工人应用程序,随着非开发人员需要能够修改和部署新的工人代码。这已经成为一种通过webui或命令生成工作代码的思想线。有为工人建立了许多不同的用例,我们确定了3个处理过程阶段:传入请求修改-更改源站请求URL或添加授权标题。传出响应修改-添加安全头,Hreflang头注射,日志记录。响应身体修改-注入/改变内容,例如规范、机器人和JSON。我们希望生成精简的工人代码,使我们能够保持每个功能都包含在其中,并且独立于另一个功能,并采用了过滤链的思想,它可以用来组成相当复杂的请求处理。一个描述请求在从客户端到源服务器再到另一个服务器的过程中被转换的路径的一个请求链。我们从非技术角度确定的一个关键的可访问性问题是试图使这种无服务器技术在搜索引擎优化中对所有人都可访问,因为理解来自利益相关者。为了做到这一点,我们不得不工人:无障碍不了解如何编写JavaScript/Performant的用户JavaScriptProcess of implementation可以补充现有的部署过程实现过程是安全的(内部和外部)实现过程符合数据和隐私策略实现必须能够在我们深入实际的过滤器之前,通过现有的过程和实践(BAU)进行了验证,下面是部分TypeScript接口来说明过滤器API:接口筛选器执行器{应用(filterChain:{next:(c:Context,obj:Type)=>ReturnType | Promise}>,Context:Context,obj:Type):ReturnType | Promise;}接口请求筛选器上下文{//请求URLurl:url;//短路请求滤波器回复(回复:回复|承诺):无效;//短路所有过滤器响应与停止(响应:响应|承诺):无效;//添加附加响应筛选器appendResponseFilter(筛选器:ResponseFilter):无效;//添加正文筛选器appendBodyFilter(filter:BodyFilter):void;}接口RequestFilter扩展FilterExecutor{};接口响应筛选器上下文{只读startMs:number;只读端:number;只读url:url;waitUntil(promise:promise):无效;回复(回复:回复|承诺):无效;响应与停止(响应:响应|承诺):无效;appendBodyFilter(filter:BodyFilter):void;}接口ResponseFilter扩展FilterExecutor{};接口BodyFilterContext{waitUntil(promise:promise):无效;}接口块链{public next:ChunkChain | null;public chunk:Uint8Array;}接口BodyFilter扩展MutableFilterExecutor{};请求过滤器-简单重定向首先,我们想指出的是,这是一个非常利基的用例,如果你的平台本机支持重定向,你绝对应该通过你的平台来做,但是有许多有限的、遗留的或定制的平台,其中重定向不受支持或受到限制,或者由(每行)收取费用你的主机或平台。例如,Github页面只支持通过HTML刷新meta标记进行重定向。最基本的重定向过滤器this:类重定向请求筛选器{构造函数(重定向){this.重定向=重定向;}应用(过滤器链、上下文、请求){常量重定向=this.重定向[上下文.url.href];如果(重定向)上下文.响应(新回复(''{状态:301,标题:{"位置":重定向}}));其他的返回下一个过滤器链(上下文、请求);}}const{requestFilterHandle}=自我懒惰要求('./工人.js');requestFilterHandle.append(新的RedirectRequestFilter({"https://slath.cloud/old-homepage": "https://slath.cloud/"}));你可以在Cloudflare的操场上看到它给你。那个Sloth中实现的一个支持基本路径匹配、主机名匹配和查询字符串匹配,以及通配符用于可视化创建和修改重定向的Sloth dashboard。当您没有太多重定向需要管理时,这一切都很好,但当重定向的大小开始占用工作线程可用的大量内存时,您该怎么办?这是我们面临的另一个扩展问题,在采取少数可能的重定向,到几十个几千。管理重定向与工人KV和布谷鸟过滤器好,这里有一个方法,你可以解决它使用工人KV-一个关键值数据去商店吧硬编码重定向工人代码,我们将他们存储在工人KV。天真的方法是检查每个URL的重定向。但是工人KV,在任何给定的数据中,直到以每秒一次的顺序读取一个密钥,才能达到最大性能中间。替代品可能是使用概率数据结构,如布谷鸟过滤器,以千伏存储,可能在两个密钥之间分割,因为千伏限制在64KB。这样的过滤器流将是:检索频繁读取的过滤器钥匙。检查是否在过滤器。获取使用URL作为键从Worker KV重定向。在我们的测试中,我们成功地将2万个重定向打包到buckoo Filter中,占用128KB,分为2个键,根据10万个活动URL进行验证,误报率为0.5-1%。Body Filter-Hreflang InjectionHreflang meta标记需要放在HTML元素中,因此在实际注入它们之前,我们需要找到head HTML标记的开始或结束,这本身就是一个流式搜索问题。这里需要注意的是,将UTF-8解码为JavaScript字符串、执行搜索、重新编码回UTF-8的天真方法相当缓慢。相反,我们尝试在字节字符串(Uint8Array)上进行纯JavaScript搜索,结果很快就显示出了很有希望的结果。对于我们的用例,我们选择了Boyer-Moore-horsool算法作为流式搜索的基础,因为它简单,具有很好的平均情况性能,并且只需要一个预处理的搜索模式,在块上手动匹配前缀/后缀边界。这里是我们在节点v10.15.0上测试的方法的比较:|块大小|方法|操作/秒||------------|--------------------------------------|---------------------|| | | ||1024字节| Boyer Moore Horsool over byte array | 163086操作/秒||1024字节|**通过字节数组预计算BMH**|**424948操作/秒**||1024字节|将utf8解码为strings&indexOf()| 91685 ops/sec|| | | ||字节数为2048字节/秒||2048字节|**通过字节数组预计算BMH**|**232192操作/秒**||2048字节|将utf8解码为strings&indexOf()| 52787 ops/秒|| | | ||4096字节| Boyer Moore Horsool over byte array | 78729操作/秒||4096字节|**通过字节数组预计算BMH**|**117010操作/秒**||4096字节|将utf8解码为strings&indexOf()| 25835 ops/sec |我们能做得更好吗?通过纯JavaScript搜索而不是简单的方法实现了不错的性能改进,我们想看看