禁止直接访问 wp-includes 目录是 WordPress 安全加固的关键步骤,但配置不当会导致网站前台样式丢失或功能异常。推荐通过服务器配置(Nginx 或 Apache)仅拦截该目录下的 PHP 文件执行,同时放行必要的静态资源(CSS/JS),并结合合理的文件权限设置,防止核心文件被直接调用或泄露。
先说结论:通过服务器配置禁止 wp-includes 目录下的 PHP 文件执行能有效降低漏洞利用风险,但切勿禁止所有文件访问,否则会导致前台 CSS/JS 加载失败。
- 先判断:确认网站使用的 Web 服务器类型(Nginx 或 Apache)及版本。
- 优先做:添加规则仅禁止该目录下的 PHP 文件执行,保留静态资源访问权限。
- 再验证:访问 PHP 文件确认返回 403,访问 JS/CSS 文件确认返回 200,且网站前台显示正常。
- 留后路:修改配置前务必备份原文件,以便配置错误时快速恢复。
核心原理与风险
wp-includes 目录存放了 WordPress 的核心函数库和脚本。默认情况下,如果服务器配置不当,攻击者可以直接访问该目录下的文件。若服务器开启了目录浏览(Directory Listing),攻击者可能查看文件列表。更严重的是,某些 PHP 文件若未被正确保护,可能被直接调用执行,导致信息泄露或代码执行漏洞。
然而,wp-includes 中也包含 WordPress 运行所必需的静态资源(如 jQuery 库、核心 CSS 等)。如果简单粗暴地禁止访问整个目录(deny all),会导致网站前台样式混乱、功能失效。因此,安全策略的核心是“禁 PHP,放静态”。
Nginx 配置方案
登录服务器,编辑 Nginx 配置文件(通常位于/etc/nginx/nginx.conf或/etc/nginx/conf.d/你的域名.conf)。在server块中添加以下规则。该规则仅拦截 wp-includes 目录下的 PHP 文件,不影响静态资源。
location ~ /wp-includes/.*\.php$ {
deny all;
access_log off;
log_not_found off;
}保存配置后,执行以下命令检查语法并重载:
nginx -t
nginx -s reload注意:不要使用location^*或直接在目录 location 中写deny all,这会阻断所有资源。
Apache 配置方案
如果使用 Apache,建议修改站点配置文件或在网站根目录的.htaccess文件中添加规则。以下配置兼容 Apache 2.4+ 版本,修复了旧版语法废弃问题,并修正了目标目录。
方法一:修改站点配置(推荐)
在虚拟主机配置中添加:
<Directory "/var/www/html/wp-includes">
<FilesMatch "\.php$">
Require all denied
</FilesMatch>
</Directory>方法二:使用 .htaccess(需开启 AllowOverride)
在网站根目录的.htaccess文件中添加:
<FilesMatch "^wp-includes/.*\.php$">
Require all denied
</FilesMatch>修改后无需重启 Apache,但需确保mod_rewrite和mod_authz_core模块已启用。
文件权限最佳实践
合理的文件权限能防止恶意脚本写入核心目录。建议通过 SSH 登录服务器,执行以下权限设置。
1. 核心目录权限
将 wp-includes、wp-admin 及根目录下的核心文件设置为只读,所有者为网站运行用户(如 www-data)。
find /var/www/html/wp-includes -type d -exec chmod 755 {} \;
find /var/www/html/wp-includes -type f -exec chmod 644 {} \;2. 上传目录权限
切勿将全站设置为不可写,否则媒体上传和自动更新会失败。wp-content/uploads 目录需要写入权限。
chown -R www-data:www-data /var/www/html/wp-content/uploads
chmod -R 755 /var/www/html/wp-content/uploads验证与排查步骤
配置完成后,必须通过以下步骤验证是否生效且未误伤正常业务。
1. 验证 PHP 拦截
在浏览器或使用 curl 访问 wp-includes 下的 PHP 文件(如 version.php):
curl -I https://你的域名/wp-includes/version.php预期结果应返回403 Forbidden或404 Not Found。
2. 验证静态资源
访问 wp-includes 下的 JS 或 CSS 文件:
curl -I https://你的域名/wp-includes/js/jquery/jquery.js预期结果应返回200 OK。如果返回 403,说明配置过于严格,需检查 Nginx location 正则或 Apache FilesMatch 规则。
3. 检查前台显示
打开网站前台,按 F12 查看控制台。确保没有大量 CSS 或 JS 文件加载失败(403/404 错误)。
常见坑与紧急恢复
1. 网站样式丢失
现象:前台显示混乱,控制台报错静态资源 403。
原因:配置了location /wp-includes/ { deny all; }。
解决:改为仅禁止 PHP 后缀文件的规则。
2. 配置错误导致全站无法访问
现象:Nginx 重启失败或 Apache 报错。
解决:立即恢复备份的配置文件。Nginx 可使用cp /etc/nginx/nginx.conf.bak /etc/nginx/nginx.conf还原,然后重载。
3. 自动更新失败
现象:WordPress 后台提示无法写入文件。 原因:核心文件权限被设置为不可写且所有者错误。 解决:确保文件所有者为 Web 服务器用户,升级时可临时开放权限,升级后恢复只读。
4. 缓存干扰
验证时若结果不符,请清除浏览器缓存或使用无痕模式测试,避免本地缓存误导判断。