Nginx ile referer spam botları bloklamak

İlk olarak en basit yola bakalım. Bu yol nginx’in kendi sitesinde şu adreste yer almakta. Bu yöntemle basitçe site.conf dosyanız aşağıdaki gibi engellenecek adresleri eklememiz yeterli.

location / {
  valid_referers none blocked *.badreferer1.com badreferer2.com *.badreferer3.com badreferer4.net;
 
  if ($invalid_referer) {
    return   403;
  }
}

Oldukça basit ve etkli bir yöntem ancak listeniz uzayıp gidiyorsa daha etkili bir yol var mı acaba diye merak ediyorsunuz. Bu da bizi ikinci yönteme getiriyor.

İkinci yöntem ngx_http_referer_module ve ngx_http_map_module modülleri kullanılarak gerçekleştirilmekte. Bu iki modülde standart nginx kurulumlarında bulunmakta ancak kendiniz derliyorsanız bu modülleri yüklemeniz gerekiyor.

İlk olarak /etc/nginx/blacklist.conf dosyamızı oluşturalım. Burada nginx map modülünü kullanacağız basitçe bu modül değerleri, diğer değişkenlerin değerlerine bağlı değişkenler oluşturur. Biliyorum garip bir cümle oldu, kısacası varsayılan bir değerimiz kaynak değerimize (refere site) göre değişmekte. Örneğe bakarsak;

map $http_host $name {
    hostnames;
    default         0;
    example.com     1;
    *.example.org   2;
}

$name değişkenimiz varsayılan olarak 0’dır ancak hostname example.com ise 1 veya *.example.org ise 2 değerini alacaktır. O halde bu yöntemle blacklistimizi oluşturalım.

#/etc/nginx/blacklist.conf
map $http_referer $block {
    hostnames;
    default                           0;
    "~floating-share-buttons.com"     1;
    "~share-buttons.com"              1;
    # Elbette istediginiz kadar adres ekleyebilirsiniz.
}

Artık nginx konfigurasyonumuza (/etc/nginx/nginx.conf) blacklistimizi ekleyebiliriz.

# /etc/nginx/nginx.conf
 
http {
    #istediginiz bir bolume ekleyin.
    include blacklist.conf;
}

Son olarak ise site konfigurasyon dosyamızda yukarıda oluşturduğumuz $block değişkenimizi kontrol edelim. Eğer $block değerimiz 0’dan farklı ise 444 hatası yani herhangi bir cevap vermeden bağlantıyı kapatalım.

# /etc/nginx/sites-enabled/benim.conf
server {
  if ($block) { 
    return 444; 
  } 
}

Sanırım bu kodar. Curl ile birkaç deneme yapabilirsiniz.

curl --referer http://floating-share-buttons.com http://benimsitem.com