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

좋은 웹페이지 즐겨찾기