나는 haproxy 1.7.8을 사용하고 있습니다.
HTTP Referer 헤더에서 일부 특정 학대자 도메인에 대한 요청을 차단하는 구성이 있습니다.
내 haproxy 구성의 중요한 부분은 다음과 같습니다.
frontend https_l1_xxxxx
(...)
acl is_abuser_by_referer capture.req.hdr(7) -m reg -i ^https?:\/\/(.+\.)?(someabuser.com|someabuser2.com|someabuser3.com)(\?.*|\/.*)?$
acl return_html_path path_beg /urlICareAbout
use_backend abuser if is_abuser_by_referer return_html_path
backend abuser
# override standard 200 status code
http-response set-status 418 reason "I'm a teapot"
server nginx_abusers localhost:8091
...nginx는 실제로 8091을 수신하고 일부 HTML을 제공합니다.
작동합니다. 브라우저/컬에 이 HTTP 헤더를 설정하고 haproxy에 요청하여 테스트했습니다. 418이 표시되었습니다.
문제는 내 haproxy 로그가 다음과 같다는 것입니다.
Feb 5 13:11:45 aaa-www05 haproxy_l1_xxxxx[38749]: 111.222.111.222:2605 [05/Feb/2018:13:11:44.849] DFDA00BD:0A2D_0A19800C:01BB_--_7BFDAD https_l1_xxxxx ~ abuser/nginx_abusers 280/0/1/0/282 200 6044 - - ---- 145/145/0/0/0 0/0 {e60b039c46a1e104a94558ce0e480654||07.mydomain.com|||Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.5; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET4.0C; .NET||http://someabuser.com/player.swf} {||} 467 "GET /urlICareAbout/?preview=true HTTP/1.1"
... 상태 코드 200이 418 대신 기록됩니다.
왜 이런 일이 발생합니까?
고쳐 쓰다:나는 haproxy가 반환된 실제 상태 코드를 기록하기를 원합니다.HTTP 로그 형식 문서 상태:
- "status_code" is the HTTP status code returned to the client. This status is generally set by the server, but it might also be set by haproxy when the server cannot be reached or when its response is blocked by haproxy.
답변1
예상대로 작동합니다. 백엔드는 기록된 상태인 200 OK를 반환합니다. 시스템 관리자가 디버깅 목적으로 로그에 실제 백엔드 응답 데이터를 원하기 때문에 이를 재정의할 필요가 없습니다.
"status_code"는 클라이언트에 반환된 HTTP 상태 코드입니다.
클라이언트의 상태는 418이고 Greg가 쓴 것처럼 이것은 잘 작동합니다.
답변2
(@Maciej 어셈블러대답은 정확하지만 완전히 명확하지 않을 수 있으므로 나중에 참고할 수 있도록 다시 표현해 보겠습니다. )
내 백엔드 서버가 200을 반환하면 예상대로 작동합니다.
왜?
당신이 읽을 의향이 있다면이 줄만선적 서류 비치:
"status_code"는 클라이언트에 반환된 HTTP 상태 코드입니다.
..그렇다면 이는 명백한 문서 오류가 될 것입니다.하지만다음은 이것입니다.
이 상태는 일반적으로 서버에 의해 설정되지만, 서버에 연결할 수 없거나 해당 응답이 haproxy에 의해 차단되는 경우 haproxy에 의해 설정될 수도 있습니다.
문장의 이 부분에서는 "서버에 연결할 수 없거나 응답이 haproxy에 의해 차단될 때 haproxy에 의해 설정될 수도 있습니다"라는 상황이 발생하지 않으므로 문장의 첫 번째 부분은 "이 상태는 일반적으로 서버에 의해 설정됩니다. 서버 설정".