web-dev-qa-db-fra.com

Comment gérer correctement les URL relatives avec un proxy inverse

J'ai une configuration de proxy inverse comme suit dans Apache:

Le serveur A avec l'adresse www.example.com/folder est le serveur proxy inverse.

Il est mappé sur: le serveur B avec l'adresse test.madeupurl.com

Ce genre de travaux. Mais le problème que j'ai est, sur www.example.com/folder, tous les liens relatifs sont des formes www.example.com/css/examplefilename.css plutôt que www.example.com/folder/css/examplefilename. css

Comment puis-je réparer ça?

Jusqu'à présent, mon proxy inverse a ceci sur le serveur A (www.example.com):

<Location /folder>
    ProxyPass  http://test.madeupurl.com
    ProxyPassReverse http://test.madeupurl.com
</Location>
56
Hard worker

Apache ProxyPassRewrite ne réécrit pas les corps de réponse reçus de http://test.example.com , uniquement les en-têtes (comme les redirections vers une page 404 et autres).

Un certain nombre d'alternatives:

Un ) Réécrivez l'application interne pour utiliser des chemins relatifs au lieu d'absolu. c'est à dire. ../css/style.css au lieu de /css/style.css

Deux ) Redéployez l'application interne dans le même sous-répertoire /folder plutôt qu'à la racine de test.example.com.

Trois ) Il est souvent peu probable qu'un et deux se produisent ... Si vous êtes chanceux, l'application interne n'utilise que deux ou trois sous-répertoires et ceux-ci ne sont pas utilisés sur votre site principal, écrivez simplement un tas de lignes ProxyPass:

# Expose Internal App to the internet.
ProxyPass /externalpath/  http://test.example.com/
ProxyPassReverse /externalpath/  http://test.example.com/
# Internal app uses a bunch of absolute paths. 
ProxyPass /css/  http://test.example.com/css/
ProxyPassReverse /css/  http://test.example.com/css/
ProxyPass /icons/  http://test.example.com/icons/
ProxyPassReverse /icons/  http://test.example.com/icons/

Quatre ) Créez un sous-domaine distinct pour l'application interne et inversez simplement tout le proxy:

<VirtualHost *:80>
   ServerName app.example.com/
   # Expose Internal App to the internet.
   ProxyPass /  http://test.internal.example.com/
   ProxyPassReverse /  http://test.internal.example.com/
</VirtualHost>

Cinq ) Parfois, les développeurs sont complètement désemparés et avoir leurs applications non seulement générer des URL absolues, mais même inclure la partie du nom d'hôte dans leurs URL et le code HTML résultant ressemble à ceci: <img src=http://test.example.com/icons/logo.png>.

[~ # ~] a [~ # ~] ) Vous pouvez utiliser la solution combinée d'un DNS et d'un scénario à horizon divisé 4. Les utilisateurs internes et externes utilisent le test.example.com, mais votre DNS interne pointe directement vers l'adresse IP du serveur de test.example.com. Pour les utilisateurs externes, l'enregistrement public de test.example.com pointe vers l'adresse IP de votre serveur Web public www.example.com et vous pouvez ensuite utiliser la solution 4.

[~ # ~] b [~ # ~] ) En fait, vous pouvez amener Apache à non seulement les requêtes proxy de test.example.com, mais aussi réécrivez le corps de la réponse avant qu'il ne soit transmis à vos utilisateurs. (Normalement, un proxy réécrit uniquement les en-têtes/réponses HTTP). mod_substitute dans Apache 2.2. Je n'ai pas testé s'il fonctionne bien avec mod_proxy, mais peut-être que cela fonctionne:

<Location /folder/>
  ProxyPass http://test.example.com/
  ProxyPassReverse http://test.example.com/ 
  AddOutputFilterByType SUBSTITUTE text/html
  Substitute "s|test.example.com/|www.example.com/folder/|i" 
</Location>
86
HBruijn

En complément de la réponse de HBruijn , si vous optez pour la solution (3) "ProxyPass", vous devrez peut-être utilisez également mod_proxy_html pour réécrire certaines URL dans vos pages HTML.

cf. Comment gérer correctement les URL relatives avec un proxy inverse pour quelques exemples.

Comme exemple appliqué, voici comment vous pouvez configurer Apache en utilisant la règle ProxyHTMLURLMap pour tout transférer sur votre-nom-domaine.com/pad vers votre - Etherpad instance exécutée localement sur le port 9001:

<Location /pad> ProxyPass http://localhost:9001 retry=0 # retry=0 => avoid 503's when restarting etherpad-lite ProxyPassReverse http://localhost:9001 SetOutputFilter proxy-html ProxyHTMLURLMap http://localhost:9001 </Location> RewriteRule ^/pad$ /pad/ [R]

9
Lucas Cimon

Vous pouvez utiliser la méthode suivante pour créer un proxy inverse:
1. Installez mod_proxy_html

    yum install mod_proxy_html
  1. Charger le module mod_proxy_html

    LoadModule proxy_html_module modules/mod_proxy_html.so
    
  2. Et utilisez le paramètre suivant

    ProxyRequests off  
    ProxyPass /folder/  http://test.madeupurl.com  
    ProxyHTMLURLMap http://test.madeupurl.com  /folder  
    
    <Location /folder/>  
        ProxyPassReverse /  
        ProxyHTMLEnable On  
        ProxyHTMLURLMap  /  /folder/  
        RequestHeader    unset  Accept-Encoding  
    </Location>  
    

J'espère que cette aide.

5
ThanhHH