如何通过Rewrite rules解决WordPress数据库中短链接引起的404错误问题?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1130个文字,预计阅读时间需要5分钟。
相关专题:
WordPress 短链接 404 是因为 .htaccess 重写规则没生效或被覆盖
不是插件坏了,也不是数据库丢了数据,而是 apache/nginx 没把 /p/123 这类短链接正确转发给 wordpress 的 index.php。常见现象是:后台能正常编辑文章,但点击短链接直接跳 404 页面,且 wp-admin/options-permalink.php 里点“保存更改”也没用。
原因通常是:.htaccess 文件权限不对、服务器未启用 mod_rewrite、或者 Nginx 根本不读 .htaccess(它压根不支持)。如果你用的是宝塔、cPanel 或阿里云轻量应用服务器,大概率是后者。
- Apache 用户检查
AllowOverride All是否在虚拟主机配置里开启(不是只在httpd.conf全局开,得在对应<directory></directory>块里) - Nginx 用户必须手动补全重写规则,
.htaccess文件完全无效 - Windows 主机(IIS)要用
web.config,不是.htaccess
Apache 下确认 .htaccess 规则是否被 WordPress 正确生成
WordPress 的短链接依赖 rewrite_rules 数据库选项和 .htaccess 文件双配合。如果 wp_options 表里的 rewrite_rules 是空的或过期的,flush_rewrite_rules() 就不会输出有效规则。
执行前先备份 .htaccess,再进 WP-CLI 或主题函数里临时加一行:
flush_rewrite_rules();
然后立刻检查根目录下的 .htaccess 文件内容是否包含类似这样的段落:
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule>
- 如果没有
<IfModule mod_rewrite.c>包裹,说明mod_rewrite模块没加载,联系主机商启用 - 如果
RewriteBase写成了/subdir/但实际在根目录,会导致所有重写失败 - 某些安全插件(如 Wordfence)会自动锁定
.htaccess,改完也写不进去,需先暂停插件
Nginx 用户必须手动配置 location 块处理短链接
Nginx 不解析 .htaccess,WordPress 的 flush_rewrite_rules() 对它完全没用。短链接如 /p/123 要能访问,必须让 Nginx 把所有非静态资源请求都转给 index.php。
在站点配置文件的 server 块里,确保有这段(不是放在 location / 里,而是独立的 location):
location / { try_files $uri $uri/ /index.php?$args; }
- 别漏掉
$args,否则?p=123这种参数式短链会丢参 - 如果用了缓存(如 fastcgi_cache),要排除
/p/开头的路径,否则缓存了 404 就很难清 - 某些一键安装包(如 LNMP.org)默认配置里只有
location ~ \.php$,不处理短路径,必须补上上面的location /
数据库里 wp_options 的 rewrite_rules 字段异常怎么办
这个字段存的是序列化数组,记录了所有 URL 到 query vars 的映射。如果它损坏(比如被插件误删、手动清空、或 PHP 反序列化失败),短链接路由就彻底失效,即使 .htaccess 或 Nginx 配置都对,也会 404。
不要直接在 phpMyAdmin 里手填,容易格式错。稳妥做法是:
- 停用所有重写相关插件(如 Redirection、Permalink Manager)
- 在 WP-CLI 执行:
wp rewrite structure '/%postname%/'(先切回普通结构) - 再执行:
wp rewrite structure '/p/%post_id%/'(切回短链结构) - 最后:
wp rewrite flush—— 这会重新生成并写入rewrite_rules
如果 wp rewrite 命令报错,说明 WordPress 核心文件可能被篡改,优先检查 wp-includes/rewrite.php 是否完整。
短链接机制本身不存具体跳转关系在数据库里,它靠规则匹配 + get_post() 动态查 ID。所以修复重点永远在重写引擎层,而不是去翻 wp_posts 表找哪条记录对应 /p/123。
本文共计1130个文字,预计阅读时间需要5分钟。
相关专题:
WordPress 短链接 404 是因为 .htaccess 重写规则没生效或被覆盖
不是插件坏了,也不是数据库丢了数据,而是 apache/nginx 没把 /p/123 这类短链接正确转发给 wordpress 的 index.php。常见现象是:后台能正常编辑文章,但点击短链接直接跳 404 页面,且 wp-admin/options-permalink.php 里点“保存更改”也没用。
原因通常是:.htaccess 文件权限不对、服务器未启用 mod_rewrite、或者 Nginx 根本不读 .htaccess(它压根不支持)。如果你用的是宝塔、cPanel 或阿里云轻量应用服务器,大概率是后者。
- Apache 用户检查
AllowOverride All是否在虚拟主机配置里开启(不是只在httpd.conf全局开,得在对应<directory></directory>块里) - Nginx 用户必须手动补全重写规则,
.htaccess文件完全无效 - Windows 主机(IIS)要用
web.config,不是.htaccess
Apache 下确认 .htaccess 规则是否被 WordPress 正确生成
WordPress 的短链接依赖 rewrite_rules 数据库选项和 .htaccess 文件双配合。如果 wp_options 表里的 rewrite_rules 是空的或过期的,flush_rewrite_rules() 就不会输出有效规则。
执行前先备份 .htaccess,再进 WP-CLI 或主题函数里临时加一行:
flush_rewrite_rules();
然后立刻检查根目录下的 .htaccess 文件内容是否包含类似这样的段落:
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule>
- 如果没有
<IfModule mod_rewrite.c>包裹,说明mod_rewrite模块没加载,联系主机商启用 - 如果
RewriteBase写成了/subdir/但实际在根目录,会导致所有重写失败 - 某些安全插件(如 Wordfence)会自动锁定
.htaccess,改完也写不进去,需先暂停插件
Nginx 用户必须手动配置 location 块处理短链接
Nginx 不解析 .htaccess,WordPress 的 flush_rewrite_rules() 对它完全没用。短链接如 /p/123 要能访问,必须让 Nginx 把所有非静态资源请求都转给 index.php。
在站点配置文件的 server 块里,确保有这段(不是放在 location / 里,而是独立的 location):
location / { try_files $uri $uri/ /index.php?$args; }
- 别漏掉
$args,否则?p=123这种参数式短链会丢参 - 如果用了缓存(如 fastcgi_cache),要排除
/p/开头的路径,否则缓存了 404 就很难清 - 某些一键安装包(如 LNMP.org)默认配置里只有
location ~ \.php$,不处理短路径,必须补上上面的location /
数据库里 wp_options 的 rewrite_rules 字段异常怎么办
这个字段存的是序列化数组,记录了所有 URL 到 query vars 的映射。如果它损坏(比如被插件误删、手动清空、或 PHP 反序列化失败),短链接路由就彻底失效,即使 .htaccess 或 Nginx 配置都对,也会 404。
不要直接在 phpMyAdmin 里手填,容易格式错。稳妥做法是:
- 停用所有重写相关插件(如 Redirection、Permalink Manager)
- 在 WP-CLI 执行:
wp rewrite structure '/%postname%/'(先切回普通结构) - 再执行:
wp rewrite structure '/p/%post_id%/'(切回短链结构) - 最后:
wp rewrite flush—— 这会重新生成并写入rewrite_rules
如果 wp rewrite 命令报错,说明 WordPress 核心文件可能被篡改,优先检查 wp-includes/rewrite.php 是否完整。
短链接机制本身不存具体跳转关系在数据库里,它靠规则匹配 + get_post() 动态查 ID。所以修复重点永远在重写引擎层,而不是去翻 wp_posts 表找哪条记录对应 /p/123。

