×

全面指南:通过 Nginx 重定向处理 WordPress 修改固定链接结构后的404【特别针对原先使用%category%】的文章链接

Falcon 2024-09-13 views:
自动摘要

正在生成中……

修改 WordPress 文章固定链接及 Nginx 重定向配置,特别针对原先使用 %category% 标记的文章固定链接

1. 背景

在 WordPress 中修改文章固定链接结构可能导致旧的 URL 结构无法正确访问。为了确保访问者能够通过旧链接访问新链接,同时避免对其他页面造成影响,我们需要在 Nginx 中设置重定向规则。本文档总结了如何在 WordPress 安装在子目录下时,进行 URL 重定向的配置。

2. 修改 WordPress 文章固定链接

在 WordPress 的后台管理页面 /wp-admin/options-permalink.php 中,修改了文章的固定链接结构。新的结构被设置为 /article/%postname%。旧的 URL 结构为 /%category%/%postname%,就是 /category-slug/postname,其中 category-slug 这里有个大坑,%category%tag 可能是一级分类或二级分类。具体链接可能是: /category-slug/postname/category-slug/subcategory/postname

3. URL 重定向需求

修改固定链接后,旧的 URL 需要被重定向到新的 URL。具体需求包括:

  • 处理一级分类的文章链接,例如 /category-slug/postname
  • 处理二级分类的文章链接,例如 /category-slug/subcategory/postname
  • 处理包含 URL 编码的分类 slug 的链接,例如 / %e7%9b%b4%e6%93%8a/postname

4. 获取一级分类 Slug

为了处理一级分类的重定向,需要首先获取所有一级分类的 slug。可以使用以下 PHP 脚本来提取这些 slug。

PHP 脚本:get-category-slugs.php

<?php
// WordPress 环境文件路径
require_once('wp-load.php'); // 确保路径正确

// 获取所有一级分类
$args = array(
    'hide_empty' => false, // 显示所有分类,包括空的
    'parent'     => 0,     // 仅获取一级分类
);

$categories = get_categories($args);

if (!empty($categories)) {
    echo "一级分类 slugs:\n";
    foreach ($categories as $category) {
       // echo $category->slug . "\n";
		echo $category->slug . PHP_EOL;
    }
} else {
    echo "没有找到一级分类。";
}
?>

运行脚本

  • 通过浏览器访问: 上传 get-category-slugs.php 文件到你的 WordPress 根目录,然后通过浏览器访问 http://example.com/get-category-slugs.php。你将看到输出的一级分类 slugs。

  • 通过命令行访问: 如果你可以通过命令行访问你的服务器,可以使用 php 命令运行脚本:

    php get-category-slugs.php
    

5. Nginx 配置

为了在 Nginx 中处理这些重定向需求,需要编写适当的 rewrite 规则。我的WordPress 安装在子目录 /entertainment/ 下, 如果你安装在根目录,则改为 / , 以下是配置示例:

server {
    listen 80;
    server_name example.com;


   
    location /entertainment/ {
        # 根据获取的一级分类 slug 更新以下规则
        rewrite ^/entertainment/(asia|uncategorized|album|focus|blogger|interview|movies|film-music|channel|artchive|europe|sports)/([^/]+)$ /entertainment/article/$2 permanent;

        # 匹配二级分类和文章名的链接
        rewrite ^/entertainment/(asia|uncategorized|album|focus|blogger|interview|movies|film-music|channel|artchive|europe|sports)/([^/]+)/([^/]+)$ /entertainment/article/$3 permanent;

        # 匹配包含 URL 编码的 slug 和文章名的链接
        rewrite ^/entertainment/%e7%9b%b4%e6%93%8a/([^/]+)$ /entertainment/article/$1 permanent;

        # 匹配包含 URL 编码的 slug 和二级分类的链接
        rewrite ^/entertainment/%e7%9b%b4%e6%93%8a/([^/]+)/([^/]+)$ /entertainment/article/$2 permanent;

        # 将所有未匹配的请求交给 WordPress 处理
        try_files $uri $uri/ /entertainment/index.php?$args;
    }
}

6. 配置解释

  • location /entertainment/ { ... }:

    • 指定了 WordPress 安装的子目录 /entertainment/,确保所有重定向规则都应用于该目录。
  • 重定向规则:

    • 一级分类和文章名:
      rewrite ^/entertainment/(asia|uncategorized|album|focus|blogger|interview|movies|film-music|channel|artchive|europe|sports)/([^/]+)$ /entertainment/article/$2 permanent;
      
    • 二级分类和文章名:
      rewrite ^/entertainment/(asia|uncategorized|album|focus|blogger|interview|movies|film-music|channel|artchive|europe|sports)/([^/]+)/([^/]+)$ /entertainment/article/$3 permanent;
      
    • 包含 URL 编码的 slug 和文章名:
      rewrite ^/entertainment/%e7%9b%b4%e6%93%8a/([^/]+)$ /entertainment/article/$1 permanent;
      
    • 包含 URL 编码的 slug 和二级分类:
      rewrite ^/entertainment/%e7%9b%b4%e6%93%8a/([^/]+)/([^/]+)$ /entertainment/article/$2 permanent;
      
  • try_files $uri $uri/ /entertainment/index.php?$args;:

    • 确保所有未匹配的请求交给 WordPress 的 index.php 文件处理,保持 WordPress 的正常功能。

7. 重新加载 Nginx 配置

完成配置更新后,使用以下命令重新加载 Nginx 配置以使更改生效:

sudo nginx -s reload

8. 结论

通过上述步骤,可以确保在 WordPress 修改固定链接结构后,旧的 URL 能够正确重定向到新的 URL,同时避免对其他 WordPress 功能(如分类、标签、搜索、登录和管理页面)造成影响。获取一级分类 slug 的 PHP 脚本提供了必要的数据,以便正确配置 Nginx 规则,从而保证网站访问者的链接不会失效,提供平滑的用户体验。

更新补充

后台修改文章的固定链接,如: /article/%postname% 后,如: 如果下面的分类或标签目录起点留空,分类和标签页的url会被变成/article/开头的链接,如:/article/category/分类名,显然不是我们所期望的,为了保持原先一致,需要设置回原来的,也就是WP默认的分类与标签开头。

本文收录于