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

数据库_阿里云配置二级域名_免费1年

小七 141 0

使用Workers在10分钟内交付一个无服务器的API

为了准备Chrome的Not Secure标志,当一个站点不能通过https访问时,它将更新指示器以显示Not Secure,我们希望人们能够测试他们的站点是否能够通过。如果你阅读了我们之前的博客文章,关于使用https存在的误解,以及准备你的站点,你可能已经注意到了一个小问题,允许你测试哪些站点被认为是"安全的"。为了准备这篇博文,我们的一位项目经理找我寻求帮助,让这把小提琴变得栩栩如生。这是一个简单的问题:我们需要一个运行逻辑的端点,看看给定的域是否会自动重定向到https。逻辑和要求非常简单:创建无服务器API终结点输入:域(例如。example.com网站)输出:"secure"/"not secure"逻辑:如果重定向到https://example.comReturn"安全"其他Return"不安全"这里的另一个要求是我们需要全程遵循重定向;站点通常重定向到首先是,然后重定向到https。这是我准备处理的另一行代码。我在以前的工作中做过一些软件工程,现在是Cloudflare的解决方案工程师,但我没有DevOps的经验。我已经设置了我相当份额的源服务器,安装了一些LAMP栈和NGINX(多亏了interwebs上一些非常详细的指南),但是设置一个服务器在上面运行10行代码的任务是艰巨的。即使使用Heroku这样的PaaS服务,也需要一些先决条件知识(和Github帐户)才能让你的"Hello,World"应用启动。使用Cloudflare Workers,我能够在几分钟内在web上获得一个端点。我没有花时间研究,99%的时间把上面非常简单的伪代码转换成真正的代码。另外1%用于添加DNS记录。在10分钟内,我就有了一个为PM测试域的demo-ready-cURL。工人addEventListener('fetch',事件=>{事件响应(手柄请求(事件请求))})/***获取请求并遵循重定向*@param{Request}请求*/异步函数handleRequest(请求){let headers=新标题({'内容类型':'文本/html','访问控制允许原点':'*'})const SECURE_RESPONSE=新响应('SECURE',{status:200,headers:headers})const unsecure_RESPONSE=新响应("不安全",{status:200,headers:headers})const NO_SUCH_SITE=new Response('website not found',{status:200,headers:headers})让域=新URL(请求.url).搜索参数.get("域")if(域===null){return new Response('请通过查询字符串传入域',{status:404})}试试看{让resp=await fetch(`${domain}`,{headers:{User-Agent':请求.headers.get('User-Agent')}})如果(响应重定向==真&&resp.url.startsWith("https"){返回安全_响应}否则如果(响应重定向==错误&&责任状态==502){不返回此类网站}其他{返回不安全的_响应}}接球(e){返回新的响应(`Something goods round${e}',{status:404})}}工人本身相当简单,但是让我们来看看它在做什么,因为这里有一些值得注意的事情。正在分析输入我最初考虑在一个帖子中把输入发送给工人。但是,考虑到输入相当简单,并且不需要身份验证,我决定在查询字符串中传入域会更容易。这里,我实例化一个新的URL对象,它将为我们处理所有URL解析。因为我没有使用或修改URL的任何其他方面,所以我在一行中执行对象的所有函数。但是,如果我查看其他部分,比如主机名或路径,那么我们定义一个单独的对象是有意义的。让域=新URL(请求.url).搜索参数.get("域")if(域===null){return new Response('请通过查询字符串传入域',{status:404})}这个URL.searchParams属性返回一个URLSearchParams对象,该对象允许我们直接获取要查找的查询字符串参数的值。在没有传递参数的情况下,我们返回一个错误响应。提出子请求接下来,我们需要向域发出一个子请求,并验证它是否将我们重定向到https。在fetch中,我们还将传入原始请求的User-Agent头,正如我们注意到的一些站点(例如谷歌)将针对不同的用户代理更改其响应。让resp=await fetch(`${domain}`,{headers:{User-Agent':请求.headers.get('User-Agent')}})如果(响应重定向==真&&resp.url.startsWith("https"){返回安全_响应}否则如果(响应重定向==错误&&责任状态==502){不返回此类网站}其他{返回不安全的_响应}以下重定向当我最初写这篇文章时,我做了比我真正需要做的更多的工作。为了覆盖一些网站的用例,首先重定向到它们的规范站点(> ),然后重定向到https,我检查重定向URL,并发出一个额外的子请求,然后检查结果。正如我们的一位工程师指出的,我白白做了所有额外的工作。默认情况下,当您进行新的获取时,在幕后实际发生的是重定向属性设置为follow。因此fetch(url)与fetch(url,{redirect:"follow"})相同。所以当我们在Worker中发出子请求时,最终响应url我们正在检查的属性将为我们提供重定向链的最终位置。有点不直观事件请求重定向属性默认设置为"手动"。因此,如果我们在子请求中继承了所有初始请求属性,那么就不会遵循重定向链,或者我们必须显式地重写它。这种默认设置有一个很好的理由:它允许普通的、传递的Cloudflare工作线程在源站假定他们实际上正在重定向客户端本身的情况下正常工作。一种情况是,HTTP重定向将浏览器发送到一个非HTTP URL,例如mailto:link,服务人员无法跟踪该URL。在本例中,重定向的目标接收者显然是浏览器。另一种情况是源代码需要浏览器用新的URL更新导航栏(比如从HTTP重定向到HTTPS时!)。如果Cloudflare Service Worker在将结果响应返回到浏览器之前遵循了重定向,则浏览器将无法在导航栏中显示正确的重定向URL。CORS标题let headers=新标题({'内容类型':'文本/html','访问控制允许原点':'*'})您可能已经注意到,在静态响应中,我们总是添加一个名为accesscontrolalloworigin的响应头。CORS头的目的是帮助保护来源不被其他网站访问。如果我们尝试直接在客户端(从浏览器端)运行我们的应用程序,浏览器将强制执行您要测试的域的CORS策略,并阻止这些请求。将Access Control Allow Origin设置为*将允许从此博客或任何其他尝试使用它的站点访问此端点(如果您希望将其嵌入到您的站点中,则可以!)。否则,如果博客文章中的javascript本身正在对多个域进行浏览器端调用,许多请求将被浏览器阻止。测试我们的员工在我构建Worker时,我使用预览UI来验证我在每一步都走在正确的轨道上。控制台输出对于简单的调试非常有用。例如,为了确保查询字符串被正确解析,我可以控制台.log(域)。在第一次尝试时很难让代码正确,而且也不总是清楚哪里出了问题。虽然预览并不能反映端到端的体验(一旦一个请求通过web传输,有许多变量可能会改变),但它是一个很好的开发工具,可以帮助验证过程中的进度。一旦我在预览版中完成了所有的工作,就到了真正测试的时候了:旋度。卷曲https://secure.ritakozlov.com/?域=cloudflare.com网站保护卷曲https://secure.ritakozlov.com/?域=maxisacutecat.club公司不安全而且很管用!现在,您可以通过在计算机上运行相同的cURL并调整domain参数来测试站点,或者可以在您的区域上部署上面的Worker,并拥有自己的测试端点。总而言之,Workers非常适合构建简单、无状态的无服务器应用程序(将flare添加到您的博客文章中,并超越它!)。我们总是很想知道你在建造什么!如果您希望与其他Cloudflare用户共享工作人员,或者想查看其他Cloudflare用户的工作人员,请访问Cloudflare社区论坛的workers部分中的"配方交换"。