Apache中通过配置.htaccess设置单独二级域名(cookie-free)放置静态文件
更新时间:2015-10-20 点击量:1907

为什么要设置单独的域名放置静态资源
可以看到网络中很到知名网站使用一个单独的域名(二级或独立域名,大部分是独立域名)放置静态资源,这样做的好处:
- Cookie-free Domain,减少浏览器请求时网络开销。浏览器请求静态资源时,依然会把当前域名下的cookie数据一并发送到服务器(虽然服务器会直接忽略),Cookie-free就减少这一开销。
- 增加浏览器并发连接数。浏览器对每个域名的并发连接限制一般为6个(IE为2个),增加域名个数相应的增加并发连接数,提高性能。
- 其它:方便CDN、服务器负载均衡、防盗等等。
设置步骤
1. 建立静态二级并解析到站点
例如主站为www.baiwar,com
,静态资源域名使用s.baiwar.com
。
2. 设置.htaccess
为了避免搜索引擎重复收录,将可能导致搜索引擎对源站进行封锁,我们可以通过返回404或设置robots.txt来避免(二选一或同时设置均可)。
- 返回404
.htaccess文件
#静态资源域名过滤非静态资源
RewriteCond %{$
RewriteCond %{REQUEST_FILENAME} !-f
#如果是非静态资源,返回404错误页面,根据实际情况定义
RewriteRule ^(.*)$ index.php/error404 [L]
#主站域名过滤静态资源
RewriteCond %{$
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 %{$
RewriteCond %{REQUEST_FILENAME} robots\.txt$
RewriteRule ^(.*)$ static_robots.txt [L]
这样,通过www.baiwar.com 访问图片等静态资源时直接返回 404错误(搜索引擎也被屏蔽了的),只能访问非静态资源。
主域名访问图片时返回404错误
通过s.baiwar.com
访问非静态资源时返回404错误,只能访问静态资源。
静态域名访问图片时正常返回
静态域名访问网页时返回错误
这样就设置好主域名和静态资源域名的访问限制和搜索引擎的抓取规则,并且方便做CDN(直接设置静态资源域名,而不影响主域名)。
3.设置Cookie
这里科普下Cookie的domain
属性:
当浏览器请求一个网页的话会将cookie中
domain
和path
符合该网站的Cookie数据发送到服务器,浏览器设置Cookie时也只能设置与访问网站匹配的domain
属性。
所以设置Cookie-free Domain时,重要的是匹配规则:
Domain
为.baiwar.com
时,当浏览器访问baiwar.com
、www.baiwar.com
、s.www.baiwar.com
和其他二级三级域名时都将发送该Cookie内容。Domain
为baiwar.com
时,仅当浏览器访问baiwar.com
才发送该Cookie内容,而其他如www.baiwar.com
或s.baiwar.com
则不发送。- 总之
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 $ ]]]]]] )
thinkphp中:在应用配置文件添加
"COOKIE_DOMAIN"=>'www.baiwar.com'
即可
效果:
访问主域名产生的Cookie
访问静态域名无Cookie
到此,Cookie-free Domain 便设置好了。
写在最后
如果是二级域名的话,其它第三方插件如百度统计等等会污染二级静态资源域名的Cookie。笔者并未找到很好的方法避免,但以下可以说是权宜之计:
- 不用百度统计
- 使用另外的独立域名来放置静态资源(设置方法同样参照本文)
如果文章对您有帮助,就打赏一个吧