欢迎光临好主题官网!致力于 WordPress 企业主题定制开发及 WP外贸模板下载。

WordPress网站如何屏蔽恶意来源域名?宝塔Nginx返回403实战教程

文章目录

在运营 WordPress 网站的过程中,我们通常会使用百度统计、Google Analytics 等工具分析网站流量,了解用户从哪里访问网站、访问了哪些页面,以及网站的整体流量变化。

但有时候,统计后台会出现一些陌生的来源域名。这些域名与网站没有任何业务关联,却持续产生访问记录,甚至短时间内反复出现,影响正常的流量分析。

面对这种情况,应该如何处理?

如果网站使用的是 WordPress + Nginx + PHP-FPM 环境,其实不一定需要安装安全插件。我们可以直接通过 Nginx 配置识别指定的 HTTP Referer 来源域名,并在服务器层返回 HTTP 403,拒绝对应请求。

本文将从问题背景、异常来源分析、HTTP Referer 原理、Nginx 拦截配置、多域名黑名单管理等方面,完整介绍 WordPress 网站如何实现来源域名屏蔽。

一、问题背景:WordPress网站出现异常来源访问

在日常网站运营中,流量统计工具是分析网站访问情况的重要手段。

正常情况下,网站访问来源通常包括:

  • 百度、Google、Bing 等搜索引擎。
  • 微信、QQ 等社交平台。
  • 其他网站的友情链接或内容引用。
  • 用户直接输入网址产生的直接访问。
  • 通过邮件、广告等渠道进入网站的访问。

但在实际运营过程中,有时会发现统计后台持续出现一些陌生来源域名。

例如:

https://spam-example.com
https://unknown-example.net
https://traffic-example.org

这些域名与网站没有任何业务关联,却不断出现在来源统计列表中。

进一步查看访问明细,还可能发现同一个来源访问了多个不同类型的页面,例如:

https://example.com/tutorial/wordpress-guide
https://example.com/tutorial/elementor-guide
https://example.com/product/123.html
https://example.com/category/news

这种情况值得进一步检查。

需要注意,陌生来源不一定意味着网站正在遭受攻击,也可能是自动化访问、爬虫行为或来源信息伪造。

如果某些来源持续产生异常请求,并且没有任何业务价值,可以考虑通过服务器规则进行针对性拦截。

本次采用的解决方案是:

通过 Nginx 识别 HTTP Referer 请求头中的指定域名,匹配成功后直接返回 403。

整个过程不需要修改 WordPress 核心文件,也不需要安装额外插件。

二、问题发现:如何判断是否需要屏蔽?

发现异常来源后,不建议立即封禁,而应该先结合统计数据和服务器日志进行判断。

1. 检查来源域名

进入百度统计或其他流量分析工具,查看来源网站列表。

重点关注:

  • 是否存在完全陌生的域名。
  • 同一个域名是否反复出现。
  • 是否与网站业务存在关联。
  • 是否存在明显异常的访问趋势。

如果某个来源持续出现,并且没有正常的业务关联,可以将其列入观察名单。

2. 检查入口页面

查看异常来源对应的入口页面。

如果同一个来源不断访问文章、产品、分类归档等不同类型的页面,就需要进一步结合访问频率和访问行为分析。

3. 检查访问频率

可以重点观察:

  • 是否在短时间内集中访问。
  • 是否反复请求相同页面。
  • 是否存在大量随机 URL。
  • 是否伴随异常 User-Agent。
  • 是否出现多个 IP 地址重复执行相同操作。

通过这些信息,可以初步判断是否存在自动化访问行为。

4. 结合 Nginx 日志验证

统计工具中的来源信息只能作为分析依据,不能完全代表真实请求情况。

如果需要进一步确认,可以查看 Nginx 访问日志,重点检查:

  • 请求时间。
  • 客户端 IP。
  • 请求 URL。
  • HTTP 状态码。
  • User-Agent。
  • HTTP Referer。

如果日志格式包含 $http_referer,就可以直接分析请求携带的来源域名。

