这些要求并没有什么危害,但它们也会给您的 API 做事带来不必要的包袱。为什么不一有机会就阻挡它们呢?
---inbound: - name: "Reject all non-GET requests" expressions: - "req.method != 'GET'" actions: - type: "deny" config: status_code: 404
在这个 ngrok 的流量策略模块示例中,您可以有条件地掌握 HTTP 流量何时以及以何种办法来回于您的 API(或设备、做事、数据库等),详细取决于您支配的内容。ngrok 会根据每个要求评估规则,并利用不起眼的相应代码谢绝任何评估结果true(例如,利用方法的要求) 。POST404

仅利用几个 LOC、用通用表达式措辞(CEL) 编写的单个表达式以及 ngrok 强大的新要求变量库中的数十个项目之一,您就完备成功阻挡了 API 做事中的垃圾内容。
这些新的要求变量有什么用场?与连接变量一样,要求变量也是最近添加到流量策略中的,它们为 ngrok 开辟了以前不可能实现的新用例。通过让您访问标头、cookie、尾部和目标 URL 等详细信息,您可以过滤、采纳行动并终极塑造 HTTP 流量到达上游做事的办法。让我们分解这些机会,从每次要求时通过 ngrok 的一些原始要求数据开始。
GET /random HTTP/2X-Forwarded-For: 174.73.243.140X-Forwarded-Host: foo.example.comX-Forwarded-Proto: httpsAccept: /User-Agent: curl/8.7.1
第一行包含要点:
GET:HTTP 方法,定义用户希望实行的操作类型。通过req.method要求变量,您还可以看到诸如POST创建新数据或DELETE删除指定文档的方法。/random:此 HTTP 要求考试测验访问的路径,您可以在req.url.path或等浩瀚变量中找到它req.url.raw_path。HTTP/2:本次要求利用的HTTP协议版本,以 表示req.version。其余五行都是可选标头,ngrok 在将要求代理到 ngrok 代理和上游做事、运用程序或 API 之前会将其注入到要求中。您可以利用 整体访问这些标头req.cookies,或利用 从特定 cookie 中获取值req.cookies[k][i].value。
您可以通过两种办法利用要求变量。首先,您可以将它们包含在 CEL 表达式中,例如"req.method == 'POST' || req.method == 'PUT'",用于评估给true/false定要求是否利用POST或PUT方法。其次,您可以将它们插入到流量策略操作中,例如自定义相应、添加标头和日志记录,以得到额外的灵巧性和高下文感知。虽然您可能认为 要求变量仅适用于映命中的规则inbound,但您也可以将要求变量插入到outbound适用于干系相应的规则中。
根据与用户的持续对话,我们创造一些要求变量上升到首位:
req.content_type:标头中指定的媒体类型Content-Type,例如application/json。req.method:与要求关联的 HTTP 方法。req.user_agent:考试测验访问您的端点的运用程序、操作系统和供应商的标识符。req.url.uri:要求的 URL 的完全路径加上任何查询字符串。req.cookies[k][i].value:指定的 Cookie 的值k,如sessionId。您现在可能已经知道,我们将它们组织到 req 命名空间中,以帮助您在我们的文档中找到适当的要求变量并快速利用它们。
在开始塑造之前,末了提醒一下:与基于连接的兄弟不同,要求变量仅适用于 HTTP 隧道。
调度 HTTP 流量中的要求变量的用例和示例让我们深入研究一些示例,向您展示可以快速实现要求变量以解锁强大的 HTTP 流量整形策略的多方面方法。
保护您的做事免受大量上传的影响任何接管用户输入的运用或 API 都必须在处理和存储之前对其进行验证,但在许多情形下,您不能依赖客户端验证来担保您不会收到不必要的负载。例如,您的 JavaScript 运用可以在客户端上对文件上传运用一些验证,但您的用户也可以禁用 JavaScript 并直打仗发。API 端点的前期保护乃至更少。
---inbound: - name: "Block POST/PUT requests of excessive length" expressions: - "req.method == 'POST' || req.method == 'PUT'" - "req.content_length >= 10000000" actions: - type: "custom-response" config: status_code: 400 content: "Error: The size of your upload exceeds our maximum of 10 megabytes."
如果两个表达式都返回true,即用户考试测验发出POST/PUT超过 10 兆字节的要求,ngrok 将阻挡该要求到达您的做事并返回一条信息缺点。
创建“俊秀”的 URL 以得到更好的用户体验和 SEO许多内容管理系统利用带有查询字符串和其他履行级别详细信息的 URL 来帮助指示运用程序如何相应以及利用哪些数据。例如,Wordpress 的纯永久链接选项会创建类似 的 URL https://example.com/blog/index.php?p=123&title=your-title,这对付范例的终极用户来说相称不直不雅观。
相反,您该当利用正则表达式和 URL 重写将这些 URL 映射到“更俊秀”的替代方案。这样您的用户和 Google 的排名算法都会满意,而且您还可以得到隐蔽主要履行细节的额外好处,避免被窥伺。
---inbound: - name: "Rewrite ugly URLs on the /blog/ path" expressions: - "req.url.path.startsWith('/blog')" actions: - type: "url-rewrite" config: from: "/blog/([0-9]+)/([a-zA-Z]+)/" to: "/blog/index.php?p=$1&title=$2"
此规则利用 request 变量过滤所有要求req.url.path,适用于所有“俊秀”的 URL,例如https://example.com/blog/123/your-title/。然后,该规则利用正则表达式捕获构建新 URL 所需的信息(包括查询字符串),并通过重写实行映射。您的后端知道如何相应,用户乃至不知道 URL 已经变动。
不愿定重写或重定向是否适宜您的用例?我们有一个博客。
支配基本 A/B 测试假设您正准备发布运用或 API 的新紧张版本,并想理解其相对付当前基准的表现。借助流量策略,您可以设置一个基本的 A/B 测试,将要求拆分到当前网站和 example.com/v2/ 上的测试支配,同时保留所有现有网址。
---inbound: - expressions: - "timestamp(req.ts.header_received).getMilliseconds() <= 500" actions: - type: "url-rewrite" config: from: "/?([.]+)?" to: "/v2/$1"
此策略的“魔力”在于利用 CEL 宏timestamp(req.ts.header_received).getMilliseconds(),它返回 ngrok 吸收给定要求标头的毫秒值。由于该值介于0和之间999,因此它会根据毫秒值是否大于或即是进行评估500,从而供应大致的随机性。如果您想变动 A 和 B 之间的权重,以便 B 仅吸收 30% 的传入要求,您可以将值变动为300。
谢绝没有特定标头的要求并返回自定义“问题详细信息”相应末了,让我们看看如何根据要求标头的内容过滤 HTTP 流量并供应更好的用户体验。虽然标准 HTTP 代码可以奉告用户特定要求失落败的缘故原由,但您可以通过遵守HTTP API 问题详细信息规范来400进一步处理缺点,这有助于您在大略缺点无法解释全部情形的情形下创建有用的客户端缺点相应。
---inbound: - expressions: - "!('api-version' in req.headers)" actions: - type: custom-response config: status_code: 400 content: > { "type":"https://example.com/docs/errors/version/", "title":"Unspecified API version.", "detail":"You did not specify an API version in your request. The current available versions are `v2` and `v3`. To set the version, add the following header to your request: `api-version:v2` or `api-version-v3`.", "instance":"${req.url.path}" } headers: content-type: "application/json"
在此示例中,您将检讨用户是否明确指定了 api-version 标头。如果他们未能这样做,那么您将返回一个有用的缺点相应,该相应会向他们指出干系文档以及他们可以采纳的详细步骤来办理问题并重新利用您的 API。
您将利用要求变量创建什么形状?要开始利用所有这些新的要求变量过滤和对 HTTP 流量采纳行动,请注册一个免费的 ngrok 帐户。
从那里,查看有关全体交通政策的最热门资源汇编:
ngrok 流量策略模块先容流量策略引擎现在支持利用 CEL 插值进行动态配置开拓职员指南:利用 CEL 表达式和连接变量管理流量HTTP 流量策略规则库如果您无法立即准确判断哪些要求变量对您有用,让我们以另一种办法可视化要求变量。当要求到达您的 ngrok 端点时,纵然对付最基本的“乌龟事实” API,它包含的也远不止目标 URL 和客户端 IP 地址——而且 ngrok 乃至会在此过程中添加更多高下文。您的Traffic Inspector 仪表板将所有这些数据放入精心设计且人性化易读的格式中。
inbound你可以想象,一旦你理解了每个连接有哪些新的要求变量可用outbound,你可以利用它来得到比日志更有趣的办理方案。
您对要求变量和策略的事情办法有何想法或哀求?考试测验编写一个特殊晦涩的策略,但无法精确利用 CEL 语法?为什么不不才一期 ngrok 的办公韶光预留您的位置?加入我们的 DevEd 和产品团队,一起演示常见地决方案,理解端点和隧道,并现场回答您的急迫问题。