Nginx - วิธีเปลี่ยนเส้นทางผู้ใช้ด้วย IP ที่แน่นอนไปยังหน้าพิเศษ


26

ฉันเรียกใช้แกลเลอรี่ภาพขนาดใหญ่และมีผู้เยี่ยมชม 5 คนที่สร้างปริมาณการเข้าชมจำนวนมหาศาลด้วยการดาวน์โหลดเว็บไซต์ทั้งหมดทุกวันโดยใช้เว็บแคช ผู้เยี่ยมชมเหล่านั้นมี IP คงที่ตามที่ปรากฏ สิ่งที่ฉันต้องการทำให้สำเร็จคือ IP ทั้ง 5 ตัวนั้นถูกเปลี่ยนเส้นทางไปยังหน้าเว็บบางหน้า (ซึ่งอธิบายว่าทำไมพฤติกรรมของพวกเขาจึงเป็นปัญหา) ทันทีที่พวกเขาเข้าชมเว็บไซต์ ผู้เยี่ยมชมคนอื่น ๆ ควรจะสามารถเรียกดูเว็บไซต์ได้ตามปกติ

เซิร์ฟเวอร์กำลังเรียกใช้ CentOS (5.8) และ nginx (1.0.15) เป็นเว็บเซิร์ฟเวอร์ มีวิธีใดบ้างที่จะบรรลุเป้าหมายนี้โดยรายการใน nginx.conf ที่คุณทราบ?

ขอบคุณล่วงหน้าสำหรับคำแนะนำและการสนับสนุนของคุณ!

ขอแสดงความนับถือ -Alex

คำตอบ:


34

ภูมิศาสตร์โมดูลจะทำเพื่อให้ตรงกับที่อยู่ของลูกค้า คุณสามารถใช้มันเพื่อกำหนดตัวแปรเพื่อทดสอบดังนี้:

geo $bad_user {
  default 0;
  1.2.3.4/32 1;
  4.3.2.1/32 1;
}

server {
  if ($bad_user) {
    rewrite ^ http://www.example.com/noscrape.html;
  }
}

สิ่งนี้มีประสิทธิภาพมากกว่าการใช้ regex เทียบกับ $ remote_addr และง่ายต่อการบำรุงรักษา


ขอบคุณมาก - ใช้งานได้ดีในการใช้งานทางภูมิศาสตร์! มีเพียงสิ่งเดียวเท่านั้น: มันเปลี่ยนเส้นทางคำขอไปที่ domain.com เท่านั้นและไม่ส่งคำขอโดยตรงเช่น domain.com/file.ext หรือ domain.com/subdirectory/file.ext ฉันจะบรรลุสิ่งนี้ได้อย่างไร น่าเสียดายที่ฉันเป็น RegEx Noob :(
อเล็กซ์

ที่ไหนที่คุณใส่ถ้า? คุณสามารถให้บล็อกเซิร์ฟเวอร์ทั้งหมดได้หรือไม่ หลังจากที่คิดเพิ่มเติมให้วางถ้าโดยตรงในเซิร์ฟเวอร์ไม่ใช่ความคิดที่ดีที่สุดเพราะมันจะถูกประเมินแม้จะมีการร้องขอไปยัง /noscrape.html
kolbyjack

20

ใช้HttpAccessModuleคุณจะทำให้สิ่งนี้เกิดขึ้นอย่างรวดเร็ว

server {
    if ($remote_addr = 1.2.3.4) {
        rewrite ^ http://www.website.com/noscrape.htm;
    }
   ...
}

ขอบคุณมาก Khaled! มีวิธีที่จะรวม IP หลาย ๆ ตัวในคำสั่งนั้นหรือไม่?
อเล็กซ์

ขออภัยฉันสับสนเล็กน้อย (ใหม่ที่นี่) - ไม่ได้ตอบคำถามหรือเลด? อย่างไรก็ตามขอขอบคุณพวกคุณทั้งคู่! ;)
อเล็กซ์

1
นี้ที่จริงใช้โมดูล Rewrite if ($remote_addr ~ "^(1.2.3.4|4.3.2.1)$")คุณสามารถใช้การแข่งขันการแสดงออกปกติเช่นนี้
mgorven

ฉันnginx -Vบอกว่าไม่มีโมดูลดังกล่าว แต่ใช้งานได้ บางทีมันอาจจะถูกสร้างขึ้นในตอนนี้
user3132194

1

หากคุณเปลี่ยนเส้นทางไปยังหน้าอื่นในโดเมนเดียวกันและหากคุณทำตามตัวอย่างข้างต้นมันจะทำให้เกิดลูปโดยตรง ดังนั้นในไฟล์กำหนดค่า nginx ของคุณให้ใช้ดังต่อไปนี้ (ฉันถือว่าคุณใช้ wordpress เนื่องจากมันใช้กันอย่างแพร่หลาย)

geo $bad_user {
  default 0;
  1.2.3.4/32 1;
  4.3.2.1/32 1;
}

server {
 location /
 {
  if ($bad_user) {
    rewrite ^ http://www.example.com/warning-page/ break;
  }

try_files $fullurl${request_uri}index.html $uri $uri/ /index.php$is_args$args;
 }

location /warning-page/
{
try_files $fullurl${request_uri}index.html $uri $uri/ /index.php$is_args$args;
}

}

ตอนนี้ถ้ามีใครบางคนจากบัญชีดำที่เข้าเยี่ยมชมหน้าใด ๆ ยกเว้นหน้าคำเตือนที่ไม่ได้อยู่ในเว็บไซต์พวกเขาจะถูกเปลี่ยนเส้นทางไปยังหน้าคำเตือน เนื่องจากการเขียนซ้ำอยู่ในตำแหน่ง / บล็อกจึงไม่ทำให้เกิดการวนซ้ำของการเปลี่ยนเส้นทาง อย่างไรก็ตามหากอยู่ในบล็อกเซิร์ฟเวอร์จะทำให้เกิดการวนรอบการเปลี่ยนเส้นทาง

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