Wordpress自带301重定向功能原理简析

一直以为博主站点的redirect no-www => yes-www是服务器Apache自动配置,今天才偶然发现是Wordpress自带301功能,只需在后台设置->常规里面的站点地址(siteurl)设置即可,以博主域名为例,如果站点地址设置为http://www.iwww.me那么地址栏输入iwww.me将会跳转至www.iwww.me,如果站点地址设置为https://iwww.me则恰好相反。~本文非301设置教程,仅浅显分析Wordpress自带301功能原理 设置之后进行301重定向检测可以发现头部返回状态码已经成功返回301,但是这种方法是对网页头部进行301重定向,非Apache&Nginx301,效率不如Apache&Nginx,不过个人觉得那点速度影响不大,懒得修改~ 说下Wordpress自带的301功能实现原理,博主查看了好久,才找到相关代码,其位置在
/wp-includes/ -> canonical.php -> redirect_canonical()
好家伙,一个方法写了将近500行代码,博主实在没勇气看下去的勇气,放出关键代码:
// Ignore differences in host capitalization, as this can lead to infinite redirects
	// Only redirect no-www <=> yes-www
	if ( strtolower($original['host']) == strtolower($redirect['host']) ||
		( strtolower($original['host']) != 'www.' . strtolower($redirect['host']) && 'www.' . strtolower($original['host']) != strtolower($redirect['host']) ) )
		$redirect['host'] = $original['host'];
下面这个是执行过程:
if ( $do_redirect ) {
		// protect against chained redirects
		if ( !redirect_canonical($redirect_url, false) ) {
			wp_redirect($redirect_url, 301);
			exit();
		} else {
			// Debug
			// die("1: $redirect_url
2: " . redirect_canonical( $redirect_url, false ) ); return false; } } else { return $redirect_url; }
这个方法名为:redirect_canonical,我很疑惑为什么在方法内部还能调用redirect_canonical(),这个实在没有理解,如果有人看到这个文章知道这是怎么回事还请留言告知~ wp_redirect方法在
/wp-includes/ -> pluggable.php -> wp_redirect()
代码为:
function wp_redirect($location, $status = 302) {
	global $is_IIS;

	/**
	 * Filter the redirect location.
	 *
	 * @since 2.1.0
	 *
	 * @param string $location The path to redirect to.
	 * @param int    $status   Status code to use.
	 */
	$location = apply_filters( 'wp_redirect', $location, $status );

	/**
	 * Filter the redirect status code.
	 *
	 * @since 2.3.0
	 *
	 * @param int    $status   Status code to use.
	 * @param string $location The path to redirect to.
	 */
	$status = apply_filters( 'wp_redirect_status', $status, $location );

	if ( ! $location )
		return false;

	$location = wp_sanitize_redirect($location);

	if ( !$is_IIS && php_sapi_name() != 'cgi-fcgi' )
		status_header($status); // This causes problems on IIS and some FastCGI setups

	header("Location: $location", true, $status);

	return true;
}
这个很容易理解,header("Location: $location", true, $status);这段关键代码实现了301跳转。 顺便鄙视一下百度,博主的站点设置了301,Google对www.iwww.me和iwww.me收录量一致,都为98,近乎完美,可是百度对www.iwww.me收录33,对iwww.me收录为49。