更换了一下永久链接的结构,之前的url结尾是/现在改成了.html,typecho不像WordPress那样会自动跳转,我们需要自己做一下链接的跳转,以防原来的链接404

找到主题目录下的404.php然后在顶部添加以下代码:

<?php
     $error_url = $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
     $lastChar = substr($error_url, -1);
     if(strcmp($lastChar,"/" ) == 0){//判断是否不等于空或者null
         $nameid = substr($error_url,0,strlen($error_url)-1);
         header('HTTP/1.2 301 Moved Permanently'); //添加301状态码
         header("location://".$nameid.".html");//跳转页面    
         echo $error_url." "; 
         echo $lastChar." "; 
         echo $nameid." ";
         
       }
     ?>

保存即可

image-20220205172728231

忽略URL参数跳转

我发现在原链接后有以?开头的参数时会无法跳转,原因是上面的代码读到来了URL参数,我们可以处理一下将参数删除再处理。
我们需要判断是否存在?后再对url进行处理,这里使用strpos函数来判断问号的位置,如果存在问号,那么返回的值一定是大于-1的,然后再根据问号的位置使用substr函数截取问号之前的URL字符串。

if(strpos($error_url,"?")>-1){ // 判断是否存在?
        $error_url = substr($error_url,0,strpos($error_url,"?"));        
    }

修改后的代码为:

<?php
    $error_url = $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
    if(strpos($error_url,"?")>-1){ // 判断是否存在?
        $error_url = substr($error_url,0,strpos($error_url,"?"));        
    }
    $lastChar = substr($error_url, -1);
    
    if(strcmp($lastChar,"/" ) == 0){//判断是否不等于空或者null
        $nameid = substr($error_url,0,strlen($error_url)-1);
        header('HTTP/1.2 301 Moved Permanently'); //添加301状态码
        header("location://".$nameid.".html");//跳转页面    
// 下面是测试输出
        echo $error_url." "; 
        echo $lastChar." "; 
        echo $nameid." ";
        
      }
    ?>
如果觉得我的文章对你有用,请随意赞赏