3 votes

Comment mettre en place un reverse proxy NGINX tout en préservant les urls relatives des ressources statiques ?

J'essaie de mettre en place un reverse proxy en utilisant proxy_pass dans NGINX. La page se charge bien mais toutes les aides statiques (js, css, imgs) qui utilisent des urls relatives se cassent la figure parce qu'elles préfèrent le nom d'hôte du serveur parent. Y a-t-il un moyen d'utiliser un reverse proxy tout en conservant le nom d'hôte du proxy pour toutes les ressources statiques ?

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

Maintenant, si j'appuie sur https://parent.mydomain.com/54570f77968d6e492b0d68af la page d'index de child.mydomain.com se charge bien mais aucun de mes fichiers statiques ne le fait puisqu'ils essaient de se charger sous https://parent.mydomain.com au lieu de l'endroit où ils se trouvent réellement https://child.mydomain.com/js/main.js .

1voto

jackluo923 Points 31

Au lieu de procéder à une procuration inverse de l'adresse "ip" (proxy_pass http://127.0.0.1:9003 ), essayez proxy_pass http://YourHostNameBehindReverseProxy:9003 .

Ajoutez ensuite YourHostNameBehindReverseProxy à /etc/hosts et associez-le à 127.0.0.1.

1voto

cnst Points 12508

@cnst Je ne veux pas que le parent charge quoi que ce soit de l'enfant à l'exception de la page d'index. J'ai besoin que l'hôte de toutes les ressources statiques reste child.mydomain.com - jwerre 7 mins ago

Votre question semble donc être hors sujet pour serverfault.

La meilleure façon d'accomplir ce que vous voulez serait alors d'utiliser la fonction <base href='https://child.mydomain.com/'/> pour s'assurer que le navigateur l child.mydomain.com :

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

Par ailleurs, si vous n'avez rien d'autre à servir à partir du parent lui-même, vous pouvez simplement faire un 301 Moved redirection de toutes les pages 404 vers l'enfant.

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

Ou, mieux encore, supprimez votre try_files du parent, et redirige plutôt vers l'enfant toutes les demandes qui ne correspondent pas à un emplacement plus spécifique :

location / {
    return 301 http://child.mydomain.com$request_uri;
}

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X