امروز همکارم بهم گفت که این سایت `buttons-for-website.com` چیه که توی آمار `referer` سایت رتبه بالایی رو داره. در حقیقت این سایت‌ها اسپم هستند، اسپم از نوع `referer`. قضیه خیلی ساده است یک کسی یکسری درخواست جعلی با یک `referer` جعلی به سرور شما ارسال میکنه و شما فکر می‌کنید که یک بازدید کننده سایت شما رو بازدید کرده درصورتی که اصلا بازدید کننده ای در کار نبوده و یک ربات وارد سایت شما شده، با یک `referer` جعلی، تنها تصوری که من از هدف این اسپم‌ها دارم تبلیغاتی بودن اون‌هاست. اینکه هرجا که قرار باشه رفررهای سرور شما دیده بشه، این سایت‌ها هم نشون داده میشن. البته ممکنه دلایل دیگر زیادی هم داشته باشه که حداقل من از اون‌ها بی‌خبر هستم. راه حل مناسب برای مقابله با این اسپم‌ها بلاک کردن درخواست‌هایی هستند که `referer` جعلی دارند. جعلی یعنی همون سایت‌های شناخت شده‌ای که قبلا دیده شدند، چون هیچ راهی برای تشخیص جعلی بودن یا نبودن یک درخواست وجود نداره.

اول باید به سراغ فایل `/etc/nginx/nginx.conf` بریم و درون بلوک `http` کد زیر رو وارد کنیم

``` ## # Referer spam ##

map $http_referer $bad_referer {
default 0;
"~*buttons-for-website.com" 1;
}

<p>با استفاده از دستور `map` قصد داریم متغییر جدید به نام `$bad_referer` ایجاد کنیم تا بتونیم بدها رو از خوب‌ها تشخیص بدیم.
همانطور که در کد اضافه شده می‌بینیم بصورت پیش‌فرض `$bad_referer` برابر مقدار `0` یا همون `false` هست و فقط در صورتی که `$http_referer` با سایت مورد نظر ما مطابقت داشته باشه این مقدار `1` یا `true` میشه. همیچنین دو کاراکتر `~*` قبل از اسم سایت نشان‌دهنده عدم حساسیت به حروف بزرگ و کوچک است.
توجه داشته باشید که دستور `map`  تنها درون بلوک `http` قابل استفاده است.
تنها کافیه سری به تنظیمات سایت خودمون بزنیم (فرض کنیم آدرس `/etc/nginx/conf.d/default` ) و درون بلوک `server` متغیرر `$bad_referer` رو چک کنیم در صورت لزوم درخواست رو بلاک کنیم.</p>

if ($bad_referer) {
return 444;
}

<p>توجه داشته باشید که نمیتونیم دستور `if` رو درون بلوک `http` بنویسیم و باید درون بلوک `server` نوشته بشه. همچنین کد `444` در `nginx` با این معنی است که هیچ خروجی‌ای به درخواست‌دهنده برگردونده نشه.
حال `nginx` خودمون رو ریستارت میکنیم و کار تموم. همیشه قبل از ریستارت با دستور `nginx -t` از صحت تنظیمات خود اطمینان حاصل کنید. هرچند در نسخه‌های جدید `nginx` خودش این کار رو انجام میده و در صورت وجود خطا سرور رو  ریستارت نمیکنه.</p>

service nginx restart

<p>برای اطمینان از درستی کار میتونیم یک درخواست با `curl` به سایت خودمون بفرستیم و خروجی رو ببینیم.</p>

curl -e "http://www.buttons-for-website.com" "http://moror.ir"

<p>خروجی این دستور:</p>

curl: (52) Empty reply from server


<p>تا اینجا کار تمومه و ما به هدف خودمون رسیدیم. فقط درصورتی که بخوایم لیست بزرگی از اسپم‌ها داشته باشیم میتونیم تنظیمات خودمون توی فایل `/etc/nginx/nginx.conf` رو کمی بهتر کنیم و یک فایل (`bad_referer.map`) بسازیم و سایت‌های بد بد مورد نظر خودمون رو توی این مشخص کنیم.
پس درون فایل `/etc/nginx/nginx.conf` اینچنین می‌نویسیم.</p>

Referer spam

map $http_referer $bad_referer {
default 0;
include /etc/nginx/bad_referer.map;
}

<p>فایل `/etc/nginx/bad_referer.map` رو هم ساخته و سایت‌ها رو لیست می‌کنیم.</p>

"~*floating-share-buttons.com" 1;
"~*event-tracking.com" 1;
"~*free-social-buttons.com" 1;
"~*100dollars-seo.com" 1;
"~*buttons-for-website.com" 1;
"~*videos-for-your-business.com" 1;
"~*get-free-traffic-now.com" 1;
"~*success-seo.com" 1;
"~*trafficmonetize.org" 1;
"~*4webmasters.org" 1;
"~*webmonetizer.net" 1;
"~*sitevaluation.org" 1;
"~*dailyrank.net" 1;
"~*rightrelevance.com" 1;
"~*best-seo-offer.com" 1;
"~*semaltmedia.com" 1;