Reverse Proxy - Remove Subdirectory

24

Num futuro próximo, eu vou ter 3 servidores nginx. Um é um proxy reverso para SSL para os outros dois. Então, por exemplo, eu vou para:

https://www.mysitename.com/site1

Os outros dois servidores neste exemplo são site1 e site2. Eu instalei o certificado SSL no proxy e eu quero usar um proxy reverso (SSL não é necessário desde que todos os 3 estão em uma rede interna) .Para fins de teste estou tendo nginx ouvir em 443 para SSL / reverse-proxy, ouça porta 8081 que é um aplicativo rails para site1 e 8082 é para site2.

Eu tenho isso ...

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://;
    }
}

Então, quando visito www.mysitename.com/site1, quero basicamente retornar o que normalmente viria do localhost: 8081 (ou mais tarde, na linha, um IP interno para outro servidor).

Existe uma maneira de remover o "site1" da chamada localhost? O que parece estar fazendo é usando localhost: 8081 / site1. Os sites site1 e site2 são da natureza "/ login / index" ou "/ whatever / list", etc, sem "site1".

Também há redirecionamentos nos controladores de site (usando redirect_to) que vão de coisas como / login / index para / whatever / list.

Eu terei que reprojetar as URLs do site para usar o site1? Ou o proxy NGINX pode descobrir isso?

Obrigado.

    
por Chromag 01.11.2012 / 21:29

1 resposta

45

Citando o link :

If proxy_pass is specified with URI, when passing a request to the server, part of a normalized request URI matching the location is replaced by a URI specified in the directive:

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

Ou seja, você precisa usar proxy_pass da seguinte forma:

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

Observe o / à direita na diretiva proxy_pass - ele substituirá parte do URI original correspondido pelo local, ou seja, /site1/ .

    
por 02.11.2012 / 13:12