return 301 https://$host$request_uri;포트 80의 기본 응답 인 경우 , 서버가 조만간 열린 프록시 목록에 올라 인터넷의 다른 곳으로 트래픽을 보내기 위해 남용 될 수 있습니다 [1]. 로그에 다음과 같은 메시지가 가득 차면 자신에게 발생한 일임을 알 수 있습니다.
42.232.104.114 - - [25/Mar/2018:04:50:49 +0000] "GET http://www.ioffer.com/i/new-fashion-fine-gold-bracelet-versaec-bracelet-641175733 HTTP/1.1" 301 185 "http://www.ioffer.com/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Hotbar 4.1.8.0; RogueCleaner; Alexa Toolbar)"
문제는 $host브라우저가 Host헤더 또는 HTTP의 시작 줄에서 호스트 이름으로 보내는 모든 것을 다음과 같이 에코합니다 .
GET http://www.ioffer.com/i/new-fashion-fine-gold-bracelet-versaec-bracelet-641175733 HTTP/1.1
그 문제 때문에 여기에있는 다른 대답은 $server_name대신 대신 사용 하는 것이 좋습니다 $host. $server_name항상 무엇을 평가 당신이 에 넣어 server_name선언. 그러나 하위 도메인이 여러 개 있거나 와일드 카드를 사용하는 경우 선언 후 첫 번째 항목 $server_name만 사용 하기 때문에 작동하지 않으며 더 중요하게 와일드 카드를 에코하지 않습니다 (확장하지 않음).server_name
보안을 유지하면서 여러 도메인을 지원하는 방법은 무엇입니까? 내 자신의 시스템에 나는함으로써이 딜레마 처리 한 첫 번째 목록 default_server사용하지 않는 블록을 $host다음 않는 와일드 카드 블록 목록 :
server {
listen 80 default_server;
server_name example.com;
return 301 https://example.com$request_uri;
}
server {
listen 80;
server_name *.example.com;
return 301 https://$host$request_uri;
}
(두 번째 블록에 둘 이상의 도메인을 나열 할 수도 있습니다.)
이 조합을 사용하면 일치하지 않는 도메인이 하드 코드 된 곳 (항상 example.com)으로 리디렉션 되고 자신과 일치하는 도메인이 올바른 위치로 이동합니다. 서버는 개방형 프록시로 유용하지 않으므로 문제를 일으키지 않습니다.
당신이 기분이 나쁘다면, default_server블록을 합법적 인 도메인과 일치 시키지 않고 공격적인 것으로 만들 수 있다고 생각합니다 . . . .
[1] 기술적으로 "프록시"는 잘못된 단어입니다. 서버가 나가지 않고 클라이언트에 대한 요청을 이행하지 않고 리디렉션 만 보내지 만 올바른 단어가 무엇인지 잘 모르겠습니다. 또한 목표가 무엇인지 확실하지 않지만 로그로 노이즈를 채우고 CPU와 대역폭을 소비하므로 중지 할 수도 있습니다.