如果图像链接自某些常见的“坏人”,即那些倾向于使用其他人带宽的用户网站,我会尝试阻止对我服务器上图像的访问:
- livejounal.com
- 博客网
- myspace.com
- ...
- 我想在“服务器范围”进行配置,即在 apache.conf 中为所有主机/域进行配置,而不是在 .htaccess 或单个虚拟主机中进行配置
- 我想将请求重定向到我选择的图像,而不仅仅是发送 403 FORBIDDEN
我尝试在 apache.conf 中包含 RewriteRules,但它什么也没做。而且似乎没有允许我根据 SetEnv 进行重定向的选项。
有什么建议么?
答案1
我有一个解决方案,即使它不是很漂亮,因为即使图像没有被热链接,它也会导致默认错误 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>
一段时间以来,我们一直使用 /server404 路径来记录全服务器的 404 错误文档,因此我们已经有了它。您也可以将其命名为 403 或 GlobalNoHotlink 或任何您想要的名称。
对于图像(第一个 FilesMatch),我们将“禁止”的 ErrorDocument 设置为 /server404 目录中的 PHP 文件。然后我们检查它是否被热链接(我们对视频文件也这样做,因此有两个 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 M Y H: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(这是可选的。自行决定),
- 添加一些标题以避免缓存图像(如果有人决定访问我们的网站,我们不想让那个 8000x8000 的粉红色像素文件“从缓存”出现在我们的网站上,对吗?)。
- 根据虚拟文件的大小确定内容长度,并
- MIME 类型(您可能必须更改后者而不使用 PNG)。
- 然后我们读取文件。
它确实有效 - 但它并不像我希望的那么漂亮,所以我仍然对其他解决方案感到高兴。
答案2
我的 httpd.conf 中有类似这样的内容:
RewriteCond "%{HTTP_REFERER}" !=""
RewriteCond "%{HTTP_REFERER}" "!^http://www.mydomain.com/.*$" [NC]
RewriteRule "\.(jpg|png)$ - [F]
如果你以前没有使用过 RewriteConds 和 RewriteRules,那么你可能也需要使用它:
RewriteEngine On
我在 Google 上或 Apache Cookbook 上找到了它。现在记不清了。
答案3
唯一有效的方法是使用 mod 重写规则。如果引用者不是来自您自己的域,则将图像 URL 重写为不存在的 URL、其他地方的 URL 或 1px x 1px 的透明 gif。
许多人会用一张写着“不要吸血,伙计”或类似字样的图片来做这件事