三、技术原理:HTTP Referer是什么?

要实现来源域名拦截,首先需要理解 HTTP Referer。

1. HTTP Referer的作用

Referer 是 HTTP 请求头中的一个字段,用于表示当前请求的来源页面。

例如,用户在一个外部网站点击链接,访问 WordPress 网站时,浏览器可能发送如下请求:

GET /tutorial/wordpress-guide HTTP/2
Host: example.com
Referer: https://source-example.com/article.html

其中:

Referer: https://source-example.com/article.html

就表示当前请求携带的来源页面地址。

网站统计工具可以利用这类信息判断访问来源。

2. Referer可以被伪造吗?

可以。

HTTP Referer 并不是经过身份认证的信息,客户端可以自行设置这个请求头。

例如,使用 curl 就可以主动指定来源:

curl -I \
-e "https://spam-example.com/" \
https://example.com/

即使请求并不是从 spam-example.com 页面跳转过来的,也可以携带这个来源信息。

同样,客户端也可以不发送 Referer:

curl -I https://example.com/

因此,Referer 只能作为请求过滤条件,不能作为判断访问者真实身份的依据。

3. 为什么选择Nginx拦截?

WordPress 网站的请求处理流程可以简化为:

用户浏览器或自动化程序
          ↓
        Nginx
          ↓
       PHP-FPM
          ↓
    WordPress核心
          ↓
      主题和插件
          ↓
       数据库
          ↓
       返回页面

如果通过 WordPress 插件拦截,请求通常已经进入 PHP 处理流程。

而在 Nginx 层拦截,可以在请求进入 PHP-FPM 之前完成判断。

主要优势:

  1. 不需要启动 WordPress。
  2. 不需要加载主题和插件。
  3. 不需要执行 PHP 代码。
  4. 不增加数据库查询。
  5. 减少无效请求对 PHP-FPM 的资源消耗。
  6. 不受 WordPress 主题和插件更新影响。

对于使用 Nginx 的 WordPress 网站,这是一种简单直接的处理方式。

四、实战一:Nginx屏蔽指定来源域名

下面以宝塔面板 + Nginx + PHP-FPM + WordPress 为例进行操作。

第一步:进入Nginx网站配置

登录宝塔面板:

  1. 进入「网站」。
  2. 找到需要配置的网站。
  3. 点击「设置」。
  4. 进入「配置文件」。
  5. 找到当前网站对应的 server { } 配置区域。

找到类似以下配置:

server
{
    listen 80;
    listen 443 ssl;

    server_name example.com www.example.com;

    root /www/wwwroot/example.com;
    index index.php index.html;

    # 其他网站配置
}

第二步:添加Referer拦截规则

在 server_name 下面添加:

# 屏蔽指定来源域名,返回403
if ($http_referer ~* "^https?://([a-z0-9-]+\.)*spam-example\.com(:[0-9]+)?(/|$)") {
    return 403;
}

添加后的配置结构:

server
{
    listen 80;
    listen 443 ssl;

    server_name example.com www.example.com;

    # 屏蔽指定来源域名
    if ($http_referer ~* "^https?://([a-z0-9-]+\.)*spam-example\.com(:[0-9]+)?(/|$)") {
        return 403;
    }

    root /www/wwwroot/example.com;
    index index.php index.html;

    # 其他网站配置
}

这里使用的是 Nginx 的 if 指令。

当请求中的 Referer 匹配指定域名时,Nginx 会直接执行:

return 403;

拒绝当前请求。

第三步:理解正则表达式

核心正则表达式:

^https?://([a-z0-9-]+\.)*spam-example\.com(:[0-9]+)?(/|$)

各部分含义:

正则表达式 作用
^ 匹配字符串开头
https?:// 匹配 HTTP 或 HTTPS
([a-z0-9-]+\.)* 匹配零个或多个子域名
spam-example\.com 匹配指定域名
(:[0-9]+)? 匹配可选端口
`(/ $)`

这条规则可以匹配:

https://spam-example.com
https://www.spam-example.com
https://abc.spam-example.com
http://www.spam-example.com/
https://www.spam-example.com/article.html

