F5 Networks iRule / Tcl – 转义UNICODE 6个字符的转义序列,以便它们被处理并重新插入为6个字符的序列?

我们试图让SSL F5终结angular色中的F5 BIG-IP LTM iRule与SharePoint 2007一起正常工作。 此体系结构将所有SSL处理卸载到F5,而F5仅通过HTTP(通过安全networking)将交互请求/响应转发到SharePoint前端服务器。

为了讨论的目的,iRules由F5 Networks BIG-IP设备上的Tcl解释引擎进行parsing。

因此,F5做了两件事来通过它:

  1. 通过HTTP 302redirect和URL重写将任何请求redirect到端口80(HTTP)到端口443(HTTPS)。
  2. 重写对浏览器的任何响应,以便有select地重写embedded在HTML中的URL,以便它们转到端口443(HTTPS)。 这可以防止302redirect破坏由SharePoint生成的DHTML。

我们有第1部分工作正常。

第2部分的主要问题是,在XML命名空间和其他类似问题的响应重写中,并非所有匹配“http:”的匹配都可以更改为“https:”。 有些必须保持“http:”。 此外,一些“http:”url很困难,因为它们生活在SharePoint生成的JavaScript中,并且它们的斜杠(即“/”)实际上由UNICODE的6个字符的string“\ u002f”在HTML中表示。

例如,在这些棘手的情况下,传出HTML中的文字string是:

http:\u002f\u002fservername.company.com\u002f 

应该改成:

 https:\u002f\u002fservername.company.com\u002f 

目前我们甚至无法弄清楚如何在这些UNICODE序列string文字的search/replaceexpression式中获得匹配。 似乎无论如何分割它,Tcl解释器在将“\ u002f”string解释为“/”之前,都会将其解释为“/”。

我们已经尝试了我们所知道的Tcl转义方法的各种组合(主要是双引号,并使用一个额外的“\”来转义UNICODEstring中的“\”),但正在寻找更多的方法,最好的方法。

有没有人有任何想法或指向我们可以有效地自我教育的地方呢?

首先十分感谢。

您正在尝试做什么不build议与SharePoint。

推荐的方法是使用SharePoint内的备用访问映射。 您将创build一个https://的公共URL,并具有内部名称http://。

这将导致您的网页上的所有url使用https://创build

如果你不喜欢这个答案,你可能想在ServerFault http://serverfault.com上提出这个问题。

@JD,我应该添加这个:

有问题的SharePoint Web应用程序当前托pipe在与SQL Server 2005报告服务(SSRS)和PerformancePoint 2007(PPS)集成(在其他Web应用程序上)的物理服务器和SharePoint场上。 这两种产品都不支持备用访问映射(AAM)。

虽然我们想要完成上述工作的Web应用程序确实没有与SSRS或PPS集成,但是我们的架构师和技术负责人宁愿尽可能避免在该环境中使用AAM。

所以原则上我同意你的回答,在这种情况下,我要求特别的例外,特别是因为我和其他的技术战略家认为这是正确的答案。

我对sharepoint一无所知,但至less从纯粹的tclangular度来看,下面显示了如何匹配你的文字string:

 tclsh> set string {http:\u002f\u002fservername.company.com\u002f} http:\u002f\u002fservername.company.com\u002f tclsh> regexp {http:\\u002f} $string 1 

重要的是要确保\ u002f中的反斜杠不被tclparsing器解释(通过将模式封装在{}中),并确保反斜杠不被正则expression式parsing器parsing(通过转义它带有反斜杠)。

为了将来的参考,因为这是最近出现以及…

Sharepoint备用访问映射是最干净的解决scheme。

对于一个BIG-IP iRule,你可以尝试这样的事情。 请注意,TCL需要解释unicode字符,才能匹配它们。

 when HTTP_REQUEST { # Disable the stream filter by default STREAM::disable } when HTTP_RESPONSE { if {[HTTP::header value Content-Type] contains "text"}{ set find_str "http:\u002f\u002fservername.company.com\u002f" set replace_str "https:\u002f\u002fservername.company.com\u002f" STREAM::expression "@$find_str@$replace_str@" STREAM::enable } } 

亚伦

用\ 456 \ defreplace\ 123 \ abc

STREAM :: expression {@ \\ 123 @ \ 456 @ @ \ abc @ \ def @}