我有一个提供许多图像的项目。该项目还有一个API,不仅可以提供图片链接,还可以提供图片链接。
我想有一种方法来成功避免报废图像。我不介意用户可以单独下载每个图像,但不希望有人可以同时刮擦所有图像以避免高带宽使用。
我虽然使用htaccess拒绝直接访问图像文件夹。另外,还考虑在PHP(在网站中)中使用动态链接来显示图像(例如loadimage.php?id=XXXXX
),以便我的用户不知道完整的图像链接。
如何在API(甚至在网站)中进行操作以防止抓取?我虽然使用了令牌,但每个请求都会生成一个新的“图像ID”,但是我丢失了某些内容,或者无法弄清楚如何使其工作。
我知道不可能有一个100%有效的方法来做到这一点,但是任何有关如何解决它的建议都会受到赞赏。
谢谢。
您正在寻找限速政策。它涉及跟踪请求图像的次数(或交换的字节数),以及在超过阈值时发出(通常)429 Too Many Requests
响应。
Nginx对于速率限制有相当不错的built-in tools。您提到.htaccess
表示Apache,为此也有一个rate limiting module。
您可以使用或不使用PHP来执行此操作。您可以标识要限制速率的URL模式,然后将速率限制策略应用于该URL模式(可以是PHP脚本或只是某个目录)。
对于Apache:
<Location ".../path/to/script.php">
SetOutputFilter RATE_LIMIT
SetEnv rate-limit 400
SetEnv rate-initial-burst 512
</Location>
或者,您可以在您的PHP中编写代码,以写入对数据库的访问,并基于给定窗口期内的访问次数来实施限制。
当Web服务器本身支持如此好的工具时,我通常不建议自己编写。一个例外是,如果您在群集中使用多个Web服务器,则它们无法轻松地在服务器上同步限速阈值和计数。