但不会匹配:

https://spam-example.com.example.net
https://notspam-example.com
https://www.google.com

通过这种方式,可以避免简单字符串匹配导致的误拦截。

第四步:检查Nginx配置

保存后,先执行配置检查:

nginx -t

如果返回:

syntax is ok
test is successful

说明配置语法正确。

然后重新加载 Nginx:

nginx -s reload

也可以通过宝塔面板重载 Nginx。

注意:如果网站同时处理 HTTP 和 HTTPS 请求,建议确认两个入口都经过包含该规则的 server 配置。

五、实战二:多个来源域名如何统一屏蔽?

如果网站后续出现多个异常来源,例如:

spam-example.com
unknown-example.net
traffic-example.org
bad-example.com
crawler-example.net

不建议在网站主配置中不断添加多个 if 判断。

更推荐使用独立配置文件,通过 Nginx 的 include 指令统一管理黑名单。

这种方式尤其适合长期维护 WordPress 网站的开发者和服务器管理员。

第一步:创建黑名单配置目录

在服务器中创建一个独立目录:

mkdir -p /www/server/nginx/blocklist

这里的路径仅作为示例,实际使用时可以根据自己的服务器目录结构调整。

第二步:创建独立配置文件

创建:

/www/server/nginx/blocklist/referer-block.conf

写入:

# WordPress网站来源域名黑名单

if ($http_referer ~* "^https?://([a-z0-9-]+\.)*(spam-example\.com|unknown-example\.net|traffic-example\.org|bad-example\.com|crawler-example\.net)(:[0-9]+)?(/|$)") {
    return 403;
}

以后需要增加域名,只需要修改正则表达式中的域名列表。

例如增加:

new-example.org
another-example.com

修改为:

if ($http_referer ~* "^https?://([a-z0-9-]+\.)*(spam-example\.com|unknown-example\.net|traffic-example\.org|bad-example\.com|crawler-example\.net|new-example\.org|another-example\.com)(:[0-9]+)?(/|$)") {
    return 403;
}

第三步:在网站配置中引用

找到网站的 server { } 配置区域,在其中添加:

# 引用来源域名黑名单
include /www/server/nginx/blocklist/referer-block.conf;

例如:

server
{
    listen 80;
    listen 443 ssl;

    server_name example.com www.example.com;

    # 引用统一来源黑名单
    include /www/server/nginx/blocklist/referer-block.conf;

    root /www/wwwroot/example.com;
    index index.php index.html;

    # 其他网站配置
}

这样 Nginx 就会自动读取独立黑名单文件。

以后增加或删除来源域名,只需要编辑:

referer-block.conf

不需要反复修改 WordPress 网站主配置。

第四步:重新加载配置

nginx -t && nginx -s reload

检查通过后,Nginx 就会加载最新的黑名单规则。

这种方式的优势在于:

  • 黑名单独立管理。
  • 主配置更加简洁。
  • 后期维护更加方便。
  • 可以根据需要让多个网站引用同一份规则。

需要注意,如果多个网站共用一个黑名单文件,修改后会影响所有引用该文件的网站,应提前确认适用范围。

六、实战三:如何测试403拦截是否生效?

规则添加完成后,不能只看 Nginx 是否重载成功,还需要进行实际请求测试。

1. 测试异常来源

使用 curl 模拟一个携带指定 Referer 的请求:

curl -I \
-e "https://www.spam-example.com/" \
https://example.com/

预期返回:

HTTP/2 403

说明请求已经被 Nginx 拦截。

2. 测试正常来源

再模拟一个正常来源:

curl -I \
-e "https://www.google.com/" \
https://example.com/

如果网站首页正常,预期返回:

HTTP/2 200

说明正常来源没有受到影响。

3. 测试不携带Referer的访问

curl -I https://example.com/

预期正常返回:

HTTP/2 200

这也说明当前规则只针对指定 Referer,不会直接屏蔽所有访问者。

4. 检查Nginx访问日志

