背景:
大家都知道,电脑、平板、手机的屏幕是差距很大的,比如在电脑上写好了一个页面,在电脑上显示很正常,但是若通过手机访问,那可能就会乱的一塌糊涂,这个时候怎么解决呢?有一种常见的办法是专门为手机定制一个页面,当用户访问的时候,判断设备是手机还是电脑,如果是手机则跳转到相应的手机页面,例如百度的就是,手机访问www.baidu.com就会跳转到m.baidu.com。
问题描述:
客户反馈移动端访问http://3qys.com.cn/xxx时,没有按照预期跳转至http://m.3qys.com.cn/xxx。
原因分析:
1、确认问题时间点附近,CDN侧是否有配置变更;
2、确认移动端访问跳转的功能是由客户源站实现,还是CDN侧实现;
经确认,该跳转功能是由源站实现,且源站和CDN侧均无配置变更。
模拟移动ua测试,未复现现象。分析日志,发现问题时间点前有pc端访问http://3qys.com.cn/的记录,且该url匹配到缓存策略,被节点缓存住了。此时,原因定位到!!!
默认情况下,CDN侧并不会区分ua缓存,也就是pc端访问某文件缓存住后,移动端再请求至有该文件缓存的节点时,会直接命中,不会再回源。
ps:若源站有响应头Vary: User-Agent,有些CDN厂商会根据不同的ua区分缓存。腾讯云会忽略vary头,即不会根据vary头部值的不同而区分缓存。
测试方法:
1、curl -A 模拟测试
curl -voa 'http://3qys.com.cn/eg_tulip.jpg' -A 'iphone'
2、下载谷歌插件,通过谷歌浏览器模拟移动ua测试
https://chrome.google.com/webstore/detail/user-agent-switcher-for-c/djflhoibgkdhkhhcedjiklpkjnoahfmg/related
安装完成后,浏览器右上角会出现如下图标,点击"User-Agent Switcher for Chrome",选择需要测试的移动端设备类型即可。
解决方案:
1、跳转功能由源站实现,但需要跳转的url,CDN侧需配置不缓存,但这种方式会对源站造成压力。
2、由CDN侧实现访问跳转功能,即用户访问至边缘时,节点根据请求的ua来决定是否跳转,跳转到哪个地址。---推荐使用
配置该功能时,需要和客户确认移动端ua列表(是否区分大小写),需要设置跳转的url,以及希望跳转到哪个url。
示例:
ua:android|iphone|UCWEB|ipod|windows phone,不区分大小写
跳转url:除 3qys.com.cn/topics/、3qys.com.cn/zhuanti/ 这2个url,其它url均需要设置跳转
跳转后的url:http://m.3qys.com.cn/xxx