DNS查找, 域名, 和Cookies

WebDev @ 29 August 2007, “6 Comments”

减少DNS查找能够缩短页面反应时间,但是所有网站资源都只用一个域名,从而把DNS查找减少到一个,也不是最好的办法。不仅仅因为减少的平行下载的可能,更因为Web Cache对带与不带cookie的请求和返回的处理不同。

我的网站域名是www.yining.org,有个页面(比如就这篇blog entry)带有一张图片,其src为:/img/camel.gif,那么它的URL就是:”http://www.yining.org/img/camel.gif”。如果这个页面设置了cookie(比如为了记录留言者的ID和网站地址等),cookie的作用域名自动为www.yining.org,那么每次访问该页的时候,因为URL的域名部是www.yining.org,那么浏览器都会带着cookie对该图片发起请求,即使一路上的web cache有www.yining.org/img/camel.gif的记录,也依然要到我的服务器(the origin server),而不是从中间的web cache返回 – 因为带cookie的请求都可能根据不同cookie的值而返回不同的response。

但是这对许多静态资源(图片, css, 和javascript)来说不是最理想的,因为不论cookie是什么,它们的response里都是同样的内容,对它们的请求没有必要每次都回到origin server。其次,因为不同web cache对带cookie的请求支持不同,即使有的cache能够缓存带cookie的response,但是1)不是大多数的cache都能做到这点,2)大多数的cache都缺省缓存不带cookie的response。因此最好的办法就是使用不同的域名把静态资源隔离开。虽然cookie的path属性也能做到这点,但是毕竟限制太多,不如使用专门的域名灵活。

所以应该尽量把所有静态的对象和动态页面的域名分开,更严谨地说,是把不需要读写客户端cookie的服务器资源与需要读写cookie的程序分开到不同的域名。比如我可以设置另一个域名static.yining.org,在引用该图片的<img>里的src属性改为”http://static.yining.org/img/camel.gif”,那么当访问首页的时候,浏览器就不会带着cookie(因为作用的域名现在不一样了),这样就能更好地利用web cache缓存和服务器的性能。我请教过一位曾经在NetAppliance(最大的web cache厂商)工作的同学,据他说根据经验,带和不带cookie之间的差别有可能是20%甚至更大。

6 Responses to “DNS查找, 域名, 和Cookies”

  1. Erning Says:

    static和dynamic的内容分为不同的域名/ip还方便将这两部分的访问分流。

    另外,security code和openid好像有些冲突

  2. 永明则名 Says:

    了解了,谢谢!

  3. solorez Says:

    多谢分享!

  4. Confach Says:

    有道理

  5. anonymous Says:

    如果request带cookie能引起cache把该request的uri对应的cache entry删除的话,那该cache服务器的设计就是失败的。我可以写一个发包机,不停地发带cookie的request到cache服务器,那么这些cache服务器就必须丢弃该cache entry,然后跟original server联系以获取新的response。这是很滑稽的。

    实际上cache服务器对request里的cookie头应该完全无视,而真正需要关注的是response里的set-cookie头。HTTP标准规定带set-cookie头的response不应该缓存,如果违反了该规则,那么相同uri的request,必定会命中该cache entry。这样,这个cached response就连同其中的set-cookie头一起被发给了客户端,导致浏览器设置该cookie,接下来的request就自动附带上了该cookie,导致安全问题。

    你这篇文章没什么价值,连基本的cookie头和set-cookie头、request和response都没区别出来。

  6. Anonymous Says:

    带和不带cookie之间的差别有可能是20%甚至更大。

    额~~~~,我被吓坏了,额,我死了

Leave a Reply