如果 Nginx 日志格式包含请求状态码和 $http_referer,可以通过日志确认拦截情况。

例如:

grep 'spam-example.com' /path/to/access.log

重点查看:

  • 请求是否携带指定 Referer。
  • HTTP 状态码是否为 403。
  • 请求是否仍然进入 PHP-FPM。

如果日志没有记录 Referer,需要先检查 Nginx 的 log_format 配置。

七、扩展知识一:403、404、444有什么区别?

在 Nginx 和 WordPress 网站运维中,经常会使用不同的 HTTP 状态码处理异常请求。

状态码 含义 常见用途
200 请求成功 正常页面访问
301 永久重定向 HTTP 跳转 HTTPS
403 禁止访问 明确拒绝请求
404 资源不存在 不存在的页面或文件
444 Nginx 特有处理 直接关闭连接,不返回 HTTP 响应

本次使用 403,是因为我们希望明确告诉客户端:服务器已经收到请求,但拒绝提供内容。

Nginx 中还可以使用:

return 444;

444 是 Nginx 特有的处理方式,并不是标准 HTTP 状态码。

它会直接关闭连接,不向客户端返回普通 HTTP 响应。

对于来源域名拦截,使用 403 通常更加直观,也方便通过访问日志进行统计。

八、扩展知识二:Referer拦截不等于真正的防爬虫

这一点需要特别注意。

Referer 可以被客户端自行设置,因此不能将它作为可靠的身份验证手段。

例如:

curl -I \
-e "https://www.spam-example.com/" \
https://example.com/

可以主动伪造来源。

反过来,客户端也可以不发送 Referer:

curl -I https://example.com/

因此,Referer 黑名单只能处理携带指定来源信息的请求。

它不能实现:

  • 识别访问者的真实身份。
  • 阻止不携带 Referer 的爬虫。
  • 阻止伪造其他来源域名的请求。
  • 阻止直接向统计系统发送虚假数据。
  • 替代 IP 黑名单和访问频率限制。

如果网站出现持续的异常访问,还需要结合 IP、User-Agent、访问频率和请求行为进行分析。

九、扩展知识三:WordPress网站还可以增加哪些Nginx防护?

除了 Referer 黑名单,还可以根据网站实际情况增加其他服务器层防护。

1. IP地址黑名单

如果通过访问日志发现某个 IP 持续发送异常请求,可以针对性封禁。

例如:

deny 192.0.2.100;

也可以封禁整个网段:

deny 192.0.2.0/24;

以上 IP 地址属于文档示例地址,实际配置时需要替换为经过核实的异常 IP。

需要注意,不要因为单次异常请求就封禁整个 IP 段,避免误伤正常用户。

2. 使用limit_req限制请求频率

Nginx 提供了 limit_req 模块,可以限制客户端请求频率。

首先在 Nginx 的 http 配置上下文中定义:

limit_req_zone $binary_remote_addr zone=wordpress_limit:10m rate=5r/s;

然后在网站的 server 配置中使用:

limit_req zone=wordpress_limit burst=20 nodelay;

其中:

  • $binary_remote_addr:按照客户端 IP 进行请求识别。
  • zone=wordpress_limit:10m:设置共享内存区域。
  • rate=5r/s:平均每秒允许 5 个请求。
  • burst=20:允许一定数量的突发请求。
  • nodelay:突发请求在允许范围内不进行延迟排队。

需要注意,这只是示例参数,不适合直接应用于所有 WordPress 网站。

全站限流可能影响 Elementor 编辑器、WooCommerce AJAX、正常用户操作以及搜索引擎抓取。

实际部署时,建议优先针对高风险接口或特定路径设置限流,并在测试后逐步调整。

3. 使用Fail2ban自动封禁异常IP

对于持续扫描敏感文件、频繁触发异常状态码的 IP,可以考虑使用 Fail2ban。

其工作流程:

Nginx访问日志
      ↓
Fail2ban读取日志
      ↓
匹配异常访问规则
      ↓
统计触发次数
      ↓
达到设定阈值
      ↓
调用防火墙封禁IP

