2009-04-30 75 views
4

继Steve(YSlow)Souder的传福音后,我的网站(LibraryThing.com)跨域分割请求以促进并行加载。我们做CSS,JS和图片;你也可以做Flash等。我们也使用Google的Prototype版本,它是跨域的,不仅仅是跨子域。跨领域拆分请求 - 阻止过度安全

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

问题是:处理这个问题的最好方法是什么?

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

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

+0

你可以发布一些代码吗?你是否在做所有的客户端? – 2009-04-30 09:05:00

+0

这只是一个客户端问题 - 我的网站可以去获取任何东西:)。 我认为这个问题已经足够普遍,发布代码只是混淆了这个问题,但我们现在正在这样做。如果JS var没有设置,请在本地获取并设置cookie。 <脚本类型= “文本/ JavaScript的”> 如果(typeof运算EXPIREDATE == “未定义”)//变种没有设置 \t { \t文件撰写(“ LibraryThingTim 2009-04-30 09:16:28

回答

0

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

注意cookie狂热 - 您添加的cookie越多(此外,在主域上),您的客户越需要将其发送到请求中。

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

+0

>用户代理 不,我认为我们在IE中使用安全设置之前就复制了它。我假设它是一个安全问题。一些非常严格的设置假定页面不应该从其域外部获取 - 最重要的是JS,而且还包括CSS。哎呀,你可以设置你的浏览器不要从外面取图像,以防你真的偏执狂。 >饼干 这是非常真实的。事实上,正如Souders所建议的那样,这是使用辅助域的一个原因 - 从无cookie的域中获取所有静态内容。 – LibraryThingTim 2009-04-30 09:52:50

0

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

缓存。您是否在脚本文件中进行了这些更改,这些问题用户可能拥有旧版本。 IE 6对过度的缓存非常不利。我注意到你的脚本在url中没有build#,XYZ.js?version = 3会强制浏览器不使用像XYZ.ks?version = 2这样的旧缓存脚本。 (也适用于图像/ Css)

您还将内嵌JavaScript与您的HTML混合,这也将被缓存。

3个领域可能是矫枉过正,除非你的网站有关于它的内容的TON(大页面)

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

因为可能存在安全冲突,我不会很乐意将我的网站JavaScript放在单独的域上。你必须保持你的javascript/ajax调用与域同步。似乎更像是一件麻烦事,而不是它的价值。

我一直在使用i.domain.com和domain.com 5年以上没有问题。

我敢打赌把JS放回主域可以解决你的问题。这肯定会使它不那么复杂和容易处理。

但做得很好,你的3个域名应该可以工作。不幸的是,我没有足够的信息来解决这个问题。

1

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

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

此方法应确保具有支持跨站点请求的浏览器的用户看不到任何异常行为,但应该立即以其自身刷新为代价解决问题,以便在首次访问时自动刷新。