Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

nginx (ou éventuellement apache), réécrire le contenu html des pages via une petite regex

3 réponses
Avatar
Francois Lafont
Bonjour à tous,

J'ai un serveur web qui me renvoie des pages html. Le souci, c'est que
ce serveur web est derrière un proxy nginx que j'atteins via l'adresse
http://mon-proxy.fr/shinken/. Or, le serveur web me renvoie un contenu
html qui fonctionne bien uniquement quand on l'appelle via une url qui
s'arrête à http://mon-proxy.fr/ mais avec l'adresse
http://mon-proxy.fr/shinken/, le contenu html n'est plus adapté et en
gros mon serveur web est inutilisable ainsi (les css ne sont pas chargées
et j'en passe).

Le fait est que je souhaiterais garder l'url http://mon-proxy.fr/shinken/
pour consulter mon serveur web. Il faut donc que le proxy nginx modifie
le contenu html avant de l'envoyer au client web. La modification est assez
simple d'ailleurs et peut se résumer ni plus ni moins à :

echo "le contenu html..." | sed -e 's;="/;="/shinken/;g' -e "s;='/;='/shinken/;g"

Sur le serveur nginx, il y a le module "http_sub_module" qui peut faire
ce genre de chose mais malheureusement il n'accepte pas les regexs. En gros,
je peux changer une chaîne par une autre et basta. Par exemple :

server {
listen 80; ## listen for ipv4
server_name www.mon-serveur-web.fr;
access_log /var/log/nginx/localhost.access.log;

location / {
root /var/www;
index index.html index.htm;
sub_filter =\"/ =\"/shinken/;
sub_filter_once off;
}
}

Mais pas de regex possible.

Apparemment il y a aussi le module "nginx_substitutions_filter"
(http://wiki.nginx.org/NginxHttpSubsModule) qui lui accepte les regexs etc.
mais ce n'est pas un module natif de nginx et il faut recompiler nginx
pour inclure ce module ce qui est un peu lourd.

Est-ce qu'il n'y aurait pas la possibilité toute simple de demander
à nginx de passer le contenu html en entrée d'un simple script shell
(qui contiendrait à peu de chose près la commande sed donnée plus haut)
et de renvoyer au client Web la sortie de ce script ?
Je précise que je me moque complètement de l'aspect performance ici.
C'est un pour site web limité à usage interne très léger (alors s'il
faut appeler un script shell à chaque requête ce n'est pas grave).

Enfin, à la base le proxy est nginx mais s'il y a un moyen simple
de faire ce que je veux avec Apache, alors je suis preneur aussi.
Dans les deux cas (apache/nginx), je n'ai pas réussi à trouver
comment faire cela.

Merci d'avance pour votre aide.

--
François Lafont

3 réponses

Avatar
Nicolas George
Francois Lafont , dans le message
<5238dc90$0$2113$, a écrit :
Le fait est que je souhaiterais garder l'url http://mon-proxy.fr/shinken/
pour consulter mon serveur web. Il faut donc que le proxy nginx modifie
le contenu html avant de l'envoyer au client web. La modification est assez
simple d'ailleurs et peut se résumer ni plus ni moins à :

echo "le contenu html..." | sed -e 's;="/;="/shinken/;g' -e "s;='/;='/shinken/;g"



Beurk ! Il vaudrait largement mieux te débrouiller pour n'utiliser que des
liens relatifs dans ton HTML.
Avatar
Francois Lafont
Le 18/09/2013 07:51, Nicolas George a écrit :

echo "le contenu html..." | sed -e 's;="/;="/shinken/;g' -e "s;='/;='/shinken/;g"



Beurk ! Il vaudrait largement mieux te débrouiller pour n'utiliser que des
liens relatifs dans ton HTML.



Je suis d'accord. Au niveau de la regex, ça serait mieux de transformer les
liens en des liens relatifs effectivement. En revanche, impossible pour moi
de faire en sorte que le serveur Web derrière le proxy envoie directement
des liens relatifs. C'est un serveur Web en Python et, hélas, il n'a pas
été prévu pour modifier la racine des liens HTML générés.


--
François Lafont
Avatar
Doug713705
Le 17-09-2013, Francois Lafont nous expliquait dans
fr.comp.os.linux.configuration :
Bonjour à tous,

J'ai un serveur web qui me renvoie des pages html. Le souci, c'est que
ce serveur web est derrière un proxy nginx que j'atteins via l'adresse
http://mon-proxy.fr/shinken/. Or, le serveur web me renvoie un contenu
html qui fonctionne bien uniquement quand on l'appelle via une url qui
s'arrête à http://mon-proxy.fr/ mais avec l'adresse
http://mon-proxy.fr/shinken/, le contenu html n'est plus adapté et en
gros mon serveur web est inutilisable ainsi (les css ne sont pas chargées
et j'en passe).

Le fait est que je souhaiterais garder l'url http://mon-proxy.fr/shinken/
pour consulter mon serveur web. Il faut donc que le proxy nginx modifie
le contenu html avant de l'envoyer au client web. La modification est assez
simple d'ailleurs et peut se résumer ni plus ni moins à :

echo "le contenu html..." | sed -e 's;="/;="/shinken/;g' -e "s;='/;='/shinken/;g"

Sur le serveur nginx, il y a le module "http_sub_module" qui peut faire
ce genre de chose mais malheureusement il n'accepte pas les regexs. En gros,
je peux changer une chaîne par une autre et basta. Par exemple :

server {
listen 80; ## listen for ipv4
server_name www.mon-serveur-web.fr;
access_log /var/log/nginx/localhost.access.log;

location / {
root /var/www;
index index.html index.htm;
sub_filter ="/ ="/shinken/;
sub_filter_once off;
}
}

Mais pas de regex possible.

Apparemment il y a aussi le module "nginx_substitutions_filter"
(http://wiki.nginx.org/NginxHttpSubsModule) qui lui accepte les regexs etc.
mais ce n'est pas un module natif de nginx et il faut recompiler nginx
pour inclure ce module ce qui est un peu lourd.

Est-ce qu'il n'y aurait pas la possibilité toute simple de demander
à nginx de passer le contenu html en entrée d'un simple script shell
(qui contiendrait à peu de chose près la commande sed donnée plus haut)
et de renvoyer au client Web la sortie de ce script ?
Je précise que je me moque complètement de l'aspect performance ici.
C'est un pour site web limité à usage interne très léger (alors s'il
faut appeler un script shell à chaque requête ce n'est pas grave).

Enfin, à la base le proxy est nginx mais s'il y a un moyen simple
de faire ce que je veux avec Apache, alors je suis preneur aussi.
Dans les deux cas (apache/nginx), je n'ai pas réussi à trouver
comment faire cela.

Merci d'avance pour votre aide.




Il me semble que mod_rewrite d'Apache correspond à ce que tu cherches :
https://httpd.apache.org/docs/2.2/rewrite/

Je place un suivi vers le groupe adapté à la suite de la discussion.

XP+FU2 fr.comp.infosystemes.www.serveurs

--
Doug - Linux user #307925 - Slackware64 roulaize ;-)
Without freedom of choice there is no creativity.
-- Kirk, "The return of the Archons", stardate 3157.4