我如何阻止 PHP 中的所有 CloudFlare IP

How can i block all CloudFlare IPs in PHP

我遇到了一些使用 cloudflare 的代理站点的问题,它们隐藏了我的网站并对其进行了垃圾索引。

我如何阻止 php 中的所有 cloudflare ip,以便这些抓取我网站的网站被阻止.. 或者有更好的解决方案吗? 我的网站也在使用 cloudflare。

How can i block all cloudflare ip's

My website is also using cloudflare

你不能 - 否则你将无法自己使用 cloudflare。

更好的解决方案是让您的网络服务器(例如 apache 或 nginx)检查主机 header(这是用户在地址栏中看到的内容)以及它是否不是您的正常域仅 301 重定向(永久)- 这将告诉搜索引擎内容已从报废站点“移动”到合法站点

幸运的是,cloudflare 提供了它们的 IP 范围列表 here,因此只需检查连接 IP 是否在这些范围之一内,如果是则退出()。

使用 M6Web/Firewall 的示例实现:

use M6Web\Component\Firewall\Firewall;

if(!((new Firewall())->setDefaultState(true)->addList(file('blacklist.txt',FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES),'localBad')->setIpAddress($_SERVER['REMOTE_ADDR'])->handle())){
     http_response_code(403);
     exit();
}

附带每日 cronjob:

<?php
$ips = file_get_contents ( 'https://www.cloudflare.com/ips-v4' ) . "\n" . file_get_contents ( 'https://www.cloudflare.com/ips-v6' );
file_put_contents ( '/path/to/blacklist.txt', $ips );
  • 请注意,手动实施 ipv6 cidr 范围很困难,因此您可能应该使用第 3 方库,如 M6Web 防火墙。此外,与 php 级别相比,使用 iptables 执行此操作的性能要高得多。

  • cronjob 并不是真正需要的,您可以在每次页面加载时获取新的 ips 列表,但这可能会非常慢,而且,也许具有讽刺意味的是,您可能会获得自动 ip-禁止 cloudflare.com 发送垃圾邮件,因此我强烈建议您使用每日 cronjob。