这段时间碰到个很崩溃的问题,一个页面通过 script 加载请求服务端进行统计再输出js进行跳转,分为两个步骤分别统计,
- 打开页面通过script 请求远程服务器进行统计并输出要通过js使页面跳转的最终地址。
- 页面获取跳转地之后通过 location 进行跳转
很简单一个事情,但在百度移动搜索上出了个大问题:
通过百度搜索引擎关键词搜索到网页后,只跳转了却没有进行第一步请求,非常奇怪。
研究了半天才发现这个百度移动的自动转码问题
类似下图搜索结果,网页上被投放过JS跳转,导致被百度缓存,下次点击将不会再进入网站页面而是直接跳转到了第二步的目标页面,导致第一步统计失效
// 只是类似这样的链接,下面的链接可能已经失效了
$url = 'http://m.baidu.com/from=0/bd_page_type=1/ssid=0/uid=0/pu=usm%400%2Csz%401320_1001%2Cta%40iphone_2_4.3_3_534/baiduid=637EBC50744C1291B831A26D208F44D8/w=0_10_%E7%A6%81%E4%B9%A6%E5%A4%A7%E5%85%A8%E9%9B%86/t=iphone/l=3/tc?ref=www_iphone&lid=13212517736186082851&order=1&vit=osres&tj=www_normal_1_0_10_title&m=8&srd=1&cltj=cloud_title&dict=32&title=%E5%8D%81%E5%A4%A7%E7%A6%81%E4%B9%A6%E4%B9%8B%E5%B0%91%E5%B9%B4%E9%98%BF%E5%AE%BE%E7%9B%AE%E5%BD%95%2C%E5%8D%81%E5%A4%A7%E7%A6%81%E4%B9%A6%E4%B9%8B%E5%B0%91%E5%B9%B4%E9%98%BF%E5%AE%BE%E6%9C%80%E6%96%B0%E7%AB%A0%E8%8A%82...&sec=8191&di=e644ac04d0707d79&bdenc=1&nsrc=IlPT2AEptyoA_yixCFOxXnANedT62v3IEQGG_zRPQGjm95qshbWxBcNiV8KhVinHVZy';
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false);
$content = curl_exec($curl);
echo htmlentities($content);
curl_close($curl);
通过CURL进行抓取内容,设置为不跟随跳转,获取第一次请求输出的内容如下:
看图上三个红色箭头,这是百度自己转码输出的js跳转加 meta refresh 两种跳转代码,他居然把我跳转的地址直接抓取了,真牛比,不知道百度是怎么实现的,导致第一步的请求只有刚放上去的时候请求过一两次,然后第二天一整天发现都没有被请求过,说明百度是在搜索结果页面直接跳转的,而根本没有进入网页,将跳转地址给缓存了。
如果把跳转放在个复杂的 if 判断里面或者 加个 几秒钟的延迟不知道会怎么样,如果是分析代码得出的话,那页面上的js超级多,要是条件在另一个js里面动态输出的他又怎么抓,如果不是分析js,百度怎么可能知道我什么时候跳转呢,他不可能一直监听几分钟吧,
对于站长来说可以增加百度自身的协议或手机适配文件来拒绝被转码
但网站并不是我的,我也无权操作页面其他部分,完全无解了,百度这个转码太坑爹了
目前也没有条件再进行测试,很是郁闷。。不过他还是会隔段时间进行更新的,撤掉js跳转后也会自动恢复