在我指责某人之前,我需要确认一些事情......好吧,我宁可不说。
问题:
我们允许用户上传图片并将其嵌入我们网站的文字中。在过去,我们允许用户热链接到我们的图像,但由于服务器负载,我们不幸地不得不停止此操作。
当前“解决方案”:
程序员用来解决“太多连接”问题的方法是将接收和处理图像请求的文件(image_request.php)重命名为image_request2.php,并用
替换原始内容。<?php
header("HTTP/1.1 500 Internal Server Error") ;
?>
显然这会导致所有带有src属性的图像指向原始的image_request.php,并且在这种情况下也是错误的代码。
建议的解决方案:
我觉得更优雅的解决方案是:
在.htaccess
我想知道的是:
与简单地将每个请求500返回到image_request.php相比:
如果我们使用上面提到的建议的替代解决方案,会产生多少更多负载?
有更好的方法吗?
我们主要担心的是网站熬夜。我不同意打破所有内部链接的图像是解决这个问题的最佳/唯一方法。我拒绝告诉我们的用户,由于我们更改了某些内容,他们现在必须手动更改所有以前上传的内容中的嵌入代码。
答案 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。