Learn F5 Technologies, Get Answers & Share Community Solutions Join DevCentral


有时iRule可以正常加载和运行而不会产生任何错误,但最后往往没有取得所期望的结果。   在这篇文章中我将通过一个简单的实例来验证你的iRule编写逻辑是否违背真实的数据流程:一个可以实现双向HTTP内容主机信息修改的IRule   我最近帮助了我的一个用户,它的配置是相当普遍的: Web服务器被配置成响应不同于向客户公开的URL里的域名: “正确”的Host Header中包含了内部的服务器名称用于Web 服务器处理请求。 另外, 无论哪个服务器响应请求中包含了内部的主机名称,都需要被替换成公开的域名。   下面的实例我们的主机名如下:     公开的主机名:        easyname.domain.com     实际的/内部主机名:      long.internal.name.domain.com   所有对HTTP请求,主...
事件是iRules构建的基石。事件是iRule对TCL语言的一个扩展,它使我们一个基于连接的状态上下文内来进行模块化的编程。本文将围绕事件的细节展开讨论并且了解他们是如何在相同的虚拟服务器中被一个或多个iRule调用的。   Rule 1: 一个虚拟服务器可以包含一个或多个iRule.   首先,一个很重要的事实是iRules仅仅是一段脚本代码。他不能在一个虚拟服务器的上下文之外做很多的事情。iRule作为“资源”存在在虚拟服务器中,并且在一个虚拟服务器的资源列表中可以有0-N个iRule,在一个虚拟服务器中调用多种iRule会有很多好处,这些将会在以后的章节里讲到。   Rule 2: 一个iRule可以由一个或多个不同的事件代码构成.   很明显的,从iRules代码共享区的示例代码来看,你无需为多个不同的事件而编写不同iRules。一个iRule中可以包含一个或者多个事件,以下是一个iRule包含多个事件的实例:   when HTTP_REQUEST {  set uri [HTTP::uri]&#...
虽然我们不建议使用正则表达式,但正则表达式是iRules 发开发过程中的“不可避免的弊端”。本文将讨论支持正则表达式的一些命令和一些工具,你可以用来来处理一些你所需要的格式。 正则表达式 一个正则表达式,就是用某种特定的语法规则去描述或者匹配一组字符串的一个公式。 正则表达式(REs)有两种基本的表达形式:扩展的正则表达式(“ERE”)和基本正则表达式。从Unix的角度来看,ERE从大体上来说适合传统的egrep使用的表达式是相同的,而BRE大体上和传统的ed使用相同的表达式。TCL在实现正则表达式的时候加入了第三种方式,高级正则表达式(ARE),ARE是在ERE的基础上加入了一些显著的扩展。   讨论上述问题已经超出了本文讨论的正则表达式的范围。更多的说明请在TCL文档内置命令部分的re_syntax documentr 目录下。 正则表达式举例 正则表达式是什么样的呢?例如一个简单的由字符组成的字符串用于精确匹配“abc”的例子: RE: {abc} 或者是构造一个字符串,用来查询在一个字符串中所有非空白的序列: RE: {\S+} 也可以在一个范围...
既然你已经写好了你的第一个iRules :"Hello World",那么现在可以动手来写简单的、比如包含"when HTTP_RESPONSE" 或者 "HTTP::respond 200 content {Hello World}"的irules了,接下来还准备写一些更高级irules。不过,在此之前,首先你需要了解的是如何去调试这些你写的irules代码。本文将介绍几个调试技术,希望可以帮助你构建一个自检测的iRules 。   Logging 你可以用来武装你自己的第一个工具是是iRules的 “log”命令。它的语法如下: log [<facility>.<level>] <message> facility : "local0", "local1", "local2", "local3", "local4", "local5", "local6", "local7" level : "alert", "crit", "debug", "emerg", "err", "error", "info", "none", "...
When dealing with iRules there is sometimes a need to store static information in lists that you can search when your iRule is executed. Are you looking to check every incoming connection for a certain list of Client IPs? Perhaps you want to parse the incoming URI and direct to different pools based on what URI parts are found. To perform inspections/actions like this you need to have a defined list of data to search for, and that list needs to remain constant across multiple connections. This i...
One of the often overlooked features of iRules is the ability to use dynamic variables in assignments.  This can make for some interesting iRules, but it can also get you into trouble at runtime when your variables are not defined in the current configuration.  This tech tip will illustrate how to take input from an HTTP request and use that as the criteria for which pool of servers the connection is sent to, all while maintaining runtime error checking using the TCL catch command. &#...
iRules一个非常普遍的用途是根据当前流量或者根据请求的细节来选择一个合适的目的地址。   在这篇文章中,我将回顾所有在您的项目中会用于在特定条件下选取正确的Pool, Pool Member或者目标地址的相关iRules命令。     选择一个目的   pool命令   在多数情况下,我们想去指定的目的仅仅是一组提供相同服务的服务器pool。 选择pool的命令就是一个简单的“pool”,例如: pool <poolname> 你可以指定一个pool的名字,例如: pool HTTP_pool 或者指定一个变量,例如: pool $myPool 也可以使用pool命令来选择一个指定的pool member,例如: pool HTTP_pool member 10.10.10.1 80   node命令   如果想把流量发送到一个没有被定义为pool member的特定ip/端口组合,node命令是非常有用的,例如: whe...
在前面的文章中,我提到过每个iRules的核心几乎都是IF命令。在这些情况下,如果你需要为某个值执行条件判断,这里还有一个可以在大多数情况下使用的条件命令,它比IF执行起来更加快速并且简单易懂。本文将会讨论“Switch”语句,哪些情况你会需要使用它,以及如何对它进行使用。   语法   Switch命令的语法如下: switch ?options? string pattern body ?pattern body ...? switch ?options? string {pattern body ?pattern body ...?} Switch命令会把它的String参数和Pattern参数逐一进行匹配,一旦它找到一个能和String匹配的Pattern,它就通过TCL解释器执行后面的Body部分参数,并返回计算值。如果最后一个Pattern参数是Default,那么它可以匹配所有值。如果没有Pattern参数可以和String进行匹配,并且语句中没有包含Default,那么这个Switch命令就返回一个空的String。   ...
当你开始可以轻松的读懂并编写iRules的时候,你需要继续扩展自己的工具箱,同时你所要应付的任务也将变得越来越复杂。如果你的经历和我的有某些相似的地方,那么很快,而不是很久之后,你就会找到读取,保存和操作不同类型内容的方法。它就是你的“iRules生涯”中,将越来越频繁的使用的变量,理解他们是什么以及如何在iRules中更加有效的使用它们将会非常有用。   定义、注销和操作变量   iRules使用标准的TCL变量,大多数时候你在TCL语言中使用的用来定义、注销、求值和影响变量的命令iRules中也是有效的。这些命令中的绝大多数是一样并你所定义的数据结构(变量)无关,而且直接体现他们的命名和行为。例如,定义(或创建)一个变量,你只要简单的使用一个Set命令:   set msg "Hello, World!"   即使你要建立更加复杂的结构并用不同类型的数据(静态动态都一样)并对其进行填充的时候,所用到的命令也是相同的。更多的例子看起来是下面这样的:   set r [expr rand()] set ...
if命令是用于基于特定情况执行脚本语言的。这篇文章将讨论if命令的规则和格式上的一些细节,以及在TCL语言中的应用。   命令用法   if expr1 ?then? body1 elseif expr2 ?then? body2 elseif ... ?else? ?bodyN ?   l if命令将expr1作为一个表达式,来计算它的值(和expr计算它的参数值一样)。 l 表达式的值必须是布尔型(一个数值,0为false,其它的数字为true;或者是个字符串值,例如true or yes 为 true,以及 false or no 为 false).如果结果是true,那么通过TCL编译器执行body1.否则将expr2作为一个表达式,计算它的值,如果结果是true, 那么执行body2,以此类推。 l 如果所有的表达式的值都不为true,那么bodyN被执行。 l Then和else操作都是可选的语句(干扰字符),让命令更加明了。 l 在代码中也许会有许多的elseif子句,包括...
Page 1 of 2First   Previous   [1]  2  Next   Last