Forum Linux.général apache proxy_html et .js

Posté par  . Licence CC By‑SA.
Étiquettes :
0
5
jan.
2013

Bonjour,

J'ai un souci avec la conf d'un proxy apache.

Sur un serveur de mon réseau local je souhaite faire un proxy vers ma freebox
en gros j'ai 2 machine:
192.168.0.1 : le proxy
192.168.0.254 : la box

Le but et de rediriger : http://192.168.0.1/freebox/ vers http://192.168.0.254/

La conf simple avec Proxypass et Proxypassreverse fonctionne bien mais le truc c'est que dans les page HTML et aussi le .js et .css certaines images ont le src sous la forme /im/lechemin/image.png au lieu de im/lechemin/image.png .
Du coup le navigateur va chercher l'image dans http://192.168.0.1/im/lechemin/ au lieu de http://192.168.0.1/freebox/im/lechemin/
J'ai résolut la partie HTML avec la directive ProxyHTMLURLMap / /freebox/
Cela a pour effet de modifier l'HTML a la volée en changeant les liens mais cela n'a aucun effet sur le .js et les .css

Pour les .js (notamment celui qui gère les checkbock), j'ai essayé les directives ProxyHTMLMeta On et ProxyHTMLExtended On sans succès.
Si quelqu'un sait comment on peut faire pour résoudre ce point (si c'est possible) l'idéale serai d'éviter les rewrites car ca m'empêcherai d'avoir un vrai dossier http://192.168.0.1/im/ (même si j'en aurai surement jamais mais j'essaye de faire les choses bien sans bidouillage tant que c'est possible).

voici ma conf :

    <VirtualHost *:80>

        ProxyPreserveHost on
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined


        <Location /freebox/ >
                #config de la redirection
                ProxyPass http://192.168.0.254/
                ProxyPassReverse /
                #activation de la modification des pages HTML (pour les images qui sont dans /img )
                SetOutputFilter proxy-html
                ProxyHTMLInterp On
                #definition de ce qu'il faut modifier dans les pages html
                ProxyHTMLURLMap / /freebox/
                 #on modifie aussi dans le head (aucun effet sur les .js)
                ProxyHTMLMeta On
                #on modifie aussi le javascript et les style (aucun effet sur les .js )
                ProxyHTMLExtended On
        </Location>

    </VirtualHost>

Merci d'avance.

  • # erreur dans la config ?

    Posté par  . Évalué à 1.

    d'apres ton fichier

    ProxyPass http://192.168.0.254/
    ProxyPassReverse /
    
    

    mais d'apres l'exemple fournit dans la doc http://httpd.apache.org/docs/2.2/mod/mod_proxy.html

    #Reverse Proxy
    ProxyPass /foo http://foo.example.com/bar
    ProxyPassReverse /foo http://foo.example.com/bar
    
    

    donc il faudrait peut-etre faire plus simple dans ton virtualhost :
    1°) virer tout le paragraphe location /freebox
    2°) et ne mettre que la directive proxy suivante

    ProxyPass /freebox http://192.168.0.254
    ProxyPassReverse /freebox http://192.168.0.254
    
    

    A verifier aussi, tu as une option "Proxy Preserve host ON" dans ton fichier

    • [^] # Re: erreur dans la config ?

      Posté par  . Évalué à 1. Dernière modification le 05/01/13 à 11:52.

      Pour le Proxy Preservehost ON c'est un oubli d'un test que j'avais fais,je l'ai viré et ca ne change rien.

      donc il faudrait peut-etre faire plus simple dans ton virtualhost :
      1°) virer tout le paragraphe location /freebox
      2°) et ne mettre que la directive proxy suivante

      De ce que j'ai compris la façon de faire que tu propose équivaut a la ce que j'ai écrit sauf qu'elle n'est pas dans un bloc location et elle s'applique donc a tout le virtualhost.
      mais dans le doute j'avais déjà testé et ca ne change rien.

      Mon problème ce n'est pas les directives proxypass , cela fonctionne très bien. C'est que la directive ProxyHTMLURLMap / /freebox/ ne transforme que le code HTML et mon problème avec les URL commençant par / se trouve également dans les .js et ceux-ci ne sont pas modifiés.

  • # autre question

    Posté par  . Évalué à 2.

    j'ai l'impression que tu essaie de rebondir de l'exterieur vers ta box apres une redirection de port.

    si ce n'est pas le cas et juste parce que tu as un proxy sur ton reseau, tu dois pouvoir lui dire de ne pas passer par le proxy pour 192.168.0.254

    ainsi ton poste client demandant 192.168.0.254 sera directement envoyé sur cette IP

    • [^] # Re: autre question

      Posté par  . Évalué à 1.

      j'ai l'impression que tu essaie de rebondir de l'exterieur vers ta box apres une redirection de port.

      Effectivement le but est que cela fonctionne aussi depuis l’extérieur.
      Je sais que je pourrai activer l’accès de la box depuis l’extérieur mais je fais clairement ca plus pour l'exercice que pour avoir une vrai utilité.
      A part n'avoir qu'une adresse à retenir et juste changer de dossier sans changer de port (un dossier c'est plus parlant) pour accéder aux différents serveurs on est d'accord ca ne sert a rien.

      Merci quand même d'avoir apporté une réponse.

  • # j'ai trouvé

    Posté par  . Évalué à 2.

    Je viens de trouver une solution pas trop mal.

    je vous explique:
    En cherchant sur le net j'ai finis par trouver 2 choses :
    - Le mod proxy_html ne peux pas modifier les .js ni les .css .
    - Le mod Apache2::ModProxyPerlHtml (module perl qu'on utilse via le mod perl d'apache) peu le faire.

    J'ai donc installer le mod perl pour appache puis Apache2::ModProxyPerlHtml via CPAN.

    Enfin j'ai modifier ma config comme ci dessous :

    <Location /freebox/ >
    
                #config de la redirection
                ProxyPass http://192.168.0.254/
                ProxyPassReverse /
    
    
                PerlInputFilterHandler Apache2::ModProxyPerlHtml
                PerlOutputFilterHandler Apache2::ModProxyPerlHtml
                SetHandler perl-script
                PerlAddVar ProxyHTMLURLMap "/im /freebox/im"
        </Location>
    
    

    le reste du fichier ne change pas et est identique au fichier de conf d'une installation d'apache vierge.

    Vous remarquerez la directive PerlAddVar ProxyHTMLURLMap "/im /freebox/im" contient le/im et pas uniquement le / j'ai du mettre me limiter à /im car si je ne mettais que PerlAddVar ProxyHTMLURLMap "/ /freebox/" j'avais des / dans du code javascript qui étaient remplacés par /freebox/ et du coup le javascript plantait.

    Voilà, je remercie de m'avoir aidé.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n’en sommes pas responsables.