한 번에 많은 리퍼러를 차단할 수있는 우아한 방법이 있습니까?


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나열된 파일 과 별도로 별도의 파일을 사용하여 유지 관리하기가 더 쉬울 수 있습니다.
Brian

mapOP 와 관련하여 문서를 읽는 것이 OP가 ~*연산자를 사용하여 정규 표현식 일치를 수행하기 때문에 정규 참조를 사용하여 특정 리퍼러와 일치시킬 수 있는지 확인 하고 실제로 맵 규칙을 지정하는 "~*spamdomain4.com" 1;것이 트릭을 수행하는 것과 관련 이 있습니다. 산뜻한!
Hrvoje Špoljar

네 말이 맞아, 어쨌든 그것을 사용해야합니다.
Michael Hampton

hostnames옵션을 사용하면 간단합니다.spamdomain4.com 1;
Brian

4
@Brian referer 필드는 단순한 호스트 이름이 아닌 완전한 URL입니다. 그래서 그것은 작동하지 않습니다.
Michael Hampton

13

논리 OR를 사용 하여 하나의 멀티 매치 문장을 만들 수 있습니다.

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

코멘트 당 편집 ; break;블록에서 제거


2
return이 현재 요청의 처리를 중지하므로 break 지시문에 도달하지 않습니다.
Xavier Lucas

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.