7
回答
求教taobao这个是怎么实现的
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

<link href="http://a.tbcdn.cn/p/??header/header-min.css,fp/2010c/fp-base-min.css,fp/2010c/fp-channel-min.css,fp/2010c/fp-product-min.css,fp/2010c/fp-mall-min.css,fp/2010c/fp-category-min.css,fp/2010c/fp-sub-min.css,fp/2010c/fp-gdp4p-min.css,fp/2010c/fp-css3-min.css,fp/2010c/fp-misc-min.css?t=20100902.css" rel="stylesheet" />

 

合并加载了所有css..

举报
waney
发帖于7年前 7回/870阅
共有7个答案 最后回答: 5年前

找到一段,但似乎不是现在这个。

 

apache2.2.14的rewrite的语法不熟悉,用php来搞
场景1,外部脚本
http://a.tbcdn.cn/tbra/2.1/header/header-min.js
场景2,内部脚本
http://a.tbcdn.cn/yui/3.0.0/build/oop/oop-min.js
场景3,内外(内内,外外)合并脚本
http://a.tbcdn.cn/combo?yui/3.0.0/build/oop/oop-min.js&tbra/2.1/header/header-min.js

rewrite配置
RewriteEngine On
RewriteRule ^/combo?(.+)$ /get.php?$1 [QSA,L]
RewriteEngine On
RewriteRule ^/(.+)$ /get.php?$1 [QSA,L]

<?php
/**
* set e-tag cache
*/
function cache($etag){
$etag = $etag; //标记字符串,可以任意修改
if ($_SERVER['HTTP_IF_NONE_MATCH'] == $etag){
header('Etag:'.$etag,true,304);
exit;
}
else header('Etag:'.$etag);
}

function get_contents($url){
$ch =curl_init($url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$str =curl_exec($ch);
curl_close($ch);
if ($str !==false) {
return $str;
}else {
return '';
}  
}

//得到扩展名
function get_extend($file_name) { 
$extend =explode("." , $file_name); 
$va=count($extend)-1;
return $extend[$va]; 


/**
* logic begin
*/
$files = array();
//cdn上存在的各种可能的文件类型
$header = array(
'js' => 'Content-Type: application/x-javascript',
'css' => 'Content-Type: text/css',
'jpg' => 'Content-Type: image/jpg',
'gif' => 'Content-Type: image/gif',
'png' => 'Content-Type: image/png',
'jpeg' => 'Content-Type: image/jpeg',
'swf' => 'Content-Type: application/x-shockwave-flash'
);
$type = '';
foreach ($_REQUEST as $k => $v) {
//各种可能的替换规则
$k = preg_replace(
array('/_(js|css|gif|png|jpg|jpeg|swf)$/','/yui\/2_8_0r4/','/yui\/3_0_0/','/(\d+)_(\d+)_(\d+)/','/(\d+)_(\d+)/','/_v(\d)/'),
array('.$1','yui/2.8.0r4','yui/3.0.0','$1.$2.$3','$1.$2','.v$1'),
trim($k,'/')
);
if(empty($type)) {
$type = get_extend($k);
}
//文件存在
if(file_exists($k)) {
//处理文本
if(preg_match('/js|css/',$type)){
$files[] = file_get_contents($k);
}else{
//处理非文本
$files[] = array(file_get_contents($k));
}
}else{
//文件不存在

//文本的处理
if(preg_match('/js|css/',$type)){
$files[] = '/* http://a.tbcdn.cn/'.$k.' */';
$files[] = join('',file('http://a.tbcdn.cn/'.$k));
}else{
//非文本的处理
$files[] = file('http://a.tbcdn.cn/'.$k);
}
}
}

header("Expires: " . date("D, j M Y H:i:s", strtotime("now + 10 years")) ." GMT");
//文本的处理
header($header[$type]);//文件类型
if(preg_match('/js|css/',$type)){
$result = join("\n",$files);
}else{
//非文本的处理
$result = join("",$files[0]);
}
cache(md5($result));//etag,处理Etag是否多余?
echo $result;
?>
这种方式是 Yahoo! 提出来的,学名叫做 Combo Handler。主要功能就是减少 HTTP 请求数,将类型相同的静态资源通过一个 HTTP 请求进行合并请求。
顶部