分页防刷统计与封锁机制的完整代码,可配合你已有的分页访问限制功能使用,实现更强的反采集防御:
功能目标
每个 IP 访问分页页码过多(如超过 10 次超页限制)就临时封锁;
使用 WordPress 的 transient 缓存记录访问;
配合 Nginx 也可做更高强度防御(如屏蔽 IP);
完整代码:加入 functions.php
add_action('template_redirect', 'limit_paging_with_ip_protection');
function limit_paging_with_ip_protection() {
if (is_admin()) return;
$max_page = 20; // 正常允许访问的最大页码
$max_violation = 10; // 单个 IP 最多允许违规次数
$block_minutes = 60; // 封锁时长(分钟)
$paged = max(1, (int) get_query_var('paged'));
if (! (is_home() || is_archive() || is_search() || is_tag() || is_category()) || $paged <= $max_page) {
return;
}
// 获取用户 IP(兼容 CDN)
$ip = $_SERVER['HTTP_CF_CONNECTING_IP'] ?? $_SERVER['REMOTE_ADDR'];
$block_key = 'block_ip_' . md5($ip);
$count_key = 'violation_count_' . md5($ip);
// 如果已被封锁
if (get_transient($block_key)) {
show_fake_404();
}
// 增加违规次数
$count = (int) get_transient($count_key);
$count++;
set_transient($count_key, $count, 6 * HOUR_IN_SECONDS);
// 如果超限就封锁
if ($count >= $max_violation) {
set_transient($block_key, 1, $block_minutes * 60);
show_fake_404();
}
}
// 显示伪 404 页面
function show_fake_404() {
global $wp_query;
$wp_query->set_404();
status_header(404);
nocache_headers();
$template_404 = get_query_template('404');
if ($template_404) {
include $template_404;
exit;
} else {
echo '<h1>404 Not Found</h1>';
exit;
}
}