리버스 프록시-서브 디렉토리 제거


27

가까운 장래에 3 개의 nginx 서버가 있습니다. 하나는 다른 하나의 SSL에 대한 리버스 프록시입니다. 예를 들어 다음으로 이동합니다.

https://www.mysitename.com/site1

이 예에서 다른 두 서버는 site1과 site2입니다. 프록시에 SSL 인증서를 설치하고 리버스 프록시를 사용하고 싶습니다 (3 개 모두가 내부 네트워크에 있으므로 SSL이 필요하지 않습니다). 테스트 목적으로 nginx가 443에서 SSL / 리버스 프록시를 수신 대기하고 있습니다. 사이트 1의 레일 앱인 포트 8081, 사이트 2의 포트 8081입니다.

내가 이거 가지고있어...

server {
    listen                  443;
    server_name             mysitename.com;

    ssl                     on;
    ssl_certificate         ssl/mysitename.com.crt;
    ssl_certificate_key     ssl/mysitename.com.key;
    keepalive_timeout       60;

    location /site1 {
        proxy_pass http://localhost:8081;
        proxy_set_header    Host            $host;
        proxy_set_header    X-Real-IP       $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_redirect http:// https://;
    }

    location /site2 {
        proxy_pass http://localhost:8082;
        proxy_set_header    Host            $host;
        proxy_set_header    X-Real-IP       $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_redirect http:// https://;
    }
}

따라서 www.mysitename.com/site1을 방문하면 기본적으로 localhost : 8081 (또는 나중에 다른 서버의 내부 IP)에서 오는 것을 반환하기를 원합니다.

localhost 호출에서 "site1"을 제거하는 방법이 있습니까? 그것이하는 것처럼 보이는 것은 localhost : 8081 / site1을 사용하는 것입니다. site1 및 site2 사이트는 "site1"이없는 "/ login / index"또는 "/ whatever / list"등입니다.

/ login / index와 같은 것에서 / whatever / list로가는 사이트 컨트롤러 (redirect_to를 사용하여)에도 리디렉션이 있습니다.

site1을 사용하려면 사이트의 URL을 다시 디자인해야합니까? 아니면 NGINX 프록시가 알아낼 수 있습니까?

감사.


Socket.io의 경우 다시 쓰기 /(.*) /socket.io/ break를 추가하십시오. serverfault.com/questions/444532/…
user956584

답변:


53

인용 http://nginx.org/r/proxy_pass :

proxy_pass가 URI로 지정되면 요청을 서버로 전달할 때 위치와 일치하는 정규화 된 요청 URI의 일부가 지시문에 지정된 URI로 대체됩니다.

location /name/ {
    proxy_pass http://127.0.0.1/remote/;
}

즉, 다음 proxy_pass과 같이 사용해야 합니다.

location /site1/ {
    proxy_pass http://localhost:8081/;
    ...
}

지시문 의 후행 /에 주목하십시오 . proxy_pass위치와 일치하는 원래 URI의 일부를 대체합니다 (예 :) /site1/.


2
문제를 해결하기 위해 슬래시 만 있으면됩니다!? 고마워 이제 redirect_to를 처리하는 방법을 알아 내기 위해-서버 질문이 아니므로 다른 곳에서 알아 낼 것입니다.
Chromag

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