Comment réécrire les URL dans une réponse proxy dans NGINX

J'ai l'habitude D'utiliser Apache avec mod_proxy_html, et j'essaie de réaliser quelque chose de similaire avec NGINX. Le cas d'utilisation spécifique est que j'ai une interface utilisateur admin en cours D'exécution dans Tomcat sur le port 8080 sur un serveur au contexte racine:

http://localhost:8080/

J'ai besoin de faire surface sur le port 80, mais j'ai d'autres contextes sur le serveur NGINX fonctionnant sur cet hôte, donc je veux essayer d'y accéder à:

http://localhost:80/admin/

J'espérais que le bloc de serveur super simple suivant le ferait, mais ce n'est pas le cas tout à fait:

server {
    listen  80;
    server_name screenly.local.akana.com;

    location /admin/ {
        proxy_pass http://localhost:8080/;
    }
}

Le problème est que le contenu renvoyé (html) contient des URL vers les scripts et des informations de style accessibles au contexte racine, donc j'ai besoin de réécrire ces URL pour commencer par / admin / au lieu de /.

Comment puis-je faire cela dans NGINX?

50
demandé sur Alexis Tyler 2015-09-12 21:30:41

3 réponses

Il existe deux paramètres généraux pour la directive NGINX "proxy_pass" selon qu'une barre oblique finale est présente ou absente:

location /some_dir/ {
    proxy_pass http://some_server/;
}

Ou

location /some_dir/ {
    proxy_pass http://some_server;
}

Avec le premier, une requête de {[3] } sera transmise par procuration à http://some_server/some_subdir/some_file.

Fondamentalement, /some_dir/ est remplacé par / pour changer le chemin de la requête de /some_dir/some_subdir/some_file à /some_subdir/some_file.

Avec la Seconde (pas de barre oblique finale), la même requête sera transmise par procuration à http://some_server/some_dir/some_subdir/some_file.

Fondamentalement, le chemin de requête d'origine complet obtient transmis sans changements.

Donc, dans votre cas, il semble que vous devriez simplement laisser tomber la barre oblique finale pour obtenir ce que vous voulez.

Modifier

En lisant à nouveau votre question, il semble que j'ai peut-être manqué que vous vouliez juste éditer la sortie html.

Pour cela, vous pouvez utiliser la directivesub_filter . Quelque chose comme ...

location /admin/ {
    proxy_pass http://localhost:8080/;
    sub_filter "http://your_server/" "http://your_server/admin/";
    sub_filter_once off;
}

Fondamentalement, la chaîne que vous voulez remplacer et la chaîne de remplacement

69
répondu Dayo 2017-04-08 08:15:49

Vous devrez peut-être également définir la directive suivante avant le premier "sub_filter" pour les serveurs backend avec compression de données:

proxy_set_header Accept-Encoding "";

Sinon cela peut ne pas fonctionner. Pour votre exemple, il ressemblera à:

location /admin/ {
    proxy_pass http://localhost:8080/;
    proxy_set_header Accept-Encoding "";
    sub_filter "http://your_server/" "http://your_server/admin/";
    sub_filter_once off;
}
8
répondu Vladimir Sh. 2017-04-07 01:09:35

Vous pouvez utiliser l'exemple de configuration nginx suivant:

upstream adminhost {
  server adminhostname:8080;
}

server {
  listen 80;

  location ~ ^/admin/(.*)$ {
  proxy_pass http://adminhost/$1$is_args$args;
  proxy_redirect off;
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Host $server_name;
}
0
répondu Alex Elkin 2018-08-07 09:48:18