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

Nginx Запретить хотлинкинг с исключением

Я пытаюсь реализовать защиту загрузки от хотлинкинга.

У меня есть этот код

    location /download/ {
      valid_referers  blocked  server_names  *.example.com;

      if ($invalid_referer) {
        return   403;
      }

Работает нормально, это позволяет указать домен и заблокировать все, что отсутствует в valid_referers. В чем проблема? Я хочу реализовать указанный IP-адрес, которому разрешено использовать не реферер, а остальные заблокировать его.

Это то, что показывает журнал.

1.2.3.4 - - - "GET file.doc HTTP / 2.0" 200 13050 "-" "-"

Я хочу только 1.2.3.4 не принимать ни одного реферера.

Для предотвращения хотлинкинга достаточно разрешить пустые строки реферера (прямые загрузки). Поэтому ваша конфигурация может выглядеть так:

valid_referers none blocked server_names *.example.com;

Браузеры всегда добавляют заголовок Referer к запросам изображений при загрузке изображений, встроенных в веб-страницы.

Если вы действительно хотите заблокировать прямую загрузку изображений, вам нужно использовать что-то подобное в http уровень конфигурации nginx:

geo $blocked {
    default 1;
    1.2.3.4 0;
}

А потом в server блок:

location /download/ {
    valid_referers  blocked  server_names  *.example.com;

    set $refblocked $invalid_referer$blocked;

    if ($refblocked = "11") { # If value of both $invalid_referer and $blocked are 1, block access.
        return 403;
    }
}

Здесь geo модуль используется для отображения IP-адреса на значение переменной, и set используется для объединения $invalid_referer и $blocked в одну переменную, которая проверяется в if заявление.

Я сам не тестировал эту точную конфигурацию, но принцип должен работать.