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 модуля обработки изображений

защита фотографий от китайцев

В результате, любой китаец сможет зайти на сайт но вместо качественных картинок он получит уменьшенные и обрезанные копии, не пригодные для коммерческого использования, а так же он получит такие же негодные картинки если откроет страницу сайта в кеше любого поисковика