You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止WooCommerce网站遭机器人垃圾GET过滤请求攻击?

通用解决方案:拦截WooCommerce分层导航遍历机器人

我之前帮几个WooCommerce用户解决过几乎一模一样的问题——这种遍历分层导航过滤参数的机器人真的烦,换IP绕封禁还触发超大的缓存更新查询,把磁盘和服务器资源都占满。下面是几个通用的多层防护方案,从应用层到服务器层联动,比单纯封IP靠谱多了:

1. WooCommerce应用层限制

先从源头减少这类请求的影响,同时拦截异常请求:

  • 延长分层导航缓存有效期:机器人反复请求会强制刷新WooCommerce的分层导航计数缓存(就是你日志里的_transient_wc_layered_nav_counts_*),把缓存时间拉长能大幅减少数据库更新次数。在主题的functions.php里加这段代码:

    add_filter( 'woocommerce_layered_nav_counts_transient_expiration', function() {
        return 86400; // 缓存1天,默认是几小时,可按需调整
    } );
    
  • 添加请求频率限制:针对带filter_参数的请求,用临时缓存记录请求次数,超过阈值就返回403。同样在functions.php里加:

    add_action( 'template_redirect', 'block_excessive_filter_requests' );
    function block_excessive_filter_requests() {
        if ( isset( $_GET ) && !empty( array_filter( array_keys( $_GET ), function( $key ) {
            return str_starts_with( $key, 'filter_' );
        } ) ) ) {
            // 用请求的URI+参数作为唯一标识
            $request_key = md5( $_SERVER['REQUEST_URI'] );
            $request_count = get_transient( 'filter_req_' . $request_key );
            
            if ( $request_count && $request_count > 5 ) {
                wp_die( 'Too many requests', 'Forbidden', 403 );
            }
            
            set_transient( 'filter_req_' . $request_key, ( $request_count ?: 0 ) + 1, 60 ); // 1分钟内限制5次
        }
    }
    

2. Apache服务器层拦截

利用Apache的模块直接拦截符合特征的恶意请求,效率比应用层更高:

  • 拦截参数异常的请求:机器人会一次性传多个过滤选项(比如flavor1,flavor2,...,flavor15),可以直接拦截逗号数量过多的请求。在.htaccess里加:

    # 拦截filter参数值包含超过5个逗号的请求
    RewriteCond %{QUERY_STRING} filter_[^=]+=([^&]*),([^&]*),([^&]*),([^&]*),([^&]*),([^&]*) [NC]
    RewriteRule ^product-category/ - [R=403,L]
    
  • 速率限制拦截:用mod_evasive模块(需要先安装)针对过滤请求做频率限制,比如1分钟内同一个IP请求超过5次就封禁10分钟。在Apache配置或.htaccess里加:

    <LocationMatch "^/product-category/.+\?filter_">
        DOSHashTableSize    3097
        DOSPageCount        5       # 1分钟内同一页面最多5次请求
        DOSSiteCount        10      # 1分钟内同一IP最多10次站点请求
        DOSPageInterval     60      # 统计窗口1分钟
        DOSSiteInterval     60
        DOSBlockingPeriod   600     # 封禁10分钟
    </LocationMatch>
    
  • 拦截无Referer/异常UA的请求:很多机器人不带Referer或者用异常的User-Agent,可针对性拦截:

    # 拦截无Referer的filter请求
    RewriteCond %{QUERY_STRING} filter_ [NC]
    RewriteCond %{HTTP_REFERER} ^$
    RewriteRule ^product-category/ - [R=403,L]
    
    # 拦截常见恶意UA(可自行补充)
    RewriteCond %{HTTP_USER_AGENT} (bot|crawler|spider) [NC]
    RewriteCond %{QUERY_STRING} filter_ [NC]
    RewriteRule ^ - [R=403,L]
    

3. 数据库层优化(降低慢查询影响)

即使有漏网的请求,也要减少对数据库的冲击:

  • 给wp_options表加索引:如果你的wp_options表没有针对option_name的索引,执行这条SQL(替换表前缀):

    CREATE INDEX idx_option_name ON wp_options(option_name);
    

    这能加快缓存更新的查询速度,减少锁表时间。

  • 清理超大缓存记录:如果已经有很大的_transient_wc_layered_nav_counts_*记录,可以手动删除:

    DELETE FROM wp_options WHERE option_name LIKE '_transient_wc_layered_nav_counts_%';
    

4. 机器人合规性拦截(辅助手段)

虽然机器人可能无视,但还是可以在robots.txt里明确禁止这类请求:

User-agent: *
Disallow: /product-category/?filter_

另外,给分层导航页面添加隐形CAPTCHA(比如reCAPTCHA v3),只有通过验证的请求才处理过滤逻辑,大部分自动化机器人会被拦截。可以用WooCommerce的官方reCAPTCHA插件实现。


内容的提问来源于stack exchange,提问作者aoa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:13:56