网站建设

修改WordPress分类目录和页面链接以斜杠/结尾,附nginx对应的301跳转设置方法

Jager · 9月16日 · 2014年 · 1425次已读

当 WordPress 的文章固定连接设置为 html 结尾后,WordPress 的分类目录和页面链接将变成以名称结尾的形式,比如 https://zhang.ge/liuyan,而不是以斜杠 / 结尾。

修改WordPress分类目录和页面链接以斜杠/结尾,附nginx对应的301跳转设置方法

一直以来也没纠结过这个问题,最近换成百度云加速之后,发现这种形式链接无法被缓存,而免费版的强制缓存项目只有 5 个!找客服问了下,告知要以斜杠结尾,才会识别为目录并开启缓存加速。修改WordPress分类目录和页面链接以斜杠/结尾,附nginx对应的301跳转设置方法

搜了下 WordPress 给末尾加上斜杠的方法:

①、插件法:安装 Permalink Trailing Slash Fixer 插件即可。

②、代码法:在老朋友爱兵博客找到了可用代码,如下:

/* 给分类目录和单页链接末尾加上斜杠 */
$permalink_structure = get_option('permalink_structure');
if (!$permalink_structure || '/' === substr($permalink_structure, -1))
    return;
add_filter('user_trailingslashit', 'ppm_fixe_trailingslash', 10, 2);
function ppm_fixe_trailingslash($url, $type)
{
   if ('single' === $type)
     return $url;
     return trailingslashit($url);
}

将以上代码加入到主题 function 后,所有分类目录和单页面链接末尾都已成功添加了斜杠。这才是目录的形式嘛!

为了做好 SEO,经验告诉我,有必要将以前末尾不带斜杠的链接都做好 301,跳转到带斜杠的新链接,以免搜索引擎重复收录相同内容,影响权重啥的。

参考已有的 nginx 跳转规则,试了半天都没搞定,最后发现我一直在修改一个不相关的配置文件!我勒个去!

下面就贴上以上跳转相应的 nginx 设置方法:

编辑 nginx 配置文件,在如下注释位置新增 301 规则(8-9 行)即可。

