Hotlinking (хотлинкинг) и защита от него
Если вы читали предыдущий пост «Воровство постов с блога и почему это плохо», то должны знать, что человек скопировавший у меня пост на варез-портал имел глупость (или лень) вставить прямую картинку с моего сайта. Это и называется хотлинкингом (hotlinking) и с этим можно бороться.
Если вы попали на эту странице, набрав ссылку с картинки — что ж... Добро пожаловать! Почитайте сайт в его первоисточнике. Думаю страница Навигации поможет вам в этом.
Хотлинкинг — это вставка вашего содержимого (картинки, например) на чужую страницу без вашего ведома и разрешения. При этом само содержимое не копируется на новый сервер, а как было на вашем так и остается. Скажем, во время вставки картинки на свой сайт, нашему старому знакомому Плохому Вебмастеру достаточно прописать абсолютный путь в параметре src, тег img:
<img src="http://blog.undsoft.com/wp-content/uploads/see_through.png">
Плохой Вебмастер вставляет это себе в код страницы и готово. Пользователь пользователь разницу увидит только в случае ошибки. Беда в том, что hotlinking использует ресурсы вашего сервера — мало того, что это была картинка с вашего сайта, которую кто-то взял, это к тому же ваш траффик, каждый раз, когда кто-то смотрит чужую веб-страничку.
К счастью с хотлинкингом можно бороться. У некоторых хостеров можно включить защиту от хотлинкинга прямо в Cpanel. Если же у вас такой возможности нет, вы можете использовать .htaccess для защиты.
Htaccess vs. Hotlinking
Создайте в директории, где находятся ваши картинки, .htaccess файл и пропишите в нем следующее:
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?yandex\.ru/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?undsoft\.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?yandex\.net/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?feedburner\.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?mail\.ru/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?poisk\.ru/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^$ [NC]
RewriteRule .*\.(jpe?g|gif|bmp|png)$ nohotlink.png [L]
Для работы этого серверного правила потребуется специальный установленный модуль для преобразований URL — mod_rewrite. Идея в том, что когда браузер запрашивает у сервера картинку, он посылает в специальном http-заголовке информацию о том, с какой страницы пользователь попал на эту картинку. Этот заголовок называется реферером (от англ. refer — напрявлять, отсылать).
Если реферер на совпадает с адресом вашего сайта (в примере — с адресом моего сайта), вместо файлов з разрешением jpe?g|gif|bmp|png будет показана картинка nohotlink.png. Вопросительный знак jpe?g означает, что буквы e может не быть, то есть это блокирует как jpg, так и jpeg.
В этом случае, если браузер запросит что-либо из перечисленных типов файлов не с вашей страницы И при этом отправит REFERER, пользователь вместо этого файла увидит картинку nohotlink.png, на которой вы можете написать все, что пожелаете
. Этот метод так же защищает от прямых ссылок на файлы — посетитель сможет скачать файл по ссылке только с вашей страницы.
В правила придется добавлять исключения для некоторых поисковых систем и сайтов. Да, знаю, это не слишком изящное решение, но лучшего я пока не придумал. Строка RewriteCond %{HTTP_REFERER} !^$ [NC] пропустит запрос пользователя, если referrer'a нет.
Этот метод не помешает Google — он сможет дальше без проблем кравлить картинки с сайта, так как он использует уже кешированные версии в результатах поиска.
Конечно, такой метод все равно расходует ваш трафик, но в теории может привнести и дополнительных посетителей. Поменяйте последнюю строчку на
RewriteRule .*\.(jpe?g|gif|bmp|png)$ - [F]
и тогда сервер будет выдавать ошибку 403 (Forbidden) вместо содержимого.
P.S.
А почему бы при этом не сделать редирект не на картинку, а на специальный рhp-скрипт, который сначала запишет в лог этот параметр HTTP_REFERER, а уже потом выдаст картинку? Таким образом вы всегда будете знать, какой сайт пытается использовать ваше содержимое.