Có một cách thanh lịch để chặn một loạt các giới thiệu cùng một lúc?


21

Để ngăn spam người giới thiệu, nginx.conf của tôi có một phần như thế này:

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

Các quy tắc này nói với nginx chỉ để đóng kết nối nếu người dùng có một trong những giới thiệu này được đặt. Có một cách thanh lịch hơn để làm điều này? Tôi có thể xác định danh sách các tên miền này và sau đó nói một cái gì đó như, nếu Nếu người giới thiệu nằm trong danh sách này thì hãy trả về 444.


tạo một tệp lớn khá giống với tệp từ mẫu và sử dụng tệp đó dưới dạng tệp bao gồm khi cần.
Hrvoje Špoljar

Câu trả lời:


31

Tôi sẽ thử một map:

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

Sau đó sử dụng nó như vậy:

if ($bad_referer) {
    return 444;
}

1
Vì bản đồ sử dụng bảng băm, cách tiếp cận này sẽ thực hiện tốt hơn một loạt các kiểm tra riêng lẻ. Đọc tài liệu cho các tùy chọn có thể được sử dụng, như hostnamesvà sở includehữu một tệp riêng biệt nơi chúng được liệt kê có thể giúp duy trì dễ dàng hơn.
Brian

Đọc các tài liệu liên quan đến maptôi rất quan tâm để xem liệu người ta có thể sử dụng regex để khớp với một số giới thiệu nhất định hay không vì OP đang thực hiện so khớp regex bằng ~*toán tử, và thực sự chỉ cần xác định quy tắc bản đồ như "~*spamdomain4.com" 1;sẽ thực hiện thủ thuật. Khéo léo!
Hrvoje Špoljar

Bạn nói đúng, và điều này cần phải sử dụng nó.
Michael Hampton

Sử dụng hostnamestùy chọn sẽ đơn giản hơn.spamdomain4.com 1;
Brian

4
@Brian Trường tham chiếu là một URL hoàn chỉnh, không chỉ đơn giản là tên máy chủ. Vì vậy, nó không hoạt động.
Michael Hampton

13

Bạn có thể sử dụng logic ORđể tạo một câu lệnh khớp nhiều ví dụ

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

EDIT mỗi bình luận; loại bỏ break;khỏi khối


2
Lệnh phá vỡ sẽ không bao giờ đạt được vì trở lại dừng xử lý yêu cầu hiện tại.
Xavier Lucas

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.