关于 Cookie-free Domains (为什么将静态图片,js,css存放到单独的域名?)
这篇文章对高性能web开发具有参考性:http://developer.yahoo.com/performance/rules.html
本文主要描述使用裸域名做网站主域名时,如何用子域名做 cookie-free domains。
看站点优化的文章,很多建议将站点的静态文件(如图片、js、css 等)放在一个专门的域名下访问,由于该域名与主站域名不同,所以浏览器就不会把主域名下的 Cookie 传给该域,减少了网络开销,一定程度提高了页面加载速度,特别是细碎静态文件特别多的情况下效果显著。大概这个域就叫着 cookie-free domain 吧。
Yahoo yslow 可以对网页性能进行评级,其中一个指标就是 “Use cookie-free domains”,描述如下:
When the browser requests a static image and sends cookies with the request, the server ignores the cookies. These cookies are unnecessary network traffic. To workaround this problem, make sure that static components are requested with cookie-free requests by creating a subdomain and hosting them there.
大意是当浏览器请求一个静态图片并发送 Cookie 时,服务器会忽略 Cookie。Cookie 根本就没必要通过网络传输。为了解决这个问题,应当创建一个子域并将静态内存放在上面,以确保静态内容都是通过 cookie-free 的方式访问的。
有文章指出,如果主域名使用裸域名(根域名,例如 opoo.org)而静态内容使用子域名(例如 static.opoo.org)是无法达到 cookie-free 的。因为裸域的 cookie 会被传递给子域。即如果在 opoo.org 设置了cookie,那么访问子域 static.opoo.org 浏览器也会发送这个 Cookie,根本达不到 cookie-free 的目的。----笔者则认为这种说法不完全正确。
Cookie 有两个重要的属性:domain 和 path。当浏览器访问一个网站时,只有 domain 和 path 都满足条件时,才会发送相应的 Cookie 到这个网站的服务器。而服务器在要求浏览器设置 Cookie 时,也只能设置与当前网站匹配的 domain 属性。
Cookie domain 属性的匹配方法,简单示例如下:
cookie.domain = "opoo.org" 该 Cookie 只能发给域 opoo.org,不能发到子域 www.opoo.org, static.opoo.org 等
cookie.domain = ".opoo.org" 该 Cookie 可以发给域 opoo.org 及其下所有子域,包括 www.opoo.org, static.opoo.org 等
cookie.domain = "www.opoo.org" 该 Cookie 只能发给域 www.opoo.org, 不能发给域 opoo.org 及 static.opoo.org 等
由此可以看出,裸域的 Cookie 会不会污染到子域,主要就在于设置 Cookie 的 domain 属性值前面的那个“.”。前缀点(leading dot, leading period, dot prefix, whatever..)大致相当于泛域名匹配吧。
关于这个“点”,RFC 6265 和 RFC 2109 描述不完全一致,有兴趣的读者可以翻看原文。
RFC 6265 4.1.2.3 章节
4.1.2.3. The Domain Attribute
The Domain attribute specifies those hosts to which the cookie will
be sent. For example, if the value of the Domain attribute is
"example.com", the user agent will include the cookie in the Cookie
header when making HTTP requests to example.com, www.example.com, and
www.corp.example.com. (Note that a leading %x2E ("."), if present,
is ignored even though that character is not permitted, but a
trailing %x2E ("."), if present, will cause the user agent to ignore
the attribute.) If the server omits the Domain attribute, the user
agent will return the cookie only to the origin server.
The user agent will reject cookies unless the Domain attribute
specifies a scope for the cookie that would include the origin
server. For example, the user agent will accept a cookie with a
Domain attribute of "example.com" or of "foo.example.com" from
foo.example.com, but the user agent will not accept a cookie with a
Domain attribute of "bar.example.com" or of "baz.foo.example.com".
看这意思难道是说有没有前缀“点”,Cookie 都会传给子域?没太读懂。
但实际测试的效果跟我前面描述是一致的,即不带“点”的只能传给本域,不能传给子域。
自己的结论:有没有前缀“点”,Cookie 都会传给子域。
读者可以自行检验:用 Chrome 开发人员工具或者 Firebug 观察 Github.com 和SourceForge.NET 网站及其子网站的请求/响应头信息中的 Cookie 信息。这两个网站就是伺服在裸域名上的。
关于网站是否使用裸域,个人觉得,.com 的域名要 www 比较好,还可以利用浏览器快捷键;而 .org, .net 等域名用裸域挺不错的,简洁方便。
在基本搞清楚 cookie-free domains,笔者将本站域名换回到裸域,并设置了通过子域名访问图片等静态内容。
WordPress
WordPress 设置的 Cookie domain 本来就是以不带点的域名开头的,不需要额外设置。如果伺服在 www.opoo.org 则要修改 wp-config.PHP 设置 COOKIE_DOMAIN 属性。
Google 分析
在裸域名使用 Google 分析,需要在 js 代码中设置 cookieDomain 属性为 none,否则生成的 Cookie 域将带前缀点。
_gaq.push(['_setDomainName','none']);
百度统计
很不幸,暂时没有发现百度统计代码中有设置 cookieDomain 的地方,其生成的 Cookie 是带前缀点的,会引起 Cookie 污染,所以笔者直接删除了百度统计代码。
又注:
避免域名污染。 当浏览器向服务器请求一个静态资源时,会先发送同域名下的 cookie,服务器对于这些 cookie 不会做任何处理。因此它们只是在毫无意义的消耗带宽。所以你应该确保对于静态内容的请求是无coockie的请求。
如果给 http://126.com 设置了cookie,那么会感染所有子域名, 请求 http://www.126.com/logo.gif或者http://image.126.com/logo.gif 时便会带上讨厌的cookie。
所以要用单独的域名,以减少请求,提高网页性能。
来自:http://blog.csdn.net/southflow/article/details/9342385
http://opoo.org/cookie-free-domains/
关于 Cookie-free Domains (为什么将静态图片,js,css存放到单独的域名?)的更多相关文章
- idea中JSP页面不能访问静态资源(图片,js,css)
必须配置SpringMvc对访问静态资源的支持,idea默认就是在main/webapp 下的文件路径,要在web-info同级的resource文件下放置,JSP中 ${pageContext.re ...
- Web.Config 对静态文件 js css img 的客户端缓存策略
<?xml version="1.0" encoding="utf-8"?> <configuration> <system.we ...
- 【jsp】怎么在jsp文件中引入静态文件(.js .css)
如果在jsp文件中引入静态文件比如(.js或.css等等),可以在使用 /项目名称/路径 的方式,但是这种方式如果在修改了项目了名称后就显得比较麻烦了.除了之外还许多方式,比如相对路径等等.一般情况下 ...
- 在django中访问静态文件(js css img)
刚开始参考的是别的文章,后来参考文章<各种 django 静态文件的配置总结>才看到原来没有但是没有注意到版本,折腾了一晚上,浪费了很多很多时间.后来终于知道搜索django1.7访问静态 ...
- spring mvc4 找不到静态文件js/css/html 404
说明: http://localhost:8080 指向的目录是WEB-INF所在的目录,也就是说请求静态资源时都是从该根目录开始查找.建议将所有静态文件放到和WEB-INF同级的目录下. 以 htt ...
- Thymeleaf模板引擎绕过浏览器缓存加载静态资源js,css文件
浏览器会缓存相同文件名的css样式表或者javascript文件.这给我们调试带来了障碍,好多时候修改的代码不能在浏览器正确显示. 静态常见的加载代码如下: <link rel="st ...
- 如何在Visual Studio 工程之间共享静态内容 (js, css, img, etc.)
第一步: 文件夹上点击右键 -> Add -> Existing Item,单击选中文件,不要点击“Add”按钮,而是在“Add”按钮右边有个向下的小箭头,点击这个箭头,再点击“Add ...
- 页面加载异常 清除浏览器静态文件 js css 缓存 js动态加载js css文件,可以配置文件后辍,防止浏览器缓存
js清除浏览器缓存的几种方法 - 兔老霸夏 - 博客园 https://www.cnblogs.com/Mr-Rocker/p/6031096.html js清除浏览器缓存的几种方法 一.CSS和 ...
- IIS 图片 JS CSS 500错误
1.检查站点MIME类型是否可以正常加载
随机推荐
- 51nod-1605-博弈
1605 棋盘问题 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 上帝创造了一个n*m棋盘,每一个格子都只有可能是黑色或者白色的. 亚当和夏娃在 ...
- UA 列表
设备 系统 浏览器 User-Agent iPhone IOS QQ浏览器 Mozilla/5.0 (iPhone 84; CPU iPhone OS 10_3_3 like Mac OS X) Ap ...
- learning shell script prompt to run with superuser privileges (4)
Shell script prompt to run with superuser privileges [Purpose] Check whether have root privil ...
- MySQL 中Index Condition Pushdown (ICP 索引条件下推)和Multi-Range Read(MRR 索引多范围查找)查询优化
一.ICP优化原理 Index Condition Pushdown (ICP),也称为索引条件下推,体现在执行计划的上是会出现Using index condition(Extra列,当然Extra ...
- win7自带wifi win7无线网络共享设置图文方法
win7自带wifi win7无线网络共享设置图文方法 点评:开启windows 7的隐藏功能:虚拟WiFi和SoftAP(即虚拟无线AP),就可以让电脑变成无线路由器,实现共享上网,节省网费和路由器 ...
- MyEclipse WebSphere开发教程:安装和更新WebSphere 6.1, JAX-WS, EJB 3.0(六)
[周年庆]MyEclipse个人授权 折扣低至冰点!立即开抢>> [MyEclipse最新版下载] MyEclipse支持Java EE技术(如JAX-WS和EJB 3.0),它们以功能包 ...
- 电脑同时安装python2和python3, 如何实现切换使用
由于历史原因,Python有两个大的版本分支,Python2和Python3,又由于一些库只支持某个版本分支,所以需要在电脑上同时安装Python2和Python3,因此如何让两个版本的Python兼 ...
- gulp 系统教程
移步: http://www.cnblogs.com/2050/p/4198792.html gulp外挂 加md5 版本号 自动合并图片并修改css的坐标 一个系统列子 gulp可以做哪些事情
- UINavigationController详细(转)
UINavigationController使用详解 有一阵子没有写随笔,感觉有点儿手生.一个多月以后终于又一次坐下来静下心写随笔,记录自己的学习笔记,也希望能够帮到大家. 废话少说回到正题,UINa ...
- fluent nhibernate映射的数值类型问题
fluent nhibernate中,数值类型设置不当,就可能会引发一些意想不到错误. 一.引发映射错误 比如,oracle数据库中,字段ID类型是number,结果用codesmith生成代码,实体 ...