让代码更简单

记录WordPress出现的/1重定向问题解决办法

重要:本文最后更新于2022-11-22 09:00:11,某些文章具有时效性,若有错误或已失效,请在下方留言或联系代码狗

一个月前发现本站访问目录的第一页会自动重定向到/1的异常url地址上,当时为了快速解决bug不影响到用户使用,直接修改了所有目录生成的分页地址,直接去掉了最后的一个/,前几天又发现了新问题。

通过宝塔后台的网站监控报表发现仍然有不少/1的重定向URL。于是决定彻底解决这一问题,经过一番查找后发现是曾经为了解决wordpress文章分页URL不好看的问题,使用了知更鸟大佬提供的一段重写文章分页链接的代码引起的。

代码如下:

复制
// 适合/%post_id%.html分页链接修正
class Rewrite_Inner_Page_Links_id{
	var $separator;
	function __construct(){
		$this->separator = '/page-';
		if( !is_admin() || defined( 'DOING_AJAX' ) ) :
			add_filter( 'wp_link_pages_link', array( $this, 'inner_page_link_format' ), 10, 2 );
			add_filter( 'get_comments_pagenum_link', array( $this, 'comment_page_link_format' ) );
			add_filter( 'redirect_canonical', array( $this, 'cancel_redirect_for_paged_posts' ), 10, 2 );
		endif;
		if( is_admin() ) :
			add_filter( 'rewrite_rules_array', array( $this, 'pagelink_rewrite_rules' ) );
			register_activation_hook( __FILE__, array( $this, 'flush_rewrite_rules' ) ) ;
			register_deactivation_hook( __FILE__, array( $this, 'flush_rewrite_rules' ) );
		endif;
	}
	function flush_rewrite_rules(){
		flush_rewrite_rules();
	}
	// 修改post分页链接的格式
	function inner_page_link_format( $link, $number ){
		if( $number > 1 ){
			if( preg_match( '%<a href=".*\.html/\d*"%', $link ) ){
				$link = preg_replace( "%(\.html)/(\d*)%", $this->separator."$2$1", $link );
			}
		}
		return $link;
	}
	// 为新的链接格式增加重定向规则,移除原始分页链接的重定向规则,防止重复收录
	function pagelink_rewrite_rules( $rules ){
		foreach ($rules as $rule => $rewrite) {
			if ( $rule == '([0-9]+).html(/[0-9]+)?/?$' ) {
			unset($rules[$rule]);
			}
		}
		$new_rule['([0-9]+)('.$this->separator.'([0-9]+))?.html/?$'] = 'index.php?p=$matches[1]&page=$matches[3]';
		return $new_rule + $rules;
	}
	// 禁止WordPress将页面分页链接跳转到原来的格式
	function cancel_redirect_for_paged_posts( $redirect_url, $requested_url ){
		global $wp_query;
		if( is_single() && $wp_query->get( 'page' ) > 1 ){
			return false;
		}
		return true;
	}
}
new Rewrite_Inner_Page_Links_id();

如果你使用了上面的代码,并开启了伪静态,那么你的所有目录url后面加/都会被重定向到/1这个url下,并且重复发起重定向。最简单的办法就是把它删了,或者换一种代码方式。

复制
//修改分页函数输出链接结构
add_filter('wp_link_pages_link', 'inner_page_link_format', 10, 2);
function inner_page_link_format($link, $number)
    {
        
            if (preg_match('%<a href=".*\.html/\d*"%', $link)) {
                $link = preg_replace("%(\.html)/(\d*)%", '/page-' . "$2$1", $link);
            }
        
        return $link;
    }
//关闭wordpress重定向文章页地址
add_filter('redirect_canonical', 'cancel_redirect_for_paged_posts', 10, 2);
function cancel_redirect_for_paged_posts($redirect_url, $requested_url)
    {
        global $wp_query;
        if (is_single() && $wp_query->get('page') > 1) {
            return false;
        }
        return true;
    }
//添加自定义路由规则
function custom_rewrite_basic() {
    add_rewrite_rule('([0-9]+).html', 'index.php?p=$matches[1]&page=$matches[2]', 'top');
    add_rewrite_rule('([0-9]+)/page-([0-9]{1,}).html', 'index.php?p=$matches[1]&page=$matches[2]', 'top');
}
add_action('init', 'custom_rewrite_basic');

将上述代码添加到functions.php文件中,并在WP后台设置——固定链接——保存即可生效,此使你的文章分页地址将变成/文章ID/page-页码.html,到此教程结束。

我的解决办法是,直接删除了这段代码,感觉没什么用。并使用nginx规则将历史URL301重定向到新地址,规则如下

复制
rewrite ^/([0-9]+)/page-([0-9]+).html$ /$1.html/$2 permanent;

将以上代码添加到wordpress伪静态规则后面即可,这样原链接访问会自动跳转到新链接,保证用户不流失。

感觉很棒!可以赞赏支持我哟~

0 打赏

评论 (0)

登录后评论
QQ咨询 邮件咨询 狗哥推荐