nginx 프 록 시 상황 에서 jsp request. getserver name 에서 프 록 시 ip 를 얻 을 수 없습니다.
실제 응용 서버
브 라 우 저 는 프 록 시 에 요청 을 보 내 고 프 록 시 는 응용 서버 에 요청 을 보 내 며 프 록 시 는 응용 서버 가 돌아 온 내용 을 브 라 우 저 에 게 되 돌려 줍 니 다.
상황 재현:
프 록 시 가 있 는 경우 request. getServerName () 은 실제 프 록 시 서버 의 주 소 를 얻 을 수 없습니다. nginx 가 설정 되 어 있 지 않 으 면. proxy_set_header Host $Host, 그럼 받 은 주 소 는 127: 0.0.1 입 니 다. 왜 일 까요?
원인 분석:
Tomcat 의 소스 코드 를 보면 request 는 http heder 의 host 를 먼저 판단 합 니 다. 없 으 면 이 컴퓨터 의 ip 주 소 를 가 져 옵 니 다. 프 록 시 서버 가 실제 서버 에 보 낸 header 에 host 를 설정 하지 않 았 기 때문에 127.0.0.1 을 얻 었 습 니 다.응용 서버 요청 헤더 에 프 록 시 를 보 내 면 host 를 프 록 시 자체 의 ip 주소 로 설정 하면 프 록 시 서버 의 ip 주 소 를 얻 을 수 있 습 니 다.
소스 코드 분석의 구체 적 인 과정:
프로젝트 는 maven 을 사용 하기 때문에 원본 코드 를 보 는 것 이 편리 합 니 다.
ServletRequest-----HttpServletRequestImpl------HttpServerExchange
다음은 servlet 3.0 의 소스 코드 입 니 다.
/**
* Return the host that this request was sent to, in general this will be the
* value of the Host header, minus the port specifier.
* <p/>
* If this resolves to an IPv6 address it will not be enclosed by square brackets.
* Care must be taken when constructing URLs based on this method to ensure IPv6 URLs
* are handled correctly.
*
* @return The host part of the destination address
*/
public String getHostName() {
String host = requestHeaders.getFirst(Headers.HOST);
if (host == null) {
host = getDestinationAddress().getAddress().getHostAddress();
} else {
if (host.startsWith("[")) {
host = host.substring(1, host.indexOf(']'));
} else if (host.indexOf(':') != -1) {
host = host.substring(0, host.indexOf(':'));
}
}
return host;
}
해결 방안
nginx 에 proxy 설정set_header Host $Host
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
nginx upstream 사용 및 소스 코드 분석nginx 는 한편, 하류 클 라 이언 트 로부터 http 요청 을 받 고 요청 을 처리 하 며 요청 에 따라 tcp 메 시 지 를 상류 서버 로 보 내 고 상류 서버 의 반환 메시지 에 따라 하류 클 라 이언 트 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.