location / {
        #WordPress 默认规则,nginx 专用
        try_files $uri $uri/ /index.php?$args;
        if ($http_user_agent ~ "^$"){
                set $rule_0 1$rule_0;
                }
        if ($rule_0 = "1"){
                return 403;
                break;
                }
        #以下 2 条为新增的 301 跳转规则
        rewrite ^/([a-z-A-Z]+)$ https://zhang.ge/$1/ permanent;
        rewrite ^/([a-z-A-Z]+)/([a-z-A-Z]+)$ https://zhang.ge/$1/$2/ permanent;
#以下内容略...

修改WordPress分类目录和页面链接以斜杠/结尾,附nginx对应的301跳转设置方法

Ps:lnmp 一键安装包,这个配置文件路径一般是/usr/local/nginx/conf/vhost/域名.conf

保存后,执行 /usr/local/nginx/sbin/nginx -s reload 平滑重启 nginx 即可生效。

修改WordPress分类目录和页面链接以斜杠/结尾,附nginx对应的301跳转设置方法

效果预览:https://zhang.ge/liuyan

28 条回应
  1. 亿品元素 2014-11-1 · 14:54

    我现在也想把原来不带斜杠的目录,tag,page等都换成带斜杠的地址,请教一下apache的301规则改如何写??

    • avatar
      Jager 2014-11-1 · 15:17

      其实规则不是差不多么?对比一下应该也能依葫芦画瓢的试出来,我也没apache环境做测试,下面是凭经验写的,放到.htaccess的最前面试试。

      RewriteRule ^/([a-z-A-Z]+)$ https://zhang.ge/$1/ [R=301,L]
      RewriteRule ^/([a-z-A-Z]+)/([a-z-A-Z]+)$ https://zhang.ge/$1/$2/ [R=301,L]
      
      • 亿品元素 2014-11-1 · 22:58

        已经测试好像没用,不过我在网上找了一段
        RewriteEngine On
        RewriteBase /
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_URI} !(.*)/$
        RewriteRule ^(.*)$ http://www.sample.cn/$1/ [L,R=301]
        可以用,不过问题这段又会自动为html加斜杠?怎么样将二者结合一下??

  2. tofree 2014-11-17 · 22:21

    页面为什么不能自动加斜杠?只有分类和TAG可以。还有,为什么我的301跳转没反应,同样NGINX端

    • avatar
      Jager 2014-11-18 · 8:57

      留言头像无链接,一律不回答。

  3. 小武 2015-2-6 · 13:32

    今天想到目录的问题. . 百度一搜搜索. .来到了你的博客. .其实你的代码已经实现了 301 .. 没必要在nginx或apache服务器上再次写301规则了

    • avatar
      Jager 2015-2-6 · 14:07

      那就不知道了,反正不加就2种都可以访问。我看了下php代码貌似没有跳转的吧

      • 小武 2015-2-6 · 14:21

        我只在functions.php 中增加了你文中的代码, 访问结尾无斜杠的url自动301到带斜杠的url了. apache中没写相关的规则

  4. spider 2015-2-22 · 22:21

    值得借鉴,有点小瑕疵,如果目录名存在数字的话不能跳转,建议在表达式中加上0-9

  5. 聚宝盒 2015-5-22 · 21:40

    用了,目录可以会加上了斜杠,NGINX没有写301规则也能自动跳转,只是TAG也加了斜杠。不这么想~

    • avatar
      Jager 2015-5-23 · 12:27

      确实 tag有这个问题,回头改善下。

  6. 软件海 2015-6-24 · 14:21

    我的网站301定向正确,百度目前只收录不带WWW的,唉

  7. 暴露智商 2015-9-4 · 0:40

    我用的Yoast SEO这个插件
    强制所有分类页及标签页URL以“/”结尾

    但是貌似...只有谷歌浏览器会自动301到“/”,360浏览器不行,加上你的规则之后成功了!谢谢!

  8. 世界之最 2015-9-20 · 14:00

    设置了301跳转,但是不带斜杠的还是可以访问,如下,不知道什么原因,http://lishi.dugoogle.com/knowledge-3122

    • avatar
      Jager 2015-9-20 · 14:01

      因为knowledge-3122里面有一个横杠,不匹配a-z

      • 世界之最 2015-9-21 · 8:18

        谢谢,能不能请教下,我这种模式要怎么设置了

        • avatar
          Jager 2015-9-21 · 13:29

          ^/([a-z-A-Z-0-9]+)$

          ^/([a-z].*)$

          • 世界之最 2015-9-25 · 16:23

            rewrite ^/([a-z].*)$ http://lishi.dugoogle.com/$1/ permanent;
            rewrite ^/([a-z].*)/([a-z].*)$ http://lishi.dugoogle.com/$1/$2/ permanent;

            这样写了,还是不行,难道放错地方了,我是放在location / {里的啊

            • 世界之最 2015-9-25 · 16:49

              把这行代码加到server {)中,终于可以了,不知道为什么,另外再请教下,
              这段什么意思,需要加吗
              try_files $uri $uri/ /index.php?$args;
              if ($http_user_agent ~ "^$"){
              set $rule_0 1$rule_0;
              }
              if ($rule_0 = "1"){
              return 403;
              break;
              }

              • avatar
                Jager 2015-9-25 · 17:21

                你这代码和这个跳转没啥关系。。。
                这个try-files是nginx下兼容WordPress固定链接伪静态的
                下面则是禁止UA为空的请求,避免采集和攻击

  9. 杨修旭SEO 2016-3-3 · 23:04

    已经闻到满满的解决问题的味道,谢博主 :mrgreen:

  10. 杨修旭SEO 2016-3-3 · 23:10

    我遇到的问题只是不能把不带斜杠的分类目录跳转到带斜杠的分类目录URL中去,我也想请教一下,这种跳转可以用.htaccess文件实现吗?

  11. 笨驴励志 2016-4-9 · 16:46

    wordpress升级到php5.5的时候,网站文章链接自动添加斜杠/并且跳转到首页,张哥请教怎么回事呀?

    • avatar
      Jager 2016-4-10 · 14:28

      测试没问题啊

  12. 花色伊人 2016-8-18 · 22:25

    已解决

  13. 北极 2017-2-27 · 13:05

    请教一下,我发现这个会给tag也加上斜杠,但是如果tag是中文的,加上斜杠后会导致无法被WP Super Cache缓存,英文tag就没这个问题,不知道怎么让他不给tag加斜杠?

  14. 心动一下 2017-9-8 · 9:24

    大佬,网站目录去掉了category,但www.xxx.com/category/abc/ 还能访问,怎么做301.好像博主的目录也没有做301

    • avatar
      Jager 2017-9-11 · 13:47

      已修复,nginx加上如下规则即可:

      rewrite ^/category/(.*)$ /$1 permanent;
  15. 王烁然 2020-3-17 · 20:29

    请问你的主题是什么?我也想用这个主题