Я пытаюсь реализовать защиту загрузки от хотлинкинга.
У меня есть этот код
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
заявление.
Я сам не тестировал эту точную конфигурацию, но принцип должен работать.