nginx против личеров

Как прикрыть доступ личерам под апачем, я уже говорил. А теперь поговорим как заблокировать доступ к ресурсам используя nginx.

Разберем пример, на основе домена yapro.ru

1. Откройте конфигурационный файл вашего виртуального хоста, например: /etc/nginx/nginx.conf

2. Найдите там блок настроек виртуального хоста:

server {
...
}

3. Найдите в блоке настроек строку вида:

root /var/www/yapro.ru;

 и добавьте после этой строки следующее:

location ~* ^.+\.(txt|ico|jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf)$ {
    access_log /var/log/nginx/yapro.ru.files;
    location ~* ^.+\.(ico|jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf)$ {
        valid_referers
                none
                yapro.ru *.yapro.ru
                ~(.+)\.(yandex|google|yahoo|bing|facebook|subscribe|feedburner|mail|rambler|nigma|ask|qip|bing)\.([a-z]+)$
                ~^(yandex|google|yahoo|bing|facebook|subscribe|feedburner|mail|rambler|nigma|ask|qip|bing)\.([a-z]+)$
        ;
        if ($invalid_referer = 1) {
            return 403;
        }
        # ... ниже можно еще добавить правил
    }
}

Все готово, осталось только сохранить конфиг-файл и перезапустить nginx.

Как это работает

Синтаксис: valid_referers none | blocked | server_names | строка ...;

$invalid_referer по-умолчанию равен 1, но значение будет равно пустой строке, если:

  • указать none и заголовок “Referer” в запросе будет отсутствует
    или
  • указать blocked  и “Referer” будет начинатся не на “http://” или “https://”
    или
  • указать server_names и “Referer” содержит один из доменов, указанных ранее в директиве server_name
    или
  • указать строку, в которой перечислить домен/домены и указанный в “Referer” будет аналогичен одному из перечисленных в этой строке

Нюансы

Указав none я разрешаю доступ к файлам для запросов без рефереров, чтобы поисковые боты могли читать файлы.

Директива valid_referers предполагает, что Вы просто перечислите дружественные домены, поэтому после none, в строке перечисляю все валидные рефереры

Значение blocked и server_names я не указывал, т.к. у меня все возможные домены указаны в строке.

Обратите внимание, я вложил один location в другой (во втором исключил расширение файла txt), вам такое вложение может быть не нужным.

Когда срабатывает условие if ($invalid_referer = 1) { и выполняется return 403; то в лог-файл ничего не попадает (не забывайте про это).

Надеюсь помог, удачки!

Источники: 1 - 2 - 3 - 4 - 5


14.09.2013 04:48