WordPress 默认 .htaccess 文件:内容是什么,如何恢复
WordPress 为固定链接写入的确切 .htaccess 代码块、WordPress 何时会自动重新生成它,以及当文章全部返回 404 但首页仍能打开时如何手动恢复它。
WordPress 默认的 .htaccess 文件,是这款软件写入你网站根目录下 .htaccess 的一段简短 RewriteEngine 代码块,目的是让像 /2026/10/文章名/ 这样的固定链接能被正确解析,而不是返回 404。它看起来是这样的:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
这是从 WordPress 官方关于 Apache HTTP Server 的指南以及 HelpHub 上关于漂亮固定链接的页面所记载的重写逻辑中,原样转录的确切代码块。如果你的 RewriteBase 不是 /——比如因为 WordPress 安装在某个子文件夹中——它会改为匹配那个路径,这同样是正常情况,也是由 WordPress 自己生成的。
要点速览
- WordPress 只在 Apache 和 LiteSpeed 上自动生成这段代码块,条件是文件可写,并且你保存了设置 > 固定链接。
- 如果文件缺失或损坏,除了首页之外的所有固定链接都会返回 404,因为没有重写规则时只能找到首页。
- 你或插件添加的任何内容都必须放在
# BEGIN WordPress上方,绝不能放在标记内部——WordPress 每次保存固定链接时都会覆盖两个标记之间的全部内容。
需要用你真实的路径再加上一些额外规则重新构建这个文件?WordPress .htaccess 生成器能直接在浏览器中拼出一份正确的文件。
每一行在做什么
RewriteEngine On 为这个目录启用 Apache 的 mod_rewrite 模块;没有这一行,后面的内容全都不起作用。
RewriteBase / 告诉 Apache,重写后的路径是相对于网站根目录的。WordPress 会根据网站实际所在的位置来设置这个值——安装在子文件夹中时得到的是 RewriteBase /blog/,而不是 /。
RewriteRule ^index\.php$ - [L] 是一条不产生实际效果的保护规则:如果请求本身就是 index.php,重写就会停止,请求原样通过。
两行 RewriteCond 才是真正的逻辑所在。%{REQUEST_FILENAME} !-f 和 !-d 在问:“这个请求是不是既不对应真实文件,也不对应真实目录?“两者都为真才会触发最后那条规则——这样一来,真实的图片、CSS 文件或上传的 PDF 会被直接提供,永远不会碰到 WordPress 的路由。
RewriteRule . /index.php [L] 才是让固定链接真正工作的那条规则:通过前两个条件的任何内容——也就是说不是真实文件或文件夹——都会被发送到 index.php,然后由 WordPress 自己的路由机制(WP_Query、重写标签)来决定这个 URL 实际对应哪篇文章、哪个页面或哪个归档。
WordPress 什么时候会重新生成这个文件,什么时候不能
每次你打开设置 > 固定链接并点击保存更改时,即使屏幕上什么都没变,WordPress 都会尝试自己写入 .htaccess。这个保存操作会触发 flush_rewrite_rules(),它会试图以写入模式打开 .htaccess,并把当前代码块插入标记之间。
在以下情况下,这个尝试会静默失败,使文件处于缺失或过时的状态:
- 文件或其上级文件夹对运行 PHP 的用户不可写。 在很多共享主机上,PHP 运行时所用的系统用户,与通过 FTP 上传文件的用户并不相同,所以在 FTP 客户端里看起来正常的权限,仍然可能阻止 WordPress 写入。
- 你使用的是 nginx。
.htaccess只是 Apache 和 LiteSpeed 专属的机制(Apache 自己关于AllowOverride的文档就解释了原因:nginx 没有按目录读取、并在每次请求时重新读取的配置文件)。nginx 上对应的做法,是在 server 块内写一条try_files指令,而这只有拥有服务器访问权限的人才能编辑;WordPress 永远无法替你写入这条指令。 - 主 Apache 配置中,你网站所在目录的
AllowOverride被设为None。 这正是决定.htaccess到底能不能覆盖任何设置的开关;Apache 的文档说得很明确:在AllowOverride None下,“.htaccess 文件会被完全忽略”——WordPress 可以写出一份完美的文件,但在这项设置被改到服务器级别之前,它不会产生任何效果。 - 文件被删除了,或者从来就不存在,而保存过程中又没有触发重新生成——最常见的原因是固定链接结构本来就没变,所以 WordPress 没有发现任何需要重写的改动。
如何手动恢复它
如果文章和页面都返回 404,而首页仍然正常工作,这正是 .htaccess 缺失或损坏的典型特征。按两步解决。
1. 先试试一键修复。 在 WordPress 后台进入设置 > 固定链接,不改动任何内容,直接点击保存更改。如果文件可写,光是这个操作就能重新生成它,问题就解决了。
2. 如果这样不能解决问题,就手动创建文件。 通过 FTP/SFTP 或主机商的文件管理器连接,进入安装 WordPress 的文件夹(包含 wp-config.php 的那个文件夹),检查 .htaccess 是否存在——这是一个隐藏文件,部分文件管理器默认会隐藏它;记得打开”显示隐藏文件”。
- 如果文件不存在,就创建一个名字恰好是
.htaccess的新文件(不是.txt,点号前面什么都不加)。 - 粘贴上文给出的默认代码块,如果 WordPress 安装在子文件夹中,记得相应调整
RewriteBase。 - 保存后重新加载一篇文章的固定链接,确认它能正常工作。
如果这之后仍然返回 404,原因就从”.htaccess 缺失”变成了”.htaccess 被忽略了”——去问主机商 AllowOverride 的设置,因为一份正确的文件放在被 Apache 指示忽略的目录里,表现会和根本没有这个文件完全一样。
你自己的规则与 WordPress 代码块的关系
插件或手动编辑可能会添加自己的规则——重定向、防盗链、缓存响应头等。这是一个与 WordPress 生成的代码块完全独立、分开的代码块,两者永远不应该重叠:
# 你或某个插件添加的规则 — 放在 WordPress 标记的上方
<FilesMatch "\.(jpg|jpeg|png|gif)$">
# 示例:防盗链、缓存规则等
</FilesMatch>
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
放在 # BEGIN WordPress 和 # END WordPress 之间的任何内容,都会在下一次有人保存固定链接设置页面时被静默删除,因为 WordPress 把这整段都当成自己的地盘,会原样整段重写。这正是”我自己加的规则怎么不见了”这类抱怨最常见的原因——规则从来不是被故意删掉的,只是恰好放在了 WordPress 认为归它所有的代码块里。关于重定向本身,具体可以参考正确设置的 WordPress .htaccess 重定向规则,了解它们应该放在哪里以及如何避免循环。
这同样也是编辑文件后立刻出现突发性 500 Internal Server Error 最常见的原因:从论坛帖子里复制来的、为另一个 Apache 版本写的规则(2.2 版的 Order/Deny 语法和 2.4 版的 Require 语法混用)会破坏整个文件的解析,包括下面的 WordPress 代码块,导致整个网站全部宕掉——而不仅仅是你改动的那一部分。
默认代码块之外
默认代码块只负责固定链接的路由。如果你还想加强对敏感文件的访问限制,或者添加那几条真正能缩小攻击面的 .htaccess 规则——比如阻止在 /uploads 中执行 PHP,拒绝对 wp-config.php 的直接请求——可以参考真正有用的 WordPress .htaccess 安全规则。如果固定链接因为别的原因返回 404——固定链接结构配置错误、缓存层提供了旧规则、子目录中的多站点冲突——无法正常工作的 WordPress 固定链接则梳理了其他几种原因。
常见问题
WordPress 默认 .htaccess 文件是什么?
它是 WordPress 写在 # BEGIN WordPress 和 # END WordPress 之间的 RewriteEngine 代码块,目的是让固定链接解析到 index.php,而不是返回 404。
WordPress 默认 .htaccess 的确切代码是什么?
RewriteEngine On、RewriteBase /、一条针对 index.php 的放行规则、两条检查请求是否为真实文件或目录的条件,以及最后把其余请求全部发送到 index.php 的规则。完整代码块列在本指南开头。
为什么除了首页,我的所有文章都返回 404?
首页在没有任何重写规则的情况下也能被找到;而其他所有固定链接都需要这些规则。Apache 上 .htaccess 文件缺失或损坏,恰好就会产生这种模式。
WordPress 会自动重新生成 .htaccess 吗?
只有在文件可写时才会——重新保存设置 > 固定链接会触发这个过程。如果文件不可写,或者在不会自动生成它的主机上缺失,又或者 AllowOverride 被关闭了,WordPress 就无法替你修复,你必须手动创建或修正这个文件。
为什么 nginx 没有 WordPress 的 .htaccess 文件?
.htaccess 只能在 Apache 和 LiteSpeed 上生效。nginx 没有按目录配置的文件,会完全忽略 .htaccess;相同的路由要写成 nginx server 块中的一条 try_files 规则。
保存固定链接之后,我的 .htaccess 为什么坏了?
某条自定义规则被放在了 # BEGIN WordPress / # END WordPress 标记内部,而不是上方,于是在下一次保存固定链接时,WordPress 把那整段内容都覆盖掉了。
用免费的 WordPress .htaccess 生成器构建一份干净、正确的 .htaccess——默认固定链接代码块,加上你真正需要的任何安全或重定向规则。
FAQ
常见问题
WordPress 默认 .htaccess 文件是什么?
它是 WordPress 写入网站根目录下 .htaccess 文件中的一段简短的 RewriteEngine 代码块,用来让固定链接正常工作。它位于 # BEGIN WordPress 和 # END WordPress 两条注释之间,会把所有不对应真实文件或文件夹的请求发送到 index.php,由 WordPress 在那里决定显示什么内容。
WordPress 默认 .htaccess 的确切代码是什么?
RewriteEngine On、RewriteBase /、一条让已存在的文件和目录原样通过的规则,以及最后一条在保留查询字符串的同时把其余所有请求都发送到 index.php 的 RewriteRule。完整代码块见下文,与 WordPress 自身在设置 > 固定链接中生成的代码块完全一致。
为什么除了首页,我的所有文章都返回 404?
这是 Apache 上 .htaccess 文件缺失或损坏的典型症状。首页能加载是因为服务器可以直接找到 index.php,但其他任何固定链接都需要重写规则才能到达那里;没有这些规则,Apache 只会去寻找一个不存在的文件,然后返回 404。
WordPress 会自动重新生成 .htaccess 吗?
只有在该文件可写、并且你重新保存了设置 > 固定链接时才会。WordPress 会检查自己是否能写入该文件,如果可以,就会重写标记之间的代码块。如果文件缺失、只能读取,或者所属用户与运行 PHP 的用户不同,WordPress 会静默失败,你必须手动创建该文件。
为什么 nginx 没有 WordPress 的 .htaccess 文件?
因为 .htaccess 只是 Apache(以及 LiteSpeed)的功能;nginx 没有对应机制,会完全忽略这个文件。在 nginx 上,相同的路由逻辑要写成 server 块内的 try_files 指令,只有你的主机商或系统管理员才能编辑它。
保存固定链接之后,我的 .htaccess 为什么坏了?
几乎总是因为某个插件或之前的手动编辑把自己的规则放在了 WordPress 标记内部,而不是上方。WordPress 每次保存固定链接时都会覆盖 # BEGIN WordPress 和 # END WordPress 之间的全部内容,所以放在里面的任何规则都会在毫无警告的情况下被删除。