避免 HTTP 标注递归
即使 NetScaler 设备不检查 HTTP 标注请求的有效性,它也会在将请求发送到 HTTP 标注代理之前对请求进行一次解析。此解析允许设备将标注请求视为任何其他传入请求,从而允许您配置几个有用的 NetScaler 功能(例如集成缓存)以处理标注请求。
但是,在此解析过程中,HTTP callout 请求可以选择相同的策略,因此可以递归地调用自身。设备检测到递归调用并引发未定义 (UNDEF) 条件。但是,递归调用会导致策略和 HTTP 标注选择计数器各增加两个计数,而不是每个计数一个。
要防止标注自身调用,您必须确定 HTTP 标注请求的至少一个唯一特征,然后将调用该标注的策略规则处理所有具有此特征的请求排除在外。您可以通过在策略规则中包含另一个高级策略表达式来实现此目的。表达式必须位于 SYS.HTTP_CALLOUT(<name>) 表达式之前,以便在计算注解表达式之前对其进行计算。例如:
<Expression that prevents callout recursion> OR SYS.HTTP_CALLOUT(<name>) <!--NeedCopy-->
以这种方式配置策略规则时,当设备生成请求并对其进行解析时,复合规则的计算结果为 FALSE,不会再次生成标注,并且选择计数器会正确递增。
为 HTTP 标注请求分配唯一特征的一种方法是在配置标注时包含唯一的自定义 HTTP 标头。以下是一个名为“myCallout”的 HTTP 标注的示例。“ 该标注生成一个 HTTP 请求,用于检查客户端的 IP 地址是否存在于列入黑名单的 IP 地址的数据库中。标注包括一个名为“请求”的自定义标头,该标头设置为值“标注请求”。“ 全局绑定的响应程序策略“Pol1”调用 HTTP 标注,但排除请求标头设置为此值的所有请求,从而阻止第二次调用 myCallOut。阻止第二次调用的表达式是 HTTP.REQ.HEADER(“请求”).EQ(“标注请求”).不是。
示例:
> add policy httpCallout myCallout Done > set policy httpCallout myCallout -IPAddress 10.102.3.95 -port 80 -returnType TEXT -hostExpr ""10.102.3.95"" -urlStemExpr ""/cgi-bin/check_clnt_from_database.pl"" -headers Request("Callout Request") -parameters cip(CLIENT.IP.SRC) -resultExpr "HTTP.RES.BODY(100)" Done > add responder policy Pol1 "HTTP.REQ.HEADER("Request").EQ("Callout Request").NOT && SYS.HTTP_CALLOUT(myCallout).CONTAINS("IP Matched")" RESET Done > bind responder global Pol1 100 END -type OVERRIDE Done <!--NeedCopy-->
注意: 您还可以配置表达式来检查请求 URL 是否包含为 HTTP 标注配置的词干表达式。要实施该解决方案,请确保 HTTP 标注代理只能响应 HTTP 标注,而不能响应通过设备定向的其他请求。如果 HTTP callout Agent 是为其他客户端请求提供服务的应用程序或 Web 服务器,则此表达式会阻止设备处理这些客户端请求。而是使用前面所述的唯一自定义标头。
本内容的正式版本为英文版。部分 Cloud Software Group 文档内容采用了机器翻译,仅供您参考。Cloud Software Group 无法控制机器翻译的内容,这些内容可能包含错误、不准确或不合适的语言。对于从英文原文翻译成任何其他语言的内容的准确性、可靠性、适用性或正确性,或者您的 Cloud Software Group 产品或服务沿用了任何机器翻译的内容,我们均不作任何明示或暗示的保证,并且适用的最终用户许可协议或服务条款或者与 Cloud Software Group 签订的任何其他协议(产品或服务与已进行机器翻译的任何文档保持一致)下的任何保证均不适用。对于因使用机器翻译的内容而引起的任何损害或问题,Cloud Software Group 不承担任何责任。
DIESER DIENST KANN ÜBERSETZUNGEN ENTHALTEN, DIE VON GOOGLE BEREITGESTELLT WERDEN. GOOGLE LEHNT JEDE AUSDRÜCKLICHE ODER STILLSCHWEIGENDE GEWÄHRLEISTUNG IN BEZUG AUF DIE ÜBERSETZUNGEN AB, EINSCHLIESSLICH JEGLICHER GEWÄHRLEISTUNG DER GENAUIGKEIT, ZUVERLÄSSIGKEIT UND JEGLICHER STILLSCHWEIGENDEN GEWÄHRLEISTUNG DER MARKTGÄNGIGKEIT, DER EIGNUNG FÜR EINEN BESTIMMTEN ZWECK UND DER NICHTVERLETZUNG VON RECHTEN DRITTER.
CE SERVICE PEUT CONTENIR DES TRADUCTIONS FOURNIES PAR GOOGLE. GOOGLE EXCLUT TOUTE GARANTIE RELATIVE AUX TRADUCTIONS, EXPRESSE OU IMPLICITE, Y COMPRIS TOUTE GARANTIE D'EXACTITUDE, DE FIABILITÉ ET TOUTE GARANTIE IMPLICITE DE QUALITÉ MARCHANDE, D'ADÉQUATION À UN USAGE PARTICULIER ET D'ABSENCE DE CONTREFAÇON.
ESTE SERVICIO PUEDE CONTENER TRADUCCIONES CON TECNOLOGÍA DE GOOGLE. GOOGLE RENUNCIA A TODAS LAS GARANTÍAS RELACIONADAS CON LAS TRADUCCIONES, TANTO IMPLÍCITAS COMO EXPLÍCITAS, INCLUIDAS LAS GARANTÍAS DE EXACTITUD, FIABILIDAD Y OTRAS GARANTÍAS IMPLÍCITAS DE COMERCIABILIDAD, IDONEIDAD PARA UN FIN EN PARTICULAR Y AUSENCIA DE INFRACCIÓN DE DERECHOS.
本服务可能包含由 Google 提供技术支持的翻译。Google 对这些翻译内容不做任何明示或暗示的保证,包括对准确性、可靠性的任何保证以及对适销性、特定用途的适用性和非侵权性的任何暗示保证。
このサービスには、Google が提供する翻訳が含まれている可能性があります。Google は翻訳について、明示的か黙示的かを問わず、精度と信頼性に関するあらゆる保証、および商品性、特定目的への適合性、第三者の権利を侵害しないことに関するあらゆる黙示的保証を含め、一切保証しません。
ESTE SERVIÇO PODE CONTER TRADUÇÕES FORNECIDAS PELO GOOGLE. O GOOGLE SE EXIME DE TODAS AS GARANTIAS RELACIONADAS COM AS TRADUÇÕES, EXPRESSAS OU IMPLÍCITAS, INCLUINDO QUALQUER GARANTIA DE PRECISÃO, CONFIABILIDADE E QUALQUER GARANTIA IMPLÍCITA DE COMERCIALIZAÇÃO, ADEQUAÇÃO A UM PROPÓSITO ESPECÍFICO E NÃO INFRAÇÃO.