一个月前发现本站访问目录的第一页会自动重定向到/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)