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