Nginx proxy_pass e caminhos absolutos

5

Estou tentando executar alguns aplicativos nodejs em um servidor (Ubuntu 14.04), usando o Nginx e estou quase pronto. Aqui está minha configuração do servidor ( /etc/nginx/sites-available/default ):

server {
    listen 80;
    server_name my_domain.com;

    location /test1 {
        proxy_pass http://127.0.0.1:5000/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }

    location /test2 {
        proxy_pass http://127.0.0.1:5001/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

Eu tenho vários aplicativos em execução, e todos funcionam bem, eu posso acessá-los com http://my_domain.com/test1 , http://my_domain.com/test2 , etc ...

O problema é que dentro de um desses aplicativos eu tenho vários caminhos absolutos:
por exemplo. <a href="/">Home</a>
ou (dentro expresso) res.redirect('/');

Esses redirecionamentos não vão para http://my_domain.com/test1 , mas vão para http://my_domain.com/
Existe uma maneira, através de configurações nginx, para dizer ao aplicativo que a localização da raiz é realmente http://my_domain.com/test1 ?

Sou muito novo no nginx e em hosts virtuais em geral, estou tentando aprender ... Qualquer ajuda seria apreciada.
EDIT:
O resultado de curl -I http://127.0.0.1:5000 é:

HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: text/html; charset=utf-8
Content-Length: 1376
ETag: W/"560-GGm/YYltkhKxiOVNZ99jqQ"
set-cookie: connect.sid=s%3AkZYCqLKvbhHhK3W8ECBN8G91s41paws4.ekLWefrd3NdQatT3VzFNozfnFs65YBEW9k9MNTdbQT0; Path=/; HttpOnly
Date: Sat, 15 Aug 2015 13:13:20 GMT
Connection: keep-alive  

Como você pode ver, não recebo um cabeçalho de local ...
By the way, eu consegui resolver o problema usando subdomínios, que parecem funcionar como eu esperava ... De qualquer forma uma resposta seria apreciada, desde que eu possa precisar no futuro.

    
por marco.marinangeli 14.08.2015 / 23:13

1 resposta

2

A única maneira que encontrei para fazer isso funcionar é usar o HttpSubModule e adicionar sub_filter diretivas. Dados seus exemplos, pode ser assim:

sub_filter 'href="/' 'href="/test1/';
sub_filter "redirect('/')" "redirect('/test1/')";

Obviamente, quanto mais específico for a correspondência, mais opções você terá para adicionar. Se você for menos específico, como apenas combinar "/ ou '/ , precisará de menos regras, mas correrá o risco de substituir a coisa errada.

Você provavelmente também precisará adicionar:

sub_filter_types *;

para que ele não corresponda apenas ao text/html (que é o padrão), mas também aos arquivos javascript e css. Obviamente, * é a abordagem preguiçosa que pode quebrar coisas e usar tipos específicos de mim deve ser o preferido.

Em última análise, a maneira correta é corrigir o aplicativo da web. A maioria dos frameworks web suporta algo como um url / url / url de base (não parece haver um nome padrão para isso) que você possa definir para evitar exatamente esse problema.

    
por 26.01.2018 / 02:43