自动摘要
正在生成中……
修改 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. 配置解释
7. 重新加载 Nginx 配置
完成配置更新后,使用以下命令重新加载 Nginx 配置以使更改生效:
sudo nginx -s reload
8. 结论
通过上述步骤,可以确保在 WordPress 修改固定链接结构后,旧的 URL 能够正确重定向到新的 URL,同时避免对其他 WordPress 功能(如分类、标签、搜索、登录和管理页面)造成影响。获取一级分类 slug 的 PHP 脚本提供了必要的数据,以便正确配置 Nginx 规则,从而保证网站访问者的链接不会失效,提供平滑的用户体验。
更新补充
后台修改文章的固定链接,如:
/article/%postname%
后,如:
如果下面的分类或标签目录起点留空,分类和标签页的url会被变成/article/开头的链接,如:/article/category/分类名
,显然不是我们所期望的,为了保持原先一致,需要设置回原来的,也就是WP默认的分类与标签开头。