反向代理和AJAX

我们的客户正在使用IBM / Tivoli WebSEAL,这是一些内部用户的反向代理服务器。 我们的Web应用程序(ASP.NET 2.0)是一个相当简单的Web /数据库应用程序。

目前,通过WebSEAL代理的客户端用户在.NET第三方控制方面存在问题。 没有通过代理的用户没有问题。 第三方控制只不过是一个AJAXdynamic树,每次点击都请求每个叶子的所有节点。

现在我们的客户声称,一旦用户点击了控件中的一个节点,控件本身就会冻结,使得他们看不到任何东西。 用户看到“Loading …”消息出现,但是之后没有新的活动。 他们必须离开页面并返回原始页面才能查看新节点。

我从来没有使用反向代理之前,所以我已经search了很多关于这个问题,甚至发现了关于SF的文章 。 IBM / Tivoli之前已经提到过这个问题 ,但是这是关于他们所有提到的。 虽然IBM文档非常有帮助,但我们所有的AJAX都来自第三方控制。 我已经尝试使用Firebug排除故障,但由于不是在反向代理背后,我无法真正复制这个问题。

我的问题是:没有人有经验的反向代理和AJAX网站的问题? 我怎样才能certificate确切的问题是什么? 目前,我们正在谈判远程访问,所以我认为我可以访问使用WebSEAL代理的机器。

PS我意识到这个问题可能会在StackOverFlow / ServerFault的pipe辖权辩论,但我试图从系统的angular度进行调查。 我没有反向代理的经验(我不清楚的好处),并与转发代理很less。

那么通过WebSEAL访问我们客户的网站并构build一个testing用例,我们就有了答案。 根据IBM有关AJAX和WebSEAL的文档 ,在Junction cookie部分的最后部分有一段文字:

潜在的解决scheme

如果来自AJAX请求的响应不能被呈现为HTML,则不应该使用内容types“text / html”来发送响应。 应该使用更合适的内容types,例如“text / plain”。 WebSEAL不会将结合cookie代码添加到没有内容types“text / html”的响应

对于我们的ASP.NET应用程序,添加到使用该控件的Page_Load事件中是一个简单的条件。

protected void Page_Load(object sender, EventArgs e) { Response.Clear(); Response.ContentType = (Page.IsCallback) ? "text/plain" : "text/html"; //does same thing as line above //if (Page.IsCallback) // Response.ContentType = "text/plain"; //else // Response.ContentType = "text/html"; } 

我相信其他语言(PHP,JSP,RoR等)都有改变内容types的方法。 在ASP.NET方面,我不确定是否有更好的生命周期事件方法(PreInit?),但是这对于AJAX和IBM WebSEAL反向代理结点cookie的这个特定问题是一个有效的解决方法。

这可能取决于你的应用程序是如何工作的 – 如果它在某些地方使用绝对URI,而这些指向的是代理不能使用的东西 – 这可能是你的问题。

假设你有代理P,服务器S和用户。 服务器有一个给定的主机名(可能更多),其中一个可能与web服务器(让我们称之为server1)相关联。 用户可能或可能不能直接向服务器1发送请求。 很可能,使用反向代理,他们必须向代理发送请求,然后再查询您的服务器。

他们看到http:// P / YourAppHere – 而应用程序实际上住在http:// server1 / YourAppHere (或其他任意path)。 如果您的应用的configuration方式是直接引用http://server1/YourAppHere/foo.asp ,并且代理并不接受并修改发送给用户的代码,以便指示到http://P/YourAppHere/foo.asp ,它会破坏function。

在这里黑暗中的一种刺伤,但我遇到与Sharepoint类似的问题。

对于WebSEAL和其他反向代理,最好的方法是只使用相对URL。 AJAX和其他web 2.0编码方法最大的问题是他们喜欢把信息发回给客户端来为客户端创build绝对的URL客户端。 如果需要,反向代理无法过滤。 例如返回的forms是backendserver.com8443https

URL = protocol +“://”+ host + port +“/somebackendURL/item.html”

当且仅当它通过反向代理服务器时,绝对URL将被过滤

https://backend.server.com:8443/和这匹配一个联结的服务器。

即使您不是这样编码,连接cookie也会产生大量问题。

如果在脚本标签内部有一个调用.js文件的html页面,那么如果.js文件获取了添加的cookie,则会获得嵌套的脚本标签和浏览器barfs。

例如test.html是你好

然后这是对WebSEAL的2个请求。 如果他们通过一个交界处的cookies设置最后一页看起来像。

设置cookie IV_JCT = junctionname

>你好