返回

阻止Facebook抓取重定向:3种有效方法

javascript

阻止 Facebook 抓取链接重定向

链接重定向服务常常遇到一个问题:当用户在 Facebook 上分享你的短链接时,Facebook 会尝试获取目标页面的预览信息,这在某些场景下不是理想行为。比如,你的重定向链接背后是隐私内容,或者你希望隐藏真实的落地页。本篇文章讨论如何阻止 Facebook 的爬虫程序获取这些预览,并探讨可行的技术方案。

用户代理 (User-Agent) 屏蔽

许多网站通过分析用户代理字符串来区分用户和爬虫。这种方法理论上可行,针对 Facebook 的爬虫可以尝试封锁。常见的 Facebook 爬虫用户代理字符串包括facebookexternalhit/1.0facebookexternalhit/1.1

尽管提问者认为此方法失效,但用户代理屏蔽仍然是一个值得尝试的选项。可能的情况是:Facebook 为了更好地进行预览,使用了更多不同的用户代理,而不仅仅是这两个。以下是一种在 Nginx 中配置的示例,来屏蔽上述的用户代理:

server {
    ...

    if ($http_user_agent ~* (facebookexternalhit/1\.0|facebookexternalhit/1\.1)) {
        return 403;
    }

    ...
}

步骤:

  1. 打开你的 Nginx 配置文件。
  2. server 配置块内加入上述 if 语句。
  3. 保存配置文件并重启 Nginx 服务。

请注意,如果 Facebook 使用新的或伪造的用户代理,此方法可能失效。此方法仅适用于 Nginx,其它服务器的配置可能有所不同。

IP 地址封锁

封锁 Facebook 的 IP 地址是另一种直接的方法。尽管这是一个理论上可行的方案,实际执行中有几个难点:

  • IP 地址变动: Facebook 使用的 IP 地址池范围很广,且可能随时变动,你不可能维护一个完整且最新的列表。
  • 风险: 可能误伤普通用户,因为许多服务共享 IP 地址。
  • 效率低: 维护一个巨大的 IP 列表既困难,也不高效。

如果你坚持使用 IP 封锁,可以通过查找 Facebook 相关的网络信息进行一些封锁尝试。但它极不推荐,也不利于长远的网站维护。

利用 HTTP 响应头

当使用服务端重定向(例如,PHP 的 header("Location: ..."))时, Facebook 通常会跟踪这个重定向,并在其系统中缓存最终页面的信息。以下是一个解决方案:

我们可以将初始请求的服务端重定向替换为一个立即返回200响应,随后采用客户端跳转的方法。 浏览器会立即请求服务端,并在服务端响应200后,由javascript完成客户端的重定向。这样Facebook因为没有看到直接的301或302响应而不会继续抓取目标网页,也就达到了阻挡 Facebook 预览的效果。

首先,移除 PHP 或任何服务器端重定向语句:

<?php
// 移除:header("Location: $targetURL");

?>

然后,在响应中注入以下JavaScript 代码,进行客户端重定向。在html代码中包含该JavaScript 代码即可。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    
</head>
<body>
<script>
    var targetUrl = "<?php echo htmlspecialchars($targetURL); ?>"; // 获取目标链接
    window.location.replace(targetUrl);
</script>
</body>
</html>

这段JavaScript 代码从 PHP 获取动态 URL 并立即重定向用户。

更完善的服务器端响应:设置 meta nofollow 和 nosnippet

服务端虽然不进行跳转,仍然可以加入一些header和meta信息阻止一些爬虫:

可以在页面HTML头中加入一些 meta 信息:

 <head>
   <meta name="robots" content="nofollow, nosnippet" />
 </head>

此操作告知其他爬虫(不一定是Facebook),此链接不能follow。其中 nosnippet 代表不让其他程序在此页面展示预览。当然,最终还是爬虫本身决定是否尊重此设定。

在服务端HTTP头中, 还可以设置响应头:

X-Robots-Tag: nofollow, nosnippet

X-Robots-Tag 响应头有同样的效果,但它是HTTP header的一部分。相较meta tag具有更高的优先级。它能保证服务器层面已经设置好阻止信息抓取的功能。

安全建议

  • 结合多种方法。 可以尝试将用户代理检测和JavaScript 重定向结合,形成更强大的防御体系。
  • 保持更新: 持续关注Facebook的技术文档和动态。Facebook 有可能调整他们的策略,你需要随时更新你的应对措施。
  • 记录日志: 仔细审查服务器日志,跟踪来自可疑用户代理和 IP 地址的请求,从而进一步调整和优化防御方案。
  • 用户体验优先:在封锁的同时要考虑用户体验。确保网站的核心功能正常工作,避免过度限制或频繁地触发验证码。

链接重定向的安全性是一项复杂的挑战,需根据你的实际需求调整方案,没有任何方案是一劳永逸的。定期审查并更新你的防御策略,才能有效地控制网站内容的传播和安全性。