链接重定向对于那些特别在意排名,垃圾评论特别多的博客很有用,其原理就是把"http://xia.im"这样的直接链接变为"http://xia.im/r.php?url=http://xia.im",站外链接变成了站内链接,避免了大量导出链接导致的页面等级下降(WordPress 倒是会自动加上rel="nofollow external"的属性)。

在主题的function.php中加入:

//对评论作者网址进行过滤
add_filter('get_comment_author_link', 'add_redirect_comment_link', 5);
//对评论内容中的网址进行过滤
add_filter('comment_text', 'add_redirect_comment_link', 99);
function add_redirect_comment_link($text = ''){
	//替换链接地址为重定向的地址
	$text=str_replace('href="', 'target="_blank" href="/r.php?url=', $text);
	$text=str_replace("href='", "target='_blank' href='/r.php?url=", $text);
	//给评论作者网址加上 redirect 的 class,以备后用
	$text=str_replace('class="', 'class="redirect ', $text);
	$text=str_replace("class='", "class='redirect ", $text);
	//给评论内容中的网址加上 redirect 的 class,以备后用
	$text=str_replace('rel="nofollow"', 'rel="nofollow" class="redirect"', $text);
	$text=str_replace("rel='nofollow'", "rel='nofollow' class='redirect'", $text);
	return $text;
}


然后新建一个名为 r.php 的文件放在网站的根目录,内容为:

//将"http://xia.im"替换为对应的网址
<?php
	//'url'与替换后网址后的"r.php?url="相对应,r.php 和 url 可自定义。
	$redirect = $_GET['url'];
	if($redirect){
		//判断Http请求来源,来自本站则重定向到该地址。
		if(strpos($_SERVER['HTTP_REFERER'],'http://xia.im/') !== false){
			header("Location: $redirect");
			exit;
		//否则跳转到本站首页
		}else{
			header("Location: http://xia.im/");
			exit;
		}
	}
?>

刚才加上的 redirect 的 class 有什么用?为了让大部分浏览者看不出网址实际已经重定向过,也为了减少服务器的负载(处理重定向,实际上负载几乎可以忽略),利用 jQuery 的 each 把所有带有 redirect class 的链接处理,把"/r.php?url="这个参数去掉,这样开启了 JavaScript 功能的浏览者看到的仍然是未经处理的 URL,没有开启 Javasciprit 的浏览者(比如浏搜索引擎的蜘蛛程序)看到的是经过处理的 URL,实际上写r.php的作用就是为保证未开启 JavaScript 的浏览这也能正确导向到正确地址,算是一个冗余吧。
如果觉得没有必要,那么加 class 和这段 JavaScript 就没有什么作用了,可忽略。

把下列 JavaScript 放到该放的地方,jQuery(function($){}内:

$('.redirect').each(function(){
	var redirect = $(this).attr('href');
	redirect = redirect.replace('/r.php?url=','');
	$(this).attr('href',redirect);
});

完毕,重定向这方法,我是不用的,因为我觉得没有必要= =

另外,我首页的邮箱链接是经过处理的,就是利用了蜘蛛不理睬 JavaScript 而浏览者 99% 会开启 JavaScript 的事实,大大降低了被邮箱收集器收集的概率。

  1. 想请教下博主, 假如想把文章内的非本站链接也用这种重定向的话应该要怎样写阿.. 求指导 T^T

    • @Mr.Knight
      暂时只想到这个:

      add_filter('the_content', 'add_redirect_content_link', 99);
      function add_redirect_content_link($text = ''){
      	$text=preg_replace('/href=["\']([^#])/','href="/r.php?url=$1',$text);
      	$text=preg_replace('/href=["\']\/r.php\?url=(.*?)xiaoxia\.de/','href="$1xia.im',$text);
      	return $text;
      }

      缺点很多:不能使用相对路径;文章中如有类似的源代码也会被替换。暂时想不出更完善的方法了。

  2. 很好的文章,正是我想找的。防止泛滥的 Spam 是有用的,希望文章有一些评论,这样可以对搜索引擎表明文章符合用户体验,引蜘蛛更新。替换自己的首页或者内页链接,我觉得很棒。

  3. 这样就没必要让读者留网址了。。我就见过这样设置的人。