I'm starting to provide Chinese / English versions of some posts, switch with the Language menu above. 我开始提供部分文章的中文、英文翻译,请使用顶部语言菜单切换。

用新浪云和百度云搭建自己的 CDN

警告:由于我疏忽,把 SAE CDN 的 index.php 代码打错了一行,请参照下面代码中的注释修改代码,否则将造成远程图片不能获取的问题。

大多数人的博客都放在国外,原因我不说了。但是 SAE 和 BAE 的服务器放在国内,速度很快(SAE 由于是电信通机房,抽风有点严重),因此我们可以利用它们为自己的博客加速。

1.SAE 搭建 CDN

这个方法要用到 SaeLayerCDN,在 SAE 的应用商店里也有,可以一键安装,然后修改几个简单的设置就完成运行。不过让我百思不得其解的是,为什么一个能在一个 php 文件里完成的东西愣是要弄成 5 个,还要搞面向对象的编程?

我把里面的无用代码删除了一大堆,并且合并到了一个 php 里。

安装方法:SAE 里创建应用,创建一个 storage 名为 cache,代码管理里创建代码库,在编辑代码里创建以下文件:

1)config.yaml 内容:

name: 你的appid
version: 你的版本号,一般是1
handle:
- compress:compress
- rewrite:goto "index.php?q=$1"

2)index.php 内容:

<?php
define('STATIC_URL','你的网站url,含http和末尾斜杠');
define('DOMAIN','你的storage名字,默认是cache');
$content_type = 'application/force-download';
$request = ltrim($_GET['q'],'/');
$temp = array();
if(preg_match('/\.(jpg|jpeg|png|gif|css|js)$/i', $request,$temp)===1){
    switch($temp[1]){
        case 'jpg':{$content_type="image/jpeg";}break;
        case 'jpeg':{$content_type="image/jpeg";}break;
        case 'png':{$content_type="image/png";}break;
        case 'gif':{$content_type="image/gif";}break;
        case 'css':{$content_type="text/css";}break;
        case 'js':{$content_type="text/javascript";}break;
    }
}
$instance = new SaeStorage(SAE_ACCESSKEY,SAE_SECRETKEY);
if($instance->fileExists(DOMAIN,$request)){
    $content = $instance->read(DOMAIN,$request);
}else{
//    $content = @file_get_contents(BASE_URL.$request);
// 原先我把上面一行打错了,请改成下面一行
    $content = @file_get_contents(STATIC_URL.$request);
    $instance->write(DOMAIN,$request,$content);
}
header("Expires:".date("D, j M Y H:i:s GMT",time()+315360000));
header("Last-Modified:Sat,26 Jul 1997 05:00:00 GMT");
header('Content-type:'.$content_type);
header('Cache-control:public');
echo $content;

保存,然后把你原网站里所有的图片、视频等你希望走 SAE 的内容的 URL 从你的网站改成 SAE 给你的二级域名。

2.BAE 搭建 CDN

这个可就没有现成代码了,我就照着上面的那个改了一下。要命的是 BAE 官方的开发文档有问题,搞得我折腾半天。

BAE 创建应用,类型为 PC Iframe,然后打开 BAE 托管。

在云存储里创建一个 bucket,名字自定。

在应用配置里增加一条 url 类型规则,规则为 “/(.*)”(不含引号),执行 index.php。

在代码管理里面创建一个文件,名为 index.php,内容如下:

<?php
define('STATIC_URL','你的网站URL,含http和末尾斜杠');
define('DOMAIN','你的BAE Bucket名字');
$content_type = 'application/force-download';
$request = ltrim($_SERVER['REQUEST_URI'],'/');
$temp = array();
if(preg_match('/\.(jpg|jpeg|png|gif|css|js)$/i', $request,$temp)===1){
    switch($temp[1]){
        case 'jpg':{$content_type="image/jpeg";}break;
        case 'jpeg':{$content_type="image/jpeg";}break;
        case 'png':{$content_type="image/png";}break;
        case 'gif':{$content_type="image/gif";}break;
        case 'css':{$content_type="text/css";}break;
        case 'js':{$content_type="text/javascript";}break;
    }
}
$instance = new BaiduBCS();
if($instance->is_object_exist(DOMAIN,'/'.$request)){
  $content = $instance->get_object(DOMAIN,'/'.$request)->body;
}else{
  $content = @file_get_contents(STATIC_URL.'/'.$request);
  $instance->create_object_by_content(DOMAIN,'/'.$request,$content);
}
header("Expires:".date("D, j M Y H:i:s GMT",time()+315360000));
header("Last-Modified:Sat,26 Jul 1997 05:00:00 GMT");
header('Content-type:'.$content_type);
header('Cache-control:public');
echo $content;

存盘即可。

我已经把这个部署完毕了,等会上传数据。

本站使用运行在 Vercel 上的 Waline 评论系统,中国大陆访问可能不稳定。