文章目录

前言

由于3月初七牛云的云存储的CDN回源流量开始收费,穷困的我准备放弃使用七牛云存储,只使用CDN(研究后发现七牛云的0.15/GB已经是业界很低的价格了,如果有条件还是可以支持的)。于是我在3月初重新配置了一次CDN,可这次配置导致了一个奇怪的现象,那就是无论我如何设置CDN,访问的cdn.bewindoweb.com的时候总是产生一个HTTP 301永久跳转,跳转回了www.bewindoweb.com,再HTTP 200下发数据:

访问CDN就相当于只多了一层跳转,数据还是从网站服务器拿到的,完全没有CDN的作用……

最近发现越来越卡,图片的流量挤爆了我的1M小水管,网站打开一直转圈圈,于是下定决心要弄好为止。

一、查找表面原因

百度了半天CDN跳转301回源站,出来的都是不相关的信息,所以我打算从七牛的监控来看。

打开七牛云融合CDN的监控,调取近一个月的状态码,发现自从改了之后,以前的命中200全部变成了永久跳转301:

仔细地对比2月份和3月份的数据:

可以确定一定有哪里出问题了,注意到3月份还是有200的,于是去看看200是些什么数据,把日志下载下来,发现200是直接访问cdn.bewindoweb.com的,而301全是图片URL:

HIT 18 [10/Mar/2019:04:21:53 +0800] "GET http://cdn.bewindoweb.com/uploadpic/fedd9da8584c1430eaa23b6e1abc6c2e.png HTTP/1.1" 301 
HIT 73 [10/Mar/2019:04:56:28 +0800] "GET http://cdn.bewindoweb.com/ HTTP/1.1" 200 

修改了很多地方,包括重新使用七牛云存储、修改防盗链Refer,都不行,说明是CDN的设置问题。实在是不了解为什么跳转,于是提交了工单,和客服小哥哥聊天,其实现在回去翻记录,小哥哥在第一句话就指出了问题所在:

你好, 您设置源站为 www.bewindoweb.com,测试您的测试资源是301跳转到您的源站url: 您这边源上是否有设置了跳转

我当然不知道,于是继续聊,他也在测试,测试后发现当源站域名和回源Host这样配置的时候,能够成功获取到数据:

类目 数值 
 源站域名www.bewindoweb.com 
 回源Host www.bewindoweb.com

而我是这样设置的:

类目 数值 
 源站域名www.bewindoweb.com 
 回源Hostcdn.bewindoweb.com

当我把回源host修改成www了之后发现,部分图片URL的CDN可以正常访问了。当我用七牛云提供的刷新预取功能重置了CDN有关图片的缓存后,全站CDN可以正常访问了。

二、解决办法

所以解决办法就是将回源Host从cdn.bewindoweb.com改为www.bewindoweb.com,重新刷新CDN缓存,就可以正常使用了。

三、探究回源Host

为什么这样配置就好用了呢,仔细理解回源Host的定义:

回源 HOST :是指 CDN 节点在回源过程中,在源站访问的站点域名。

具体地说:

  • 源站:源站决定了回源时,请求到哪个 IP 。 
  • 回源 HOST :回源 HOST 决定回源请求访问到该 IP 上的哪个站点。

画出来访问过程就是,CDN发生回源的时候,先用源站域名找到IP地址,在访问这个IP的时候携带回源Host,来表明自己要访问这台机器上的哪个站点。

为什么要携带Host呢,因为一台机器可能会部署多个子站点,比如图片用img、文件用file,网站服务器可以根据不同的Host进行对应的处理。

再来思考为什么我用cdn.bewindoweb.com作为回源Host不行呢?由于我只缓存图片,所以设置成了cdn,按理来说应该可以,于是回去检查nginx配置,发现:

if ($host != 'www.bewindoweb.com'){
        	rewrite ^/(.*)$ http://www.bewindoweb.com/$1 permanent;
        }

终于找到301跳转的原因,我自己配置的……这是很久以前,我为了防止直接通过IP地址访问的时候,URL前面是IP,或者用www.bewindoweb.cn访问的时候,URL前面是cn,用nginx强制给替换成.com了。而发布的站点就只有www一台,所以用www做回源域名可以访问到数据,用cdn做回源域名被301跳转到www。最开始小哥哥就说了是不是我自己设置了跳转,我根本想不起来这件事,现在终于理解了原因。

所以我百度的问题就错了,因为根本不会有其他的人碰到这种问题,重新百度“回源Host配置”,大量的正确解答出来了,比如《【CDN 常见问题】CDN回源Host的意义》中的这段话:

举例说明,如下是一段nginx配置server的常用配置方法,从该配置上我们可以查看到该服务器上配置一个名为www.aliyun.com的站点监听服务器的80端口,并设置了该站点的根目录路径。

server {

   listen 80; #default_server; 

   server_name www.aliyun.com; 

   location / { 

       root /alidata/www/www-aliyun-com/;

   } 

}

然后创建cdn加速域名cdntest1.aliyun.com,设置其源站为www.aliyun.com,并设置回源端口为80端口。此时如果设置回源host为关闭或者设置为cdntest1.aliyun.com时,将导致CDN回源时到源站查找server_name为cdntest1.aliyun.com的站点,而由于源站配置配置对应的站点导致出现4XX的错误了。因此此时正确的配置应该将回源host改成www.aliyun.com,这样才可以找到对应的server并到其location目录中查找对应的文件返回给CDN节点。

这个4xx找不到的理由不就和我3xx跳转一样嘛!

总之问题解决、原因找到了,很开心。七牛的服务态度真的特别好,我刚提交工单很快就回复了,哪怕我是免费用户……不像阿里或者腾讯服务器,提交半天没人理……以后多支持吧。


转载请注明出处http://www.bewindoweb.com/254.html | 三颗豆子
分享许可方式知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议
重大发现:转载注明原文网址的同学刚买了彩票就中奖,刚写完代码就跑通,刚转身就遇到了真爱。
你可能还会喜欢
具体问题具体杠