Proxy reverso - Remover subdiretório

27

Num futuro próximo, terei 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. Instalei o certificado SSL no proxy e quero usar um proxy reverso (o SSL não é obrigatório, pois todos os 3 estão em uma rede interna). porta 8081, que é um aplicativo de trilhos para o site1 e 8082, é para o site2.

Eu tenho isto...

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

Portanto, quando visito www.mysitename.com/site1, quero que ele retorne basicamente o que normalmente viria do localhost: 8081 (ou posteriormente, um IP interno para outro servidor).

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

Também existem redirecionamentos nos controladores do site (usando redirect_to) que vão de coisas como / login / index para / qualquer que seja / list.

Vou ter que redesenhar os URLs do site para usar o site1? Ou o proxy NGINX pode descobrir isso?

Obrigado.

Chromag
fonte
Para o Socket.io tente isso, basta adicionar reescrever /(.*) /socket.io/ break; serverfault.com/questions/444532/…
user956584

Respostas:

53

Citando http://nginx.org/r/proxy_pass :

Se proxy_pass for especificado com URI, ao transmitir uma solicitação ao servidor, parte de uma URI de solicitação normalizada correspondente ao local será substituída por uma URI especificada na diretiva:

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

Ou seja, você deve usar proxy_passassim:

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

Observe o final /da proxy_passdiretiva - ele substituirá parte do URI original correspondente ao local, ou seja /site1/.

Maxim Dounin
fonte
2
Só foi preciso uma barra para resolver o problema !? Obrigado por isso. Agora, para descobrir como vou lidar com o redirect_to - mas essa não é uma questão de servidor, então vou descobrir isso em outro lugar.
Chromag
observe que você também precisa da barra à direita no URL proxy_pass!
Daniel Hill