Como tratar URLs relativas corretamente com um proxy reverso nginx

0

Claro, não sou o primeiro que tentou veicular um domínio example.com de um example.net/bbb , mas ainda não encontrei uma solução.

Minha configuração do NGINX segue as diretrizes e se parece com algo assim:

server {
    listen 80;
    server_name example.net;
    root /path/to/aaa;

    location /bbb/ {
        proxy_pass http://example.com/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    location / {
        try_files $uri $uri/ /index.html;
    }
    location ~ \.(svg|ttf|js|css|svgz|eot|otf|woff|jpg|jpeg|gif|png|ico)$ {
        access_log off;
        log_not_found off;
        expires max;
    }
}

Eu consigo processar a raiz de example.com em example.net/bbb , mas:

EDIÇÃO 1

example.net/bbb/some/path não funciona como esperado e o index.html de example.net é processado.

EDIÇÃO 2

Qualquer recurso em example.com/assets fornece 404 porque o navegador procura example.net/assets . Seja ótimo se eu pudesse resolver isso sem colocar caminhos absolutos em todos os lugares.

    
por a.barbieri 25.09.2018 / 22:19

1 resposta

1

O problema é basicamente que usar uma diretiva proxy_pass não irá reescrever o código HTML e, portanto, os URLs relativos, por exemplo, um img src="/assets/image.png" não será alterado para img src="/bbb/assets/image.png" .

Eu escrevi sobre estratégias potenciais para resolver isso no Apache httpd aqui e soluções similares também são possíveis para o nginx:

  • Se você tiver controle sobre example.com e como o aplicativo / conteúdo é implantado, implante no mesmo URI básico que deseja usar em example.net para o proxy reverso - > implemente seu código em example.com/bbb e, em seguida, seu proxy_pass será bastante fácil, pois /assets/image.png será movido para /bbb/assets/image.png:

    location /bbb/ {
         proxy_pass http://example.com/bbb; 
    
  • Se você tiver controle sobre example.com e como o aplicativo / conteúdo é implantado:
    mudar para caminhos relativos , ou seja, em vez de img src="/assets/image.png"
    consulte img src="./assets/image.png" de uma página example.com/index.html
    e para img src="../../assets/image.png" de uma página example.com/some/path/index.html

  • Talvez você tenha sorte e o example.com use apenas alguns caminhos de URI na raiz e não sejam usados por example.net, e então simplesmente proxy reverso todos os subdiretórios necessários :

    location /bbb/ {
         proxy_pass http://example.com/; 
    }
    location /assets/ {
         proxy_pass http://example.com/asssets/; 
    }
    location /styles/ {
         proxy_pass http://example.com/styles/; 
    
  • desista usando um exemplo.com como subdiretório no example.net e hospede-o em um subdomínio de example.net :

    server { 
      server_name bbb.example.net 
      location / {
         proxy_pass http://example.com/; 
      }
    }
    
  • reescreva o conteúdo (HTML) ativando o nginx ngx_http_sub_module . Isso também permitirá que você reescreva URLs absolutas com algo semelhante a:

    location /bbb/ {
         sub_filter 'src="/assets/'  'src="/bbb/assets/';
         sub_filter 'src="http://example.com/js/''src="http://www.example.net/bbb/js/' ;
         sub_filter_once off;
         proxy_pass http://example.com/; 
    }
    
por 25.09.2018 / 23:15