¿Es posible reemplazar el contenido en cada página pasada a través de un proxy similar a cómo se usa mod_rewrite para las URL?

11

¿Es posible reemplazar el contenido en cada página pasada a través de un proxy similar a cómo se usa mod_rewrite para las URL? La documentación sobre el sustituto no es clara.

Tengo algunas páginas con proxy inverso que tienen rutas absolutas. Esto rompe el sitio. Deben reemplazarse y las herramientas como mod_rewrite no los recogen, ya que no son solicitudes de 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>

Ninguno de los anteriores funciona para reemplazar la cadena HTML

<link href="/server///uat.site.co.jp/css/css.css

con

<link href="/server///uat.site2uk.co.uk/css/css.css

Conf después de los cambios:

<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>
ZZ9
fuente
Estoy confundido. Parece que es de una aetiqueta HTML . Al hacer clic en ese enlace, es probable que el navegador web no siga el enlace, sino que un navegador de archivos (Windows Explorer) intente abrir la UNC. ¿Estás tratando de reemplazar esa cadena en el texto HTML?
GregL
El sitio funciona correctamente. Sin embargo, una vez que lo ponemos detrás de un cortafuegos, por supuesto, obtenemos 404 en un montón de CSS e imágenes. Normalmente todo se pone 200
ZZ9
Son de etiquetas de enlace en un servidor IIS <link href = "// fqdn / asset"
ZZ9
No creo que pueda proporcionar rutas UNC en las linketiquetas. Si puedes, no puedo decir que sería una buena idea ... En cualquier caso, esa no es tu pregunta. Según los documentos de Apache , la substitutedirectiva solo es válida dentro de Directorybloques o .htaccessarchivos. Intente crear un <location>bloque (incluso si es para /) y coloque la directiva allí.
GregL
2
@GregL, este formato de URL es una URL "relativa al protocolo", es una forma perfectamente válida de enlazar a páginas, aunque no se conoce tan comúnmente. "//dominio.com/ruta" hace que el navegador solicite el documento con el mismo protocolo que se utilizó para solicitar la página que contiene el enlace.
Tero Kilkanen

Respuestas:

11

Hay un módulo apache llamado mod_substitute que puede hacer esto. Aquí hay un breve ejemplo:

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

O, cuando se combina con 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"

Hay más información en la documentación de Apache para mod_substitute .

Jenny D
fuente
Hola, gracias por la sugerencia, lamentablemente no he tenido mucha suerte en este camino. Sin embargo, lo he probado con éxito fuera del proxy. Parece que mod_proxy lo ignora.
ZZ9
Agregué más información que puede ser útil.
Jenny D
1
Muchas gracias, esto funciona. Resultó ser un problema técnico con Apache recogiendo copias de seguridad de mis archivos en /etc/httpd/conf.d/ que no terminaban en .conf (vhost.bak).
ZZ9
7

Si no ha reiniciado Apache, asegúrese de hacerlo, pero si ya lo ha hecho, puede probar un filtro de salida global que ejecute un script PHP personalizado para reemplazarlo solo para ver si eso lo resuelve por alguna razón. .

EDITAR: según su comentario, podría ser que el sustituto no funcione porque el contenido está comprimido. Para desactivar la compresión, agregue estas líneas a su VirtualHost:

RequestHeader unset Accept-Encoding
RequestHeader set Accept-Encoding identity

Si eso no funciona, intente lo siguiente:

Agregue estos a su conf, actualizando las rutas, por supuesto:

#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

En proxyfilter.php tenemos un código como el siguiente:

#!/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 esto funciona, entonces limite el enfoque a solo contenido de texto / html como lo ha hecho en su ejemplo.

g491
fuente
Aparece un HTML 200 en la página pero el navegador muestra: Error de codificación de contenido La página que está intentando ver no se puede mostrar porque utiliza una forma de compresión no válida o no compatible.
ZZ9
Ah, agréguelos a su VirtualHost. RequestHeader ha descodificado Accept-Encoding y RequestHeader ha establecido la identidad de Accept-Encoding
g491
Actualicé mi respuesta con algo para tratar de que su línea de sustitución original funcione. Recomiendo probar eso primero, ya que es más simple y puede ser lo que está sucediendo.
g491
Actualice para obtener una excelente respuesta, pero primero obtuve la otra respuesta
ZZ9
1
En mi caso, fue la compresión, lo clavó. Me estaba volviendo loco ... ¡muchas gracias!
Ese chico brasileño