Apache中通过配置.htaccess设置单独二级域名(cookie-free)放置静态文件

摘要: 为什么要设置单独的域名放置静态资源可以看到网络中很到知名网站使用一个单独的域名(二级或独立域名,大部分是独立域名)放置静态资源,这样做的好处:Cookie-free Domain,减少浏览器请求时网络开销。

Apache中通过配置.htaccess设置单独二级域名(cookie-free)放置静态文件

为什么要设置单独的域名放置静态资源

可以看到网络中很到知名网站使用一个单独的域名(二级或独立域名,大部分是独立域名)放置静态资源,这样做的好处:

  1. Cookie-free Domain,减少浏览器请求时网络开销。浏览器请求静态资源时,依然会把当前域名下的cookie数据一并发送到服务器(虽然服务器会直接忽略),Cookie-free就减少这一开销。
  2. 增加浏览器并发连接数。浏览器对每个域名的并发连接限制一般为6个(IE为2个),增加域名个数相应的增加并发连接数,提高性能。
  3. 其它:方便CDN、服务器负载均衡、防盗等等。

设置步骤


1. 建立静态二级并解析到站点

例如主站为www.baiwar,com,静态资源域名使用s.baiwar.com


2. 设置.htaccess

为了避免搜索引擎重复收录,将可能导致搜索引擎对源站进行封锁,我们可以通过返回404或设置robots.txt来避免(二选一或同时设置均可)。

  • 返回404

.htaccess文件

#静态资源域名过滤非静态资源
    RewriteCond %{HTTP_HOST}  ^s.baiwar.com$
    RewriteCond %{REQUEST_FILENAME} !-f
#如果是非静态资源,返回404错误页面,根据实际情况定义
    RewriteRule ^(.*)$ index.php/error404 [L]

#主站域名过滤静态资源
    RewriteCond %{HTTP_HOST}  ^www.baiwar.com$
    RewriteCond %{REQUEST_FILENAME} .*\.(gif|jpg|jpeg|png|bmp|swf|css|js|ttf|woff)
#如果是静态资源,返回404错误页面
    RewriteRule ^(.*)$ index.php/error404 [L]
  • 设置robots.txt

static_robots.txt文件

User-Agent: *
Allow: /Public/Uploads/*.jpg$
Allow: /Public/Uploads/*.png$
Allow: /Public/Uploads/*.gif$
Disallow: /

主站的robots.txt文件须添加如下规则

Disallow: /Public/Uploads/*.jpg$
Disallow: /Public/Uploads/*.png$
Disallow: /Public/Uploads/*.gif$

.htaccess文件
放置在前部,使优先其生效

    RewriteCond %{HTTP_HOST}  ^s.baiwar.com$
    RewriteCond %{REQUEST_FILENAME} robots\.txt$
    RewriteRule ^(.*)$ static_robots.txt [L]

这样,通过www.baiwar.com 访问图片等静态资源时直接返回 404错误(搜索引擎也被屏蔽了的),只能访问非静态资源。

主域名访问图片时返回404错误

主域名访问图片时返回404错误<img alt="主域名访问图片时返回404错误" src="/uploads/image/150823/yz71otyim.png?media_id=210" title="主域名访问图片时返回404错误" width="600" >


通过s.baiwar.com访问非静态资源时返回404错误,只能访问静态资源。

静态域名访问图片时正常返回

静态域名访问图片时正常返回<img alt="静态域名访问图片时正常返回" src="/uploads/image/150823/yz61ur5pj.png?media_id=208" title="静态域名访问图片时正常返回" width="600" >


静态域名访问网页时返回错误

静态域名访问网页时返回错误<img alt="静态域名访问网页时返回错误" src="/uploads/image/150823/1dpf1wonhk.png?media_id=214" title="静态域名访问网页时返回错误" width="600" >


这样就设置好主域名和静态资源域名的访问限制和搜索引擎的抓取规则,并且方便做CDN(直接设置静态资源域名,而不影响主域名)。


3.设置Cookie

这里科普下Cookie的domain属性:

当浏览器请求一个网页的话会将cookie中domainpath符合该网站的Cookie数据发送到服务器,浏览器设置Cookie时也只能设置与访问网站匹配domain属性。

所以设置Cookie-free Domain时,重要的是匹配规则:

  1. Domain.baiwar.com时,当浏览器访问baiwar.comwww.baiwar.coms.www.baiwar.com和其他二级三级域名时都将发送该Cookie内容。
  2. Domainbaiwar.com 时,仅当浏览器访问baiwar.com才发送该Cookie内容,而其他如www.baiwar.coms.baiwar.com则不发送。
  3. 总之Domain属性的值以.开头匹配的是该域名及其子域名。

如上所诉,我们现在的静态资源域名s.baiwar.com不会被主域名www.baiwar.com干扰。

若发现被干扰,只需设置cookie时指定Domain属性即可。

php中:

bool setcookie ( string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]]]] )

thinkphp 中:在应用配置文件添加"COOKIE_DOMAIN"=>'www.baiwar.com'即可

效果:

访问主域名产生的Cookie

访问主域名产生的Cookie<img alt="访问主域名产生的Cookie" src="/uploads/image/150823/126p1peogu.png?media_id=212" title="访问主域名产生的Cookie" width="600" >


访问静态域名无Cookie

访问静态域名无Cookie<img alt="访问静态域名无Cookie" src="/uploads/image/150823/126p1od1ou.png?media_id=211" title="访问静态域名无Cookie" width="600" >


到此,Cookie-free Domain 便设置好了。

写在最后

如果是二级域名的话,其它第三方插件如百度统计等等会污染二级静态资源域名的Cookie。笔者并未找到很好的方法避免,但以下可以说是权宜之计:

  1. 不用百度统计
  2. 使用另外的独立域名来放置静态资源(设置方法同样参照本文)

猜你喜欢

微信QQ空间QQ好友新浪微博联系客服