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?


11

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>

Je suis confus. Cela ressemble à une abalise 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?
GregL

Leur site fonctionne correctement. Cependant, une fois que nous l'avons mis derrière un pare-feu, nous obtenons bien sûr 404 sur un tas de CSS et d'images. Normalement, tout est 200
ZZ9

Ils proviennent de balises de lien sur un serveur IIS <link href = "// fqdn / asset"
ZZ9

Je ne pense pas que vous puissiez fournir des chemins UNC dans les linkbalises. 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 , la substitutedirective n'est valide qu'à l'intérieur de Directoryblocs ou de .htaccessfichiers. Essayez de créer un <location>bloc (même si c'est pour /) et mettez la directive dedans.
GregL

2
@GregL, ce format d'URL est une URL "relative au protocole", c'est un moyen parfaitement valide de créer un lien vers des pages, bien qu'il ne soit pas communément connu. "//domain.com/path" oblige le navigateur à demander le document avec le même protocole que celui utilisé pour demander la page contenant le lien.
Tero Kilkanen

Réponses:


11

Il existe un module apache appelé mod_substitute qui peut le faire. Voici un petit exemple:

<Location "/">
    AddOutputFilterByType SUBSTITUTE text/html
    Substitute "s/uat.site.co.jp/jp.uat.site2uk.co.uk/ni"
</Location>

Ou, lorsqu'il est combiné avec mod_proxy:

ProxyPass / http://uat.site.co.jp/
ProxyPassReverse / http://uat.site.co.jp/

Substitute "s|http://uat.site.co.jp/|http://jp.uat.site2uk.co.uk/|i"

Il y a plus d'informations dans la documentation Apache pour mod_substitute .


Salut, merci pour la suggestion, malheureusement je n'ai pas eu beaucoup de chance sur ce chemin. Je l'ai testé avec succès en dehors du proxy. Il semble que mod_proxy l'ignore.
ZZ9

J'ai ajouté quelques informations supplémentaires qui pourraient être utiles.
Jenny D

1
Merci beaucoup, cela fonctionne. Il s'est avéré être un problème avec Apache récupérant des sauvegardes de mes fichiers dans /etc/httpd/conf.d/ qui ne se sont pas terminées par .conf (vhost.bak).
ZZ9

7

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:

RequestHeader unset Accept-Encoding
RequestHeader set Accept-Encoding identity

Si cela ne fonctionne pas, essayez ce qui suit:

Ajoutez-les à votre conf, en mettant à jour les chemins bien sûr:

#add this outside of any VirtualHost tags
ExtFilterDefine proxiedcontentfilter mode=output cmd="/usr/bin/php /var/www/proxyfilter.php"

#add these in your VirtualHost tag
RequestHeader unset Accept-Encoding 
RequestHeader set Accept-Encoding identity
SetOutputFilter proxiedcontentfilter

Dans proxyfilter.php, vous avez du code comme celui-ci:

#!/usr/bin/php
<?php
$html = file_get_contents('php://stdin');
$html = str_ireplace('uat.site.co.jp', 'jp.uat.site2uk.co.uk', $html);
file_put_contents('php://stdout', $html);

Si cela fonctionne, réduisez le focus de ceci au contenu texte / html comme vous l'avez fait dans votre exemple.


J'obtiens un HTML 200 sur la page mais le navigateur affiche: Erreur d'encodage de contenu La page que vous essayez d'afficher ne peut pas être affichée car elle utilise une forme de compression non valide ou non prise en charge.
ZZ9

Ah, ajoutez-les à votre VirtualHost. RequestHeader désactive Accept-Encoding et RequestHeader définit l'identité Accept-Encoding
g491

J'ai mis à jour ma réponse avec quelque chose pour essayer de faire fonctionner votre ligne de remplacement d'origine. Je recommanderais d'essayer d'abord car c'est plus simple à essayer et c'est peut-être ce qui se passe.
g491

Mise à jour pour une excellente réponse, mais j'ai obtenu l'autre réponse qui fonctionne en premier
ZZ9

1
Dans mon cas, c'était la compression, ça clouait. Cela me rendait fou ... merci beaucoup!
Ce brésilien Guy

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.