Apache 2:防止服务器范围内的图像盗链

我试图阻止访问我的服务器上的图像,如果他们从一些常见的“坏人”链接,即网站的用户倾向于使用其他人的带宽:

  • livejounal.com
  • blogger.com
  • myspace.com

有两件事把我的问题和其他问题区分开来,比如这个问题和这个问题 :

  • 我想这样做“服务器范围”,即configuration在所有主机/域的apache.conf中,而不是在.htaccess或单个虚拟主机
  • 我想将请求redirect到我select的图像,而不是发送一个403 FORBIDDEN

我试图在apache.conf中包含RewriteRules,但是它根本没有做任何事情。 而且似乎没有一个选项允许我根据SetEnvredirect。

有什么build议么?

我有一个解决scheme,即使它不是很漂亮,因为它留下了默认错误403文档更改,即使图像没有被盗链:

这进入apache2.conf:

SetEnvIfNoCase Referer "livejournal.com" hotlink <FilesMatch ".(gif|jpg|jpeg|png)$"> ErrorDocument 403 /server404/no_hotlink.php </FilesMatch> <FilesMatch ".(gif|jpg|jpeg|png|mpg|avi|flv)$"> deny from env=hotlink </FilesMatch> Alias /server404 "/var/www/_404" <Directory "/var/www/_404"> AllowOverride AuthConfig Order allow,deny Allow from all </Directory> 

一段时间以来,我们在/ server404path中使用了服务器级的404错误文档,所以我们已经有了这个。 你也可以把它叫做403或者GlobalNoHotlink或者任何你想要的。

对于图像(第一个FilesMatch),我们在/ server404目录中设置“禁止”ErrorDocument到PHP文件。 然后我们检查它是否是热链接的(我们也为video文件做了这样的事情,因此有两个FilesMatch标签),如果被盗链的话,禁止访问。

这进入/var/www/_404/no_hotlink.php – 在禁止的图像上调用的PHP文件:

  <?PHP $file = dirname(__FILE__) . '/_default/no_hotlink.png'; header('HTTP/1.1 200 OK', true, 200); header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Last-Modified: " . gmdate("D, d MYH:i:s") . " GMT"); header("Cache-Control: no-cache, must-revalidate"); header("Pragma: no-cache"); header('Content-length: ' . filesize($file)); header('Content-type: image/png'); readfile($file); ?> 
  • 第一行用于识别我们想要发送的图像文件。
  • 然后我们将HTTP头设置为200(这是可选的,自己决定),
  • 添加一些标题,以避免caching图像(我们不想让这个8000×8000粉红色的像素文件出现在我们网站的“caching”中,如果这个人决定去我们的网站,是吗?)。
  • 内容长度根据虚拟文件的大小和
  • MIMEtypes(您可能必须更改不使用PNG的后者)。
  • 然后我们读取文件。

它的工作 – 但它不是我想要的那样美丽,所以仍然会对其他解决scheme感到高兴。

在我的httpd.conf中有这样的东西:

 RewriteCond "%{HTTP_REFERER}" !="" RewriteCond "%{HTTP_REFERER}" "!^http://www.mydomain.com/.*$" [NC] RewriteRule "\.(jpg|png)$ - [F] 

如果您之前没有使用RewriteConds和RewriteRules,您可能也需要使用它:

 RewriteEngine On 

我发现它在谷歌或Apache的食谱。 不记得了。

唯一有效的方法是使用mod重写规则。 如果引荐来源不是来自您自己的域名,那么将图片url重写为不存在的地方,或其他地方,或者1px x 1px的透明gif。

很多人用这样的图像来做这个事情:“没有偷菜,伙计”或类似的东西

引用者检查不总是工作,一些代理甚至浏览器从http请求中删除HTTP_REFERER头。

在你的内容生成代码中检查一些cookie好得多(比如index.php会生成图片库),如果cookie设置为期望值,检查mod-rewrite或者apache2级别。

看这里或这里 。