跨域拆分请求 - 阻止过度安全

时间:2009-04-30 08:13:15

标签: javascript css security optimization web

继Steve(YSlow)Souder的传福音之后,我的网站(LibraryThing.com)将域间请求分开,以方便并行加载。我们做CSS,JS和图像;你也可以做Flash等。我们也使用谷歌版的Prototype,这是跨域的,而不仅仅是跨子域。

这对速度来说非常好,但对于一小部分用户来说,这是错误的。我认为问题是过于热心的安全设置,可能在IE中,但也许在其他浏览器和/或上游系统中。我很惊讶Souders和其他人不讨论这个,因为我们得到了很多。

问题是:处理此问题的最佳方法是什么?

现在,当它到达页面底部时,我们正在检查是否设置了一个在应该加载的脚本中声明的JS变量。如果没有设置,它会从主域获取并设置一个cookie,以便下次它不会从子域加载它。但我们只是在底部重新加载JS,所以如果CSS也失败了,你就会看到垃圾。

有没有人有更好或更通用的解决方案?我想可能会有一个通用的“onload”或“onerror”脚本来设置cookie并加载内容?

3 个答案:

答案 0 :(得分:1)

如果此行为至少影响JS文件,则一个选项是保留一个cookie,指示用户的浏览器是否已针对此行为进行了测试。如果它们尚未经过测试,请插入(作为标记中的第一个脚本元素)对跨域脚本的引用,该脚本只是将此cookie设置为“成功”。然后立即有一些内联JS将检查这个cookie,如果没有设置,设置为“failed”并重新加载页面。

然后在服务器端只检查相同的cookie,并确保不会向发生“失败”结果的任何人发送跨站点请求。

此方法应确保具有支持跨站点请求的浏览器的用户不会看到任何奇怪的行为,但应立即以其首次访问时自动刷新为其他用户解决问题。

答案 1 :(得分:0)

您是否有显示此行为的特定用户代理列表? 也许Apache conf可以解决这个问题? (或者为你创造一个新问题:-))。

注意Cookie狂热 - 您添加Cookie越多(此外,在主域上),您的客户就越需要发送它们。

Souders也谈到了它,但检查客户浏览器发送/接收的请求比率总是好的。

答案 2 :(得分:0)

我将对你的问题进行一些猜测。

高速缓存。您是否在脚本文件中进行了这些更改,这些问题用户可能具有旧版本。对于过度热心的缓存,IE 6非常糟糕。

我注意到你的脚本在url中没有build#,XYZ.js?version = 3会强制浏览器不使用旧的缓存脚本,如XYZ.ks?version = 2。 (也适用于Images / Css)

您还将内嵌的javascript与HTML混合在一起,这也会被缓存。

除非您的网站上有大量内容(大页面),否则3个域名可能会过度杀伤

DNS查找可能很昂贵,并且具有很长的超时值。

由于可能存在安全冲突,我不愿意将我的网站javascript放在单独的域上。你必须让你的javascript / ajax调用与域同步。似乎更麻烦而不是它的价值。

我一直在使用i.domain.com和domain.com 5年多没有任何问题。

我打赌把JS放回主域将解决你的问题。它肯定会使它更简单,更容易处理。

但是如果做得好,你的3个域应该可行。不幸的是,我在这个问题上没有足够的信息来找到问题。