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>
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>
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]
Vous pouvez utiliser la méthode suivante pour créer un proxy inverse:
1. Installez mod_proxy_html
yum install mod_proxy_html
Charger le module mod_proxy_html
LoadModule proxy_html_module modules/mod_proxy_html.so
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.