通过.htaccess防止热链接的有效方法

时间:2010-05-24 06:02:38

标签: php .htaccess overloading hotlinking

在我指责某人之前,我需要确认一些事情......好吧,我宁可不说。

问题:

我们允许用户上传图片并将其嵌入我们网站的文字中。在过去,我们允许用户热链接到我们的图像,但由于服务器负载,我们不幸地不得不停止此操作。

当前“解决方案”:

程序员用来解决“太多连接”问题的方法是将接收和处理图像请求的文件(image_request.php)重命名为image_request2.php,并用

替换原始内容。
<?php
header("HTTP/1.1 500 Internal Server Error") ;
?>

显然这会导致所有带有src属性的图像指向原始的image_request.php,并且在这种情况下也是错误的代码。

建议的解决方案:

我觉得更优雅的解决方案是:

在.htaccess

  1. 如果请求是针对image_request.php
  2. 检查推荐人
  3. 如果引荐来源不是我们的网站,请发送相应的标题
  4. 如果引荐来源是我们的网站,请转到image_request.php并处理图片请求
  5. 我想知道的是:

    与简单地将每个请求500返回到image_request.php相比:

    如果我们使用上面提到的建议的替代解决方案,会产生多少更多负载?

    有更好的方法吗?

    我们主要担心的是网站熬夜。我不同意打破所有内部链接的图像是解决这个问题的最佳/唯一方法。我拒绝告诉我们的用户,由于我们更改了某些内容,他们现在必须手动更改所有以前上传的内容中的嵌入代码。

4 个答案:

答案 0 :(得分:2)

好的,那么你可以使用Apache的mod_rewrite功能来阻止热链接:

http://www.cyberciti.biz/faq/apache-mod_rewrite-hot-linking-images-leeching-howto/

答案 1 :(得分:1)

使用ModRwrite可能比运行PHP脚本的负载更少。我认为你的解决方案会更轻。

如果referer标头不为空,请确保仅在步骤3中阻止访问。某些浏览器和防火墙完全阻止引用标头,您不希望阻止它们。

答案 2 :(得分:1)

我假设您将图像路径存储在带有图像ID的数据库中,对吧? 然后查询数据库中的图像路径,为其提供图像ID。

我建议你将MemCached安装到服务器并进行用户请求的缓存。在PHP中很容易做到。之后,您将看到服务器负载并决定是否应该停止此热链接事物。

答案 3 :(得分:1)

增加的负载等于PHP(zilch)中字符串比较的负载。

混淆解决方案甚至不能解决问题,因为它不会阻止未来的链接发生。如果您确实检查了引用者标题,请确保所有主流主流浏览器都会按预期设置标题。它是一个可选的标题,对于嵌入在HTML文档中的图像,行为可能因浏览器而异。

您可能已为所有请求启用了会话(无论是否经过身份验证) - 作为备份计划,您还可以将会话Cookie名称重命名为隐藏的内容(编辑:此处的默认设置实际上无关紧要)因为cookie仅为您的主机设置(并且它是))并检查是否在image_request.php中设置了该名称的cookie(没有cookie设置将表明它是对您站点的第一个请求)。仅将其用作后备或冗余检查。这比检查推荐人更糟糕。

如果您是通过markdown或其他方式动态生成IMG HTML,则可以使用私钥散列策略,并将短暂的过期时间附加到查询字符串。完全气密,但它似乎超越你正在做的事情。

此外,没有“适当的标题”可以向客户说谎资源的可用性;)只需发送404。