Защита от хотлинкинга
Защита от хотлинкинга — правило сервера или CDN не отдавать файл по прямому запросу с чужого домена: проверяют Referer или подпись.
Определение
Хотлинкинг — когда чужой сайт вставляет вашу картинку тегом img и показывает её за ваш трафик. Защита рубит такой запрос: вместо файла уходит 403 или заглушка.
Как это работает
Браузер передаёт заголовок Referer — адрес страницы, откуда пришёл запрос. Nginx сверяет его со списком своих доменов (valid_referers) и на чужой отвечает 403. Подделать Referer в curl — одна строка, поэтому надёжнее подписанные ссылки: хеш и срок годности в адресе, как в S3.
Почему фото не открывается по QR
На компьютере ссылка живая, а по коду со стикера — «доступ запрещён». Из камеры Referer уходит пустым: не разрешён вариант none — и запрос считают чужим. Или истекла подпись: ссылка живёт часы, а наклейка месяцами. Ведите код на страницу-обёртку.
Связанные концепции
Чаще всего это вылезает на облачной ссылке на файл: файлообменники режут запросы со стороны. Учитывайте HTTPS: с https на http браузер Referer не шлёт вовсе.
Частые вопросы
Почему картинка из QR-кода не открывается?
Обычно файл лежит на хостинге с защитой от хотлинкинга: из камеры браузер не передаёт Referer, и сервер считает запрос чужим. Реже истекает подпись временной ссылки. Признак: с вашей страницы файл грузится, а прямой ссылкой — нет.
Как включить защиту на своём сайте?
На Nginx — директива valid_referers со списком ваших доменов и 403 остальным. На Apache то же через .htaccess и условие по HTTP_REFERER. У CDN и хостингов это готовый переключатель в настройках зоны сайта.
Можно ли обойти защиту от хотлинкинга?
Проверку Referer — легко: заголовок подставляется вручную в curl. Подписанную ссылку без ключа не подделать, но она работает у всех, кому её переслали, пока не вышел срок. Честный путь — своя копия файла.
Не пострадают ли поиск и превью ссылок?
Пострадают, если запретить пустой Referer. Роботы Яндекса и Google, парсеры превью Telegram и VK ходят без реферера: фото выпадет из выдачи, ссылки останутся без миниатюр. Вариант none оставляйте разрешённым.