Como usar o Nginx para reescrever e proxy_pass enquanto mantém o URL inserido pelo usuário

1

Sou um usuário novato do Nginx tentando fazer proxy do seguinte:

http://subdomain.example.com/mypage/login
TO
http://some_ip_address/login

(não apenas / login - o site também tem outros contextos, por exemplo, / static, / api, etc.)

Embora eu possa funcionalmente fazer isso funcionar, o usuário vê http://some_ip_address em seu navegador, o que eu gostaria de evitar.

Essa configuração é assim:

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile      on;
    keepalive_timeout  3;
    server {
        server_name this_server_ip;
        location /mypage/ {
            proxy_pass http://some_ip_address;
            rewrite ^/mypage/(.*)$ http://some_ip_address/$1 last;
        }
        location / {
          root /var/local/directory/;
        }
    }
}

Para tentar corrigi-lo, tentei combinações de:

  • proxy_pass http://some_ip_address/; (ou seja, com barra final)
  • proxy_set_header Host $host;
  • rewrite ^/mypage/(.*)$ /$1 last;

Mas obtenho os 404 ou atendo a página hospedada em http://subdomain.example.com , ou seja, rewrite funciona, mas proxy_pass não.

Existem algumas questões semelhantes no serverfault, mas nenhuma parece abordar o meu sabor particular deste problema, infelizmente. Exemplos são este e qual .

Qualquer sugestão seria muito apreciada, obrigado.

    
por Paul J 16.07.2015 / 22:58

1 resposta

0

Você está especificando this_server_ip como o nome do host para este host virtual. Isso significa que esse host virtual não é usado para nenhuma solicitação que tenha um nome de domínio, mas seu servidor virtual padrão nginx é usado para solicitações de http://subdomain.example.com/ .

Você precisa alterar seu server_name para subdomain.example.com ou adicionar default_server à diretiva listen neste bloco server e removê-lo da configuração padrão do nginx.

EDIT: Tente esta configuração vhost:

server {
    server_name subdomain.example.com;
    location ~ /(mypage|static/api)/ {
        proxy_pass http://some_ip_address/$1/;
    }
    location / {
      root /var/local/directory/;
    }
}

Ou seja, você não precisa de uma instrução rewrite , porque está fazendo proxy da solicitação para outro servidor.

    
por 17.07.2015 / 23:47