一直以为博主站点的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。