Я пытаюсь заблокировать доступ к изображениям на моем сервере, если они связаны с некоторыми обычными «злодеями», то есть сайтами с пользователями, которые обычно используют пропускную способность других людей:
Есть две вещи, которые отличают мой вопрос от других, например этот вопрос и этот вопрос:
Я попытался включить RewriteRules в apache.conf, но он вообще ничего не делает. И, похоже, нет опции, которая позволяет мне перенаправлять в зависимости от SetEnv.
Какие-либо предложения?
У меня есть решение, даже если оно не очень красивое, потому что оно оставляет документ с ошибкой 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 в файл PHP в нашем каталоге / server404. Затем мы проверяем, есть ли у него хотлинкинг (там мы делаем то же самое для видеофайлов, то есть два тега 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);
?>
Это работает, но не так красиво, как хотелось бы, поэтому буду рад другим решениям.
В моем httpd.conf есть что-то вроде этого:
RewriteCond "%{HTTP_REFERER}" !=""
RewriteCond "%{HTTP_REFERER}" "!^http://www.mydomain.com/.*$" [NC]
RewriteRule "\.(jpg|png)$ - [F]
Возможно, вам также придется использовать это, если вы раньше не использовали RewriteConds и RewriteRules:
RewriteEngine On
Я нашел это в Google или в кулинарной книге Apache. Больше не могу вспомнить.
Единственный эффективный способ сделать это - использовать правила перезаписи мода. Если реферер не из вашего собственного домена, перепишите URL-адрес изображения так, чтобы он был несуществующим, в другом месте или прозрачным GIF размером 1 на 1 пиксель.
Многие люди делают это с изображением, которое гласит: «Нет пиявки, приятель» или что-то подобное
Проверка реферера не всегда работает, некоторые прокси или даже браузеры удаляют заголовок HTTP_REFERER из HTTP-запросов.
Намного лучше проверить файлы cookie в коде, генерирующем контент [например, index.php, который генерирует галерею изображений], и проверить на уровне mod-rewrite или apache2, если для cookie установлено ожидаемое значение.