Como configurar o proxy reverso NGINX preservando os URLs relativos dos recursos estáticos?

1

Estou tentando configurar um proxy reverso usando proxy_pass no NGINX. A página carrega muito bem, mas todas as assistências estáticas (js, css, imgs) que usam URLs relativos são interrompidas porque prefixam o nome do host do servidor pai. Existe uma maneira de usar um proxy reverso enquanto mantém o nome do host do proxy para todos os recursos estáticos?

parent.conf

server {
    listen 80;
    server_name parent.mydomain.com;
    return 301 https://$server_name$request_uri;
}

server {

    listen 443 ssl;

    server_name parent.mydomain.com;
    root /var/www/parent;
    index index.html;

    try_files $uri.html $uri $uri/ =404;

    # error and access out
    error_log /var/log/error.log;
    access_log /var/log/access.log;

    ssl on;
    ssl_certificate /etc/ssl/myssl.pem;
    ssl_certificate_key /etc/ssl/myssl-key.pem;

    # Here is the important part. Any url matching 
    # this pattern needs to proxy_pass to child. 
    location ~ "^/[a-z0-9]{24}$" {

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-NginX-Proxy true;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_pass https://child.mydomain.com;

        proxy_redirect off;
    }

}

child.conf

server {
    listen 80;
    server_name child.mydomain.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443;
    server_name child.mydomain.com;
    root /var/www/child;

    ssl on;
    ssl_certificate /etc/ssl/myssl.pem;
    ssl_certificate_key /etc/ssl/myssl-key.pem;

    error_log /var/log/child.log;
    access_log /var/log/child.log;

    # this is a single page app so all request
    # should be routed through index.html.
    location / {
        try_files $uri /index.html;
    }
}

Agora, se eu atingir https://parent.mydomain.com/54570f77968d6e492b0d68af , a página de índice de child.mydomain.com será carregada, mas nenhum dos meus arquivos estáticos fará isso, pois eles estão tentando carregar em https://parent.mydomain.com em vez de onde estão localizados https://child.mydomain.com/js/main.js .

    
por jwerre 22.01.2016 / 20:24

2 respostas

1

Em vez de fazer proxy reverso no endereço "ip" (proxy_pass link ), tente proxy_pass link .

Em seguida, adicione YourHostNameBehindReverseProxy a / etc / hosts e associe-o a 127.0.0.1.

    
por 22.01.2016 / 20:36
0

@cnst I don't want parent to load anything from child except the index page. I need the host for all the static resources to remain child.mydomain.com – jwerre 7 mins ago

Sua pergunta parece ser offtopic para serverfault, então.

A melhor maneira de realizar o que você deseja seria usar o <base href='https://child.mydomain.com/'/> para garantir que o navegador sempre carregue todos os recursos de child.mydomain.com :

<html>
   <head>
      <base href='https://child.mydomain.com/'/>

Alternativamente, se você não tem mais nada que você queira servir dentro do próprio pai, então você pode simplesmente fazer um 301 Moved redireciona de todas as páginas 404 para o filho.

    error_page 404 =301 http://child.mydomain.com$request_uri;

Ou, melhor ainda, remova seu try_files do pai e, em vez disso, redirecione todas as solicitações que não correspondam a um local mais específico para o filho:

location / {
    return 301 http://child.mydomain.com$request_uri;
}
    
por 25.02.2016 / 00:05