WordPress更改URL规则后,旧地址301跳转的实现原理

原创 zhaoliang  2017-03-10 15:54  阅读 702 views 次

最近修改了博客的链接规则,导致之前被收录的一些页面无法跳转至正确的页面,于是就对WordPress内置的Url规则进行了调试跟踪,准备在原有基础上进行修改调整,以保证已收录的地址能够准备重定向到新页面。折腾了大半天,竟是一行代码都没变动,只修改了一下WordPress存储在数据库中的配置信息就搞定了。

WordPress内置的URL Rewrite功能非常的强大,正常情况下可以保证我们在后台修改了URL规则后,还能准确的将原URL地址301重定向到新的地址页面,但是WordPress本身对这类的重定向要求还是比较严格的:就是原地址子域名必须与后台配置中的“站点URL”(见图)域名一致才可以,否则就会出现404页面了。这次经历也是跟我的强迫证有关,把“站点URL”跟“WordPress地址(URL)”都由原来的www.58cm.cn改成了blog.58cm.cn有关。

wordpress

后台常规配置

3

WordPress工作代码顺序

通过这次经历,也对WordPress的URL Rewrite功能有了一定的了解和知识,下面简单分享一下WordPress内置重定向的实现原理。

#0  wp_old_slug_redirect()
#1  call_user_func_array(wp_old_slug_redirect, Array ([0] => )) called at [/var/www/58cm/wp-includes/plugin.php:496]
#2  do_action(template_redirect) called at [/var/www/58cm/wp-includes/template-loader.php:12]
#3  require_once(/var/www/58cm/wp-includes/template-loader.php) called at [/var/www/58cm/wp-blog-header.php:16]
#4  require(/var/www/58cm/wp-blog-header.php) called at [/var/www/58cm/index.php:17]

 

1.WordPress接收请求识别对应的URL类别:在wp()方法执行完之后,WordPress的基本配置及前期URL处理工作已经完成,然后通过wp-includes/template-loader.php文件中的do_action( 'template_redirect' )去获取URL对应的页面内容;

2.wp-includes/plugin.php中的do_action在执行过程中,会通过回调诸多方法,如果URL符合当前的规则且有对应的文章信息,就去调用文章模板从而渲染出结果页面;如果没有,在众多回调方法中,会调用到wp-includes/canonical.php文件中的redirect_canonical方法,去查询有无对应的文章id或post_name;

	do {
		foreach ( (array) current($wp_filter[$tag]) as $the_ )
			if ( !is_null($the_['function']) )
				call_user_func_array($the_['function'], array_slice($args, 0, (int) $the_['accepted_args']));

	} while ( next($wp_filter[$tag]) !== false );

 

3.redirect_canonical通过URL参数查询后,有对应的结果则使用“站点URL”(wp_options表中的home记录)拼接成新的地址URL,再回调redirect_canonical自身,回调自身的同时会判定跳转目标URL与当前域名接组后的目标URL是否一致,如果一致则执行header方法进行301跳转至新页面,否则直接返回false,调用404模板,显示页面丢失。

我这次的问题就出现在第3步时回调redirect_canonical自身时,因为生成的目标URL与当前域名拼接后的URL不一致导致,从而出现404错误,看完这通代码后,还是蛮佩服WordPress开发团队的,整体的逻辑非常严谨,而且在安全性方面也考虑的很细致,通过redirect_canonical一个方法就能发现,即使是个简单的重定向操作,WordPress在安全方面也考虑的很细致到位。

本文地址:http://blog.58cm.cn:8088/archives/245.html
版权声明:本文为原创文章,版权归 zhaoliang 所有,欢迎分享本文,转载请保留出处!
PREVIOUS:已经是最后一篇了

评论已关闭!