WordPress .htaccess 规则指南

.htaccess 文件是 Apache 网络服务器上最强大的配置文件之一。对于 WordPress 网站,它处理 URL 重写、安全限制、性能优化和访问控制。一个调整良好的 .htaccess 可以显著改进安全性和页面加载速度,无需任何插件。

在进行任何更改之前,始终备份您的 .htaccess。语法错误可能导致您的整个网站返回 500 内部服务器错误。保留工作文件的副本,以便快速恢复。

1. 标准 WordPress .htaccess(默认)

WordPress 会自动生成此基本 .htaccess。永远不要删除它——它是漂亮链接所必需的:

# 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 块外部,以防更新覆盖它们。

2. 强制 HTTPS(HTTP → HTTPS 重定向)

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>

3. 保护敏感文件

保护 wp-config.php

<Files wp-config.php>
  Order Allow,Deny
  Deny from all
</Files>

保护 .htaccess 本身

<Files .htaccess>
  Order Allow,Deny
  Deny from all
</Files>

阻止 XML-RPC

<Files xmlrpc.php>
  Order Allow,Deny
  Deny from all
</Files>

禁用目录浏览

Options -Indexes

4. 添加安全标头

<IfModule mod_headers.c>
  Header always set X-Frame-Options "SAMEORIGIN"
  Header always set X-Content-Type-Options "nosniff"
  Header always set X-XSS-Protection "1; mode=block"
  Header always set Referrer-Policy "strict-origin-when-cross-origin"
  Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()"
</IfModule>

5. 防盗链保护

防止其他网站直接嵌入您的图片(盗用带宽):

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https://(www\.)?yourdomain\.com/ [NC]
RewriteRule \.(jpg|jpeg|png|gif|webp|svg)$ - [F,NC]
</IfModule>

将 yourdomain.com 替换为您的实际域名。

6. 启用 GZIP 压缩

GZIP 通常将 HTML、CSS 和 JS 文件大小减少 60–80%,显著改进页面加载时间:

<IfModule mod_deflate.c>
  AddOutputFilterByType DEFLATE text/html text/plain text/xml
  AddOutputFilterByType DEFLATE text/css text/javascript
  AddOutputFilterByType DEFLATE application/javascript application/x-javascript
  AddOutputFilterByType DEFLATE application/json application/xml
  AddOutputFilterByType DEFLATE image/svg+xml
</IfModule>

7. 浏览器缓存(Cache-Control 标头)

告诉浏览器缓存静态资源多长时间,减少重复加载时间:

<IfModule mod_expires.c>
  ExpiresActive On
  ExpiresByType image/jpeg "access plus 1 year"
  ExpiresByType image/png "access plus 1 year"
  ExpiresByType image/webp "access plus 1 year"
  ExpiresByType image/gif "access plus 1 year"
  ExpiresByType image/svg+xml "access plus 1 year"
  ExpiresByType text/css "access plus 1 month"
  ExpiresByType application/javascript "access plus 1 month"
  ExpiresByType application/x-javascript "access plus 1 month"
  ExpiresByType text/html "access plus 1 day"
</IfModule>

8. 阻止常见恶意机器人

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} (AhrefsBot|SemrushBot|DotBot|MJ12bot) [NC]
RewriteRule .* - [F,L]
</IfModule>

注意:阻止 Ahrefs 和 Semrush 等 SEO 爬虫会防止它们在其索引数据库中包含您的网站,这可能会减少入站链接分析的数量。仅在服务器负载成为问题时才阻止它们。

8.5. 保护 wp-login.php 免受暴力破解

WordPress 登录页面是暴力攻击的常见目标。按 IP 地址限制它是最有效的服务器级保护:

# Allow only specific IPs to access wp-login.php
<Files wp-login.php>
  Order Deny,Allow
  Deny from all
  Allow from YOUR.IP.HERE
</Files>

将 YOUR.IP.HERE 替换为您的实际 IP 地址。如果您有动态 IP(每次连接时变化),请改用 Limit Login Attempts Reloaded 等插件,或使用 WPS Hide Login 更改登录 URL,从一开始就使其对机器人不可达。

