Est-il possible de remplacer le contenu de chaque page passée par un proxy similaire à la façon dont mod_rewrite est utilisé pour les URL? La documentation sur le substitut n'est pas claire.
J'ai des pages dont je suis le proxy inverse qui ont des chemins absolus. Cela brise le site. Ils doivent être remplacés et des outils comme mod_rewrite ne les récupèrent pas car ce ne sont pas des demandes d'URL.
<VirtualHost *:80>
ServerName servername1
ServerAlias servername2
ErrorLog "/var/log/proxy/jpuat_prox_error_log"
CustomLog "/var/log/proxy/jpuat_prox_access_log" common
RewriteEngine on
LogLevel alert rewrite:trace2
RewriteCond %{HTTP_HOST} /uat.site.co.jp$ [NC]
RewriteRule ^(.*)$ http://jp.uat.site2uk.co.uk/$1 [P]
AddOutputFilterByType SUBSTITUTE text/html
Substitute "s|uat.site.co.jp|jp.uat.site2uk.co.uk|i"
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / http://uat.site.co.jp/
ProxyPassReverse / http://uat.site.co.jp/
</VirtualHost>
Aucun des éléments ci-dessus ne fonctionne pour remplacer la chaîne HTML
<link href="/server///uat.site.co.jp/css/css.css
avec
<link href="/server///uat.site2uk.co.uk/css/css.css
Conf après les changements:
<VirtualHost *:80>
ServerName jp.uat.site2uk.co.uk
ServerAlias uat.site.co.jp
ErrorLog "/var/log/proxy/jpuat_prox_error_log"
CustomLog "/var/log/proxy/jpuat_prox_access_log" common
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / http://uat.site.co.jp/
ProxyPassReverse / http://uat.site.co.jp/
AddOutputFilterByType SUBSTITUTE text/html
Substitute "s|uat.site.co.jp|jp.uat.site2uk.co.uk|ni"
</VirtualHost>
a
balise HTML . En cliquant sur ce lien, le navigateur Web ne suivra probablement pas le lien, mais plutôt un navigateur de fichiers (Explorateur Windows) essayant d'ouvrir l'UNC. Essayez-vous de remplacer cette chaîne dans du texte HTML?link
balises. Si vous le pouvez, je ne peux pas dire que ce serait une bonne idée. En tout cas, ce n'est pas votre question. Selon les documents Apache , lasubstitute
directive n'est valide qu'à l'intérieur deDirectory
blocs ou de.htaccess
fichiers. Essayez de créer un<location>
bloc (même si c'est pour /) et mettez la directive dedans.Réponses:
Il existe un module apache appelé mod_substitute qui peut le faire. Voici un petit exemple:
Ou, lorsqu'il est combiné avec mod_proxy:
Il y a plus d'informations dans la documentation Apache pour mod_substitute .
la source
Si vous n'avez pas redémarré Apache, assurez-vous de le faire, mais si vous l'avez déjà fait, vous pouvez essayer un filtre de sortie global qui exécute un script PHP personnalisé pour effectuer votre remplacement juste pour voir si cela le résout pour une raison quelconque. .
EDIT: sur la base de votre commentaire, il se peut que le substitut ne fonctionne pas car le contenu est compressé. Pour désactiver la compression, ajoutez ces lignes à votre VirtualHost:
Si cela ne fonctionne pas, essayez ce qui suit:
Ajoutez-les à votre conf, en mettant à jour les chemins bien sûr:
Dans proxyfilter.php, vous avez du code comme celui-ci:
Si cela fonctionne, réduisez le focus de ceci au contenu texte / html comme vous l'avez fait dans votre exemple.
la source
Selon https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypassreverse qui réécrit les en-têtes, vous utilisez "
la source