28 мая 2018 Nginx
Есть стереотип, что жители китая любят копировать готовое, а значит необходимо защищать от них контент, особенно медиа контент. Обычно это делается так:
- CMS во время создания сессии новоми клиенту сайта проверяет IP клиента на принадлежность стране запрета
- во время этой проверки делается либо запрос в базу данных, либо API запрос на внешний сервер (но в любом случае получаются временные издержки на запрос)
- если IP входит в запрещённую сеть, то пользователь перенаправляется на страницу заглушку либо генерируется ошибка 403 или 404
- иначе пользователь продолжает просматривать страницы сайта вместе с включёнными в них картинками
Но в случае применения такого метода остаётся возможность получить доступ через Proxy/VPN либо воспользовать кешем любого поисковика, а они подтянут с сайта все защищаемые картинки
При этом необходимо так же следить за актуальностью базы данных IP адресов или за состояние API сервиса
Если такие условия и ограничения не являются приелимыми, то можно воспользоваться возможностью веб-сервера Nginx фильтровать входящие запросы по HTTP-заголовкам. Суть этого метода в том, что у любого человека его родной язык включён в список языков его веб-браузера, таким образом у китайца среди всех языков, которые он использует есть китайский, а значит в его запросе на сайт будет присутвовать вот такой HTTP-заголовок
Accept-language: zh,ru;q=0.8,en-US;q=0.5,en;q=0.3
Значит нужно научить веб-сервер выделять таких клиентов и направлять их туда куда нужно, я сделал это вот так
map $http_accept_language $lang {
default ru;
~by by;
~ru ru;
~zh zh;
}location /media/ {
# если китаец
set $redir 0;
if ( $lang ~* 'zh' ){
set $redir 1;
}
# если запрос фотографии
if ( $request_uri ~* \.(jpeg|jpg|png)$ ){
set $redir 2$redir;
}
if ( $redir = 21 ){
rewrite /media/(.*) /media_v/$1?lang=$lang&redir=$redir&$http_referer;
}alias /webapps/centrsvet/media/;
}location /media_v/ {
image_filter_jpeg_quality 10;
image_filter resize 700 600;
alias /webapps/centrsvet/media/;
}
- Здесь в первая конструкция определяет переменную $lang
- вторая конструкция определяет поведение веб-сервера при обращении к директирии с фотографиями, тут "накапливаются" тесты в переменной $redir и если среди языков присутвует китайский и он запрашивает какое либо изображение, то происходит редирект в директорию media_v
- в правило директории media_v уменьшает качество и размер изображения с помощью встроенного в nginx модуля обработки изображений
В результате, любой китаец сможет зайти на сайт но вместо качественных картинок он получит уменьшенные и обрезанные копии, не пригодные для коммерческого использования, а так же он получит такие же негодные картинки если откроет страницу сайта в кеше любого поисковика