8.6. 阻止恶意机器人和漏洞扫描程序

自动探测漏洞的机器人会消耗服务器资源并增加您的流量日志。通过 User-Agent 字符串阻止它们:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} (masscan|nikto|sqlmap|havij|netsparker|ZmEu) [NC]
RewriteRule .* - [F,L]
</IfModule>

要阻止正在积极攻击您网站的特定 IP 范围:

<RequireAll>
  Require all granted
  Require not ip 185.220.101.0/24
</RequireAll>

注意:阻止流行的 SEO 爬虫(Ahrefs、Semrush)会防止它们在其数据库中索引您的反向链接资料。仅阻止导致实际性能问题的机器人——首先检查您的访问日志。

8.7. 禁用上传目录中的 PHP 执行

一种常见的攻击方式是上传伪装成图片的 PHP 文件,然后通过浏览器执行它。通过禁用 WordPress 上传文件夹内的 PHP 执行来防止这种情况:

# Place this in a new .htaccess inside wp-content/uploads/
<FilesMatch "\.php$">
  Order Allow,Deny
  Deny from all
</FilesMatch>

创建一个包含此规则的单独 .htaccess 文件,并将其放在您的 wp-content/uploads/ 目录中。即使上传了 PHP 文件,它也无法执行——它将返回 403 禁止错误。

强烈推荐:此单一规则消除了整类 WordPress shell 上传攻击。实施需要不到 30 秒,不需要任何插件。

9. 自定义错误页面

ErrorDocument 404 /404.html
ErrorDocument 403 /403.html
ErrorDocument 500 /500.html

10. 如何测试您的 .htaccess 规则是否工作

添加任何新规则后,立即测试它,而不是等待出现问题。以下是如何验证每种常见规则类型的方法:

测试 HTTPS 重定向

在浏览器地址栏中的域名前输入 http://(不带"s")。URL 应该立即变为 https://。或者,运行 curl -I http://yourdomain.com——301 状态代码确认重定向正在工作。

测试目录浏览保护

导航到您网站上没有索引文件的文件夹,例如 https://yourdomain.com/wp-content/。使用 Options -Indexes 后,您应该看到 403 禁止错误,而不是文件列表。

测试安全标头

访问 securityheaders.com,输入您的域名,然后点击扫描。报告显示哪些标头存在并给出总体等级。根据本指南规则配置良好的 WordPress 网站应该获得 A 或 A+ 等级。

测试 GZIP 压缩

通过 GTmetrix 或 Google PageSpeed Insights 运行您的网站。如果 GZIP 处于活动状态,您不会在结果中看到"启用文本压缩"建议。

11. 常见 .htaccess 错误及其解决方法

保存后立即出现 500 错误

语法错误导致 Apache 拒绝整个文件。立即恢复您的备份,然后逐行审查新规则。常见原因:缺少关闭的 </IfModule>、间距不正确或不可识别的指令。

重定向循环(ERR_TOO_MANY_REDIRECTS)

当重写规则重定向到自身时会发生这种情况。对于 HTTPS 规则,始终包含 RewriteCond %{HTTPS} off,以便重定向仅对 HTTP 请求触发,而不是对已重定向的 HTTPS 请求。

WordPress 永久链接停止工作

如果自定义规则干扰 WordPress 路由,请转到 WordPress 管理员→设置→永久链接,然后点击保存。WordPress 将使用正确的重写规则重新生成 # BEGIN WordPress 块。

安全标头未出现

Apache 必须启用 mod_headers 以使 Header always set 指令工作。大多数托管服务提供商默认启用它。如果添加规则后标头仍未出现,请联系您的托管提供商以确认模块处于活动状态。

Apache 与 DirectAdmin 的 WordPress 托管

AsiaGB 托管在 Apache 上,完全支持 .htaccess。通过 DirectAdmin 管理您的网站——无需命令行。从 500 泰铢/年开始。

查看托管计划 →