web-dev-qa-db-fra.com

Modifier les pages HTML renvoyées par le proxy inverse nginx

J'ai une configuration de proxy inverse pour accéder à une application tierce située dans un intranet à partir d'Internet. Disons que cette application est sur l'URL:

https://internalserver:8080/ (accessible uniquement depuis l'intranet)

et le proxy est sur:

https://proxyserver/ (accessible depuis n'importe quel endroit dans le monde)

Le proxy est géré par nginx et fonctionne correctement. Lorsque l'utilisateur accède à https://proxyserver/ ils obtiennent le contenu de l'application sur https://internalserver:8080/.

Le problème est que l'application écrit des URL absolues dans la réponse HTML, donc lorsque l'utilisateur clique sur un lien vers une nouvelle page, le navigateur essaie de localiser la page avec son nom interne, par ex. https://internalserver:8080/somepage au lieu de https://proxyserver/somepage.

Je sais que c'est un bug de programme, mais je ne suis pas en mesure de modifier le programme.

Puis-je intercepter la réponse, modifier les URL et l'envoyer (modifié) au client final avec nginx? Ou peut-être avec un autre outil?

EDIT: J'ai vu cette question avant, mais mon cas est plus spécifique, la question citée demande une modification générique. Dans ce cas, le programme ad hoc fast-cgi est la meilleure solution, ce que je veux, c'est une solution plus spécifique pour (je pense) un scénario plus courant. alors qu'un programme cgi rapide peut fonctionner, je cherche une solution plus simple et peut-être plus forte et éprouvée dans le monde réel, une solution pour ce scénario.

19
PCJ

Voici une vidéo Nginx officielle sur YouTube qui illustre la réécriture de contenu en ligne.

https://youtu.be/7Y7ORypoHhE?t=20m22s

En effet avec sub_filter

http://nginx.org/en/docs/http/ngx_http_sub_module.html

Dans votre cas, vous regardez quelque chose comme:

location / {
sub_filter_once off;
sub_filter_types text/html;
sub_filter "https://internalserver:8080" "https://proxyserver";
}
18
JayMcTee

http://nginx.org/en/docs/http/ngx_http_sub_module.html

Le module ngx_http_sub_module est un filtre qui modifie une réponse en remplaçant une chaîne spécifiée par une autre.

Ce module n'est pas construit par défaut, il doit être activé avec le paramètre de configuration --with-http_sub_module.

Exemple de configuration

sub_filter      </head>
    '</head><script language="javascript" src="$script"></script>';
3
Voro