6 votes

Comment configurer mod_proxy_html d'apache pour fonctionner comme un proxy ajax?

Je cherche à construire un site web qui vous permet de visualiser et de manipuler des données de n'importe quelle page de n'importe quel autre site web. Pour ce faire, je dois contourner les problèmes de 'Allow Origin' : je charge le contenu du domaine source dans un iframe et je dois manipuler son contenu avec du javascript téléchargé depuis mon domaine.

Ma première tentative a été d'écrire un simple proxy moi-même, demandant la page des autres domaines via un serveur proxy codé en Java qui non seulement sert le contenu mais reconstruit les liens (src et href) dans le contenu de sorte que le contenu référencé par ces liens soit également téléchargé à travers mon proxy artisanal. Le résultat n'est pas mal mais a des problèmes avec les URL dans les feuilles de style et les scripts.

C'est alors que j'ai réalisé que mod_proxy_html est censé faire exactement tout ce travail. Le problème est que je ne peux pas comprendre comment le faire fonctionner comme prévu.

Supposons que mon serveur tourne sur my-domain.com et pour proxifier et transformer le contenu d'un autre domaine, je ferais une requête comme ceci :

my-domain.com/proxy?url=http://another-domain.com/some/content

Je voudrais que mod_proxy_html serve le contenu et réécrive les URL suivantes dans http://another-domain.com/some/content de la manière suivante :

  1. Les URL absolues ne provenant pas de another-domain.com : pas de rewriting
  2. URLs relatives à la racine : /other/content -> /proxy?url=http://another-domain.com/other/content
  3. URLs relatives : other/content -> /proxy?url=http://another-domain.com/some/content/other/content
  4. URLs relatives aux parents : ../other/content -> /proxy?url=http://another-domain.com/some/other/content

L'URL devrait être spécifiée au moment de l'exécution, pas au moment de la configuration.

Est-ce possible avec mod_proxy_html ? Quelqu'un pourrait-il fournir une configuration de travail simple pour commencer ?

EDIT 1-Première approche

La configuration de site suivante fonctionnera bien avec des sites qui utilisent des URL absolues partout comme http://www.huffingtonpost.es/. Vous pouvez essayer cette config en localhost : http://localhost/asset/http://www.huffingtonpost.es/

    ServerName localhost

    LogLevel debug

    ProxyRequests off
    RewriteEngine On
    RewriteRule ^/asset/(.*) $1 [P]
    ProxyHTMLURLMap $1 /asset/

            ProxyPassReverse /
        ProxyHTMLURLMap / /asset/

Mais comme expliqué dans la documentation, si je tombe sur un site utilisant des URL relatives, j'aimerais que ceux-ci soient réécrits dans le html via mod_proxy_html. Donc je devrais changer le bloc Location comme suit :

            ProxyPassReverse /

            #En fonction de votre système, utilisez une ligne ou une autre
            #Ubuntu :
            #SetOutputFilter proxy-html
            #tout autre système :
            ProxyHTMLEnable On 

        ProxyHTMLURLMap / /asset/

...ce qui ne semble pas fonctionner. Commentaires, conseils et idées les bienvenus !

2voto

Jenny D Points 26978

Voici une réflexion sur la façon de faire cela - c'est un peu plus complexe à configurer, mais je pense que ce serait sécurisé. Je ne peux actuellement pas tester cela car je n'arrive pas à accéder à mon serveur de test, mais c'est un début.

Le principal problème est que si vous configurez simplement un ProxyPassReverse, vous devez également spécifier vers quels serveurs vous vous connectez. Comme vous voulez pouvoir utiliser cela sur plusieurs serveurs, cela serait un peu pénible, pour le dire gentiment. Donc voici une approche en deux étapes pour contourner proprement ce problème.

Premièrement, configurez une instance Apache distincte pour écouter uniquement sur 127.0.0.1 et un port spécifique - j'ai choisi le port 2323 dans mon exemple. Cette instance doit être configurée comme un serveur proxy simple et ne doit pas effectuer de réécriture. Exemple :

   Order Deny,Allow
   Deny from all
   Allow from 127.0.0.1

Sur votre serveur principal, configurez un proxy inverse, quelque chose comme ceci :

    ProxyPass http://127.0.0.1:2323
    ProxyPreserveHost On
    ProxyHtmlEnable ON
    ProxyHtmlMap / /proxy/

Cela signifie que la mise en proxy réelle fonctionne comme un proxy régulier, tandis que la réécriture se fait dans la même instance Apache où le script s'exécute. Encore une fois, notez que ceci n'est pas testé, mais je pense que c'est la bonne direction pour commencer à chercher.

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