มีวิธีที่สวยงามในการบล็อกผู้อ้างอิงหลายคนพร้อมกันหรือไม่?


21

เพื่อป้องกันสแปมผู้อ้างอิง nginx.conf ของฉันมีส่วนดังนี้:

if ($http_referer ~* spamdomain1\.com) {
    return 444;
}
if ($http_referer ~* spamdomain2\.com) {
    return 444;
}
if ($http_referer ~* spamdomain3\.com) {
    return 444;
}

กฎเหล่านี้บอก nginx เพียงเพื่อปิดการเชื่อมต่อหากผู้ใช้มีหนึ่งในชุดอ้างอิงเหล่านี้ มีวิธีที่สง่างามกว่านี้หรือไม่? ฉันสามารถกำหนดรายการของโดเมนเหล่านี้แล้วพูดแบบ“ ถ้าผู้อ้างอิงอยู่ในรายการนี้แล้วส่งคืน 444”


สร้างไฟล์ขนาดใหญ่หนึ่งไฟล์ซึ่งค่อนข้างเหมือนกับไฟล์จากตัวอย่างและใช้เป็นไฟล์รวมเมื่อจำเป็น
Hrvoje Špoljar

คำตอบ:


31

ฉันจะลองmap:

map $http_referer $bad_referer {
    default                  0;
    "~spamdomain1.com"       1;
    "~spamdomain2.com"       1;
    "~spamdomain3.com"       1;
}

จากนั้นใช้งานเช่น:

if ($bad_referer) {
    return 444;
}

1
เนื่องจากแผนที่ใช้ตารางแฮชวิธีนี้จะทำงานได้ดีกว่าชุดการตรวจสอบเดี่ยว อ่านเอกสารเพื่อดูตัวเลือกที่สามารถใช้งานได้เช่นhostnamesและincludeมีไฟล์แยกต่างหากที่มีการระบุไว้ในรายการเพื่อให้ง่ายต่อการบำรุงรักษา
ไบรอัน

การอ่านเอกสารที่เกี่ยวข้องกับmapฉันมีความสนใจที่จะดูว่าใครสามารถใช้ regex เพื่อจับคู่ผู้อ้างอิงบางส่วนเนื่องจาก OP ทำการจับคู่ regex โดยใช้~*โอเปอเรเตอร์และแน่นอนเพียงระบุกฎแผนที่เช่น"~*spamdomain4.com" 1;จะทำเคล็ดลับ เรียบร้อย!
Hrvoje Špoljar

คุณพูดถูกและจำเป็นต้องใช้มันอยู่ดี
Michael Hampton

ด้วยการใช้hostnamesตัวเลือกมันจะง่ายมาก ๆ.spamdomain4.com 1;
Brian

4
@Brian ฟิลด์ผู้อ้างอิงเป็น URL ที่สมบูรณ์ไม่ใช่เพียงชื่อโฮสต์ นั่นไม่ได้ผล
Michael Hampton

13

คุณสามารถใช้ตรรกะORเพื่อสร้างคำสั่งการจับคู่หลายคำเช่น

if ($http_referer ~ "spamdomain1\.com|spamdomain2\.com|spamdomain3\.com")  { 
  return 444;
}

แก้ไขต่อความคิดเห็น ลบออกbreak;จากบล็อก


2
คำสั่ง break จะไม่สามารถเข้าถึงได้เนื่องจากการส่งคืนจะหยุดการประมวลผลของคำขอปัจจุบัน
ซาเวียร์ลูคัส

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.