Назад | Перейти на главную страницу

Apache 2: запретить хотлинкинг изображений по всему серверу

Я пытаюсь заблокировать доступ к изображениям на моем сервере, если они связаны с некоторыми обычными «злодеями», то есть сайтами с пользователями, которые обычно используют пропускную способность других людей:

Есть две вещи, которые отличают мой вопрос от других, например этот вопрос и этот вопрос:

Я попытался включить 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);
    ?>
  • Первая строка используется для идентификации файла изображения, который мы хотим отправить.
  • Затем мы устанавливаем HTTP-заголовок на 200 (это необязательно. Решайте сами),
  • добавьте несколько заголовков, чтобы избежать кеширования изображения (мы не хотим, чтобы этот файл с розовыми пикселями 8000x8000 появлялся «из кеша» на нашем сайте, если человек решит перейти на наш сайт, не так ли?).
  • Длина содержимого в соответствии с размером фиктивного файла и
  • Тип MIME (возможно, вам придется изменить последний, чтобы не использовать PNG).
  • Затем читаем файл.

Это работает, но не так красиво, как хотелось бы, поэтому буду рад другим решениям.

В моем 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 установлено ожидаемое значение.

смотрю Вот или Вот.