302状态代码的意思有点模棱两可。它表明内容“暂时地”被移动,但老的URL地址根本没有被废除。除非被报头信息Cache-Control或Expires明确指定,否则客户不会缓存结果。因为302也用于一些付费广告链接,情况甚至会更混乱,但是这种用法不在这里讨论。
302状态代码最大的问题是,对搜索引擎而言,它的意思依赖于它的上下文。实际应该用中,应该把他分成两种:内部临时的重定向,即从域A的一个页面到域A的另一个页面;外部临时的重定向,从域A的一个页面到域B的一个页面。
浏览在解释302重定向的时候总是遵循基定义——无论对于内部和外部都如此。然而,目前大部分搜索引擎只把它作为内部的302重定向来使用。这样,对于一个内部的302重定向,搜索引擎不会缓存重定向结果,并且将域A继续列于SERP中。这与定义是一致的。
外部302重定向则复杂一些。GOOGLE的Matt Cutts宣称,超过99%的时间里,GOOGLE将列出的目标结果,即域B而不是域A。这是与标准相背离的,而GOOGLE这么做是为了减轻“302动持”的攻击。
“302劫持”是指,利用域A上的一个页引用有高质量更新内容的域B。这样,基于从域B“偷来”的更新内容,这个页面会有较好的排名。并且利用伪装方式,将用户重定向到另一个页面。这种行为如此盛行,以至于GOOGLE和YAHOO都不得不在政策上作出调整。正如Matt Cutts所说,“在超过99%的时间里,GOOGLE转向一组启发方式方法来返回目标页面。为什么不是100%呢?几乎所有的搜索引擎都保留一点例外的权力。当我们认为源页面更好时,才会这么做;当然这种情况很罕见。”
在地址http://www.mattcutts.om/blog/seo-advice-discussing-302-redirects/有Matt Cutts讨论外部302的文章。在这种情况下,RFC的定义不是规则——它变成了例外!大部分情况下,外部302被当作301处理,除非它不会影响链接价值的传递。
在实际应用中,比如动态网站中,无论如何都应该评估302状态代码是否真正必需。如果想把某个URL地址临时存放不同的内容,最好是采用一种显而易见的方法来改变内容。在实际上可以使用一个include(),或者远程获取并显示替代的内容,从一开始就防止产生对302状态代码的需要。为此,需要使用PHP的 cURL功能——Client URL Library。
假设老的页面被称为old_page.php,而包含了所需要内容的页面称为new_page.php。只要在前者使用如下代码,就可以包含后者的内容:
include('new_page.php');
为了使用cURL从不同的服务器获取内容,可以这样做:
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,'http://www.example.com/new_page.php');
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
echo curl_exec($ch);