相比手动维护 IP 黑名单,Fail2ban 更适合处理重复出现的异常访问。

不过需要合理设计过滤规则,避免正常用户被误封。

4. 禁止WordPress敏感文件被访问

还可以针对 WordPress 敏感文件配置 Nginx 防护:

# 禁止访问WordPress配置文件
location = /wp-config.php {
    deny all;
}

# 禁止XML-RPC访问
location = /xmlrpc.php {
    return 444;
}

# 禁止uploads目录中的PHP文件执行
location ~* /wp-content/uploads/.*\.php$ {
    deny all;
}

这些规则分别用于保护 WordPress 配置文件、限制 XML-RPC 接口以及禁止上传目录中的 PHP 文件被执行。

需要根据实际业务需求配置,避免误伤依赖 XML-RPC 的应用。

十、WordPress网站服务器安全防护应该如何分层?

对于使用 WordPress + Nginx + PHP-FPM 的网站,建议将安全防护分成多个层次。

防护层 防护方式 主要目的
Nginx Referer黑名单 过滤指定来源请求
Nginx IP黑名单 拦截已确认的异常IP
Nginx limit_req 限制请求频率
Linux Fail2ban 自动封禁异常IP
WordPress 定期更新核心和插件 修复已知漏洞
WordPress 登录保护 降低账户被攻击风险
PHP-FPM 合理设置进程数量 控制服务器资源消耗
日志监控 分析访问日志 及时发现异常访问

不同防护措施解决的问题并不相同。

例如,Referer 黑名单主要用于过滤携带指定来源信息的请求,而 IP 黑名单主要针对明确识别出的异常访问地址。

如果网站存在大量高频请求,仅仅屏蔽 Referer 并不能解决所有问题。

应该结合实际访问日志,逐步完善服务器防护策略。

十一、总结:WordPress网站异常来源的处理思路

当 WordPress 网站的百度统计或其他统计工具出现陌生来源域名时,不需要第一时间安装安全插件,也不需要直接修改 WordPress 核心代码。

更合理的处理流程是:

  1. 通过统计工具发现异常来源。
  2. 检查访问页面和访问频率。
  3. 结合 Nginx 日志判断请求行为。
  4. 理解 HTTP Referer 的工作原理。
  5. 在 Nginx 层添加指定域名拦截规则。
  6. 使用 HTTP 403 拒绝匹配的请求。
  7. 通过独立配置文件统一管理多个来源域名。
  8. 使用 curl 和访问日志验证拦截效果。
  9. 如果异常访问持续存在,再结合 IP 黑名单、请求频率限制和 Fail2ban 进一步处理。

对于 WordPress 网站而言,并不是所有安全问题都需要通过插件解决。

有些问题直接在 Nginx 层处理,不仅配置简单,而且能够减少 PHP-FPM 和 WordPress 的额外资源消耗。

将 Nginx 作为 WordPress 网站的第一道请求过滤层,把 PHP 和 WordPress 留给真正需要执行的业务请求,是一种值得采用的服务器优化思路。


文章关键词

WordPress网站安全、WordPress屏蔽恶意来源、WordPress Nginx配置、宝塔Nginx 403、WordPress来源域名屏蔽、HTTP Referer拦截、Nginx黑名单、WordPress服务器安全、WordPress防爬虫、Nginx访问频率限制。

适用环境

WordPress + 宝塔面板 + Nginx + PHP-FPM,适用于企业官网、WordPress博客、WooCommerce商城以及其他基于Nginx运行的PHP网站。

本文由 好主题 原创整理,致力于分享实用的 WordPress 建站知识与主题开发经验。 我们专注于提供高质量的 WordPress企业主题 资源,帮助中小企业轻松构建专业网站。 转载请注明来源,并保留原文链接,感谢您的支持与理解。

联系我们

教程看不懂?联系我们免费为您解答!免费助力个人,小企站点!

客服微信
相关文章
主题推荐

会员注册

成为会员,获得更多专属优惠!

验证码: 加载中... =

已有账号?
还没有账号?