È possibile sostituire il contenuto di ogni pagina passata attraverso un proxy simile a come viene utilizzato mod_rewrite per gli URL?


11

È possibile sostituire il contenuto di ogni pagina passata attraverso un proxy simile a come viene utilizzato mod_rewrite per gli URL? La documentazione relativa al sostituto non è chiara.

Ho alcune pagine che sto inviando il proxy che hanno percorsi assoluti. Questo rompe il sito. Devono essere sostituiti e strumenti come mod_rewrite non li stanno raccogliendo in quanto non sono richieste 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>

Nessuna delle precedenti funzioni funziona in sostituzione della stringa HTML

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

con

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

Conf dopo le modifiche:

<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>

Non ho capito bene. Sembra che provenga da un atag HTML . Facendo clic su quel collegamento, probabilmente il browser Web non seguirà il collegamento, ma piuttosto un browser di file (Esplora risorse) che tenta di aprire UNC. Stai cercando di sostituire quella stringa nel testo HTML?
GregL

Loro sito funziona correttamente. Tuttavia, una volta messo dietro un firewall, ovviamente riceviamo 404s su un mucchio di css e immagini. Normalmente tutto diventa 200
ZZ9

Provengono da tag di collegamento su un server IIS <link href = "// fqdn / asset"
ZZ9

Non credo che tu possa fornire percorsi UNC nei linktag. Se puoi, non posso dire che sarebbe una buona idea .. In ogni caso, questa non è la tua domanda. Secondo i documenti di Apache , la substitutedirettiva è valida solo all'interno di Directoryblocchi o .htaccessfile. Prova a creare un <location>blocco (anche se è per /) e inserisci la direttiva.
GregL

2
@GregL, questo formato di URL è un URL "relativo al protocollo", è un modo perfettamente valido per collegarsi alle pagine, anche se non è così comunemente noto. "//domain.com/path" consente al browser di richiedere il documento con lo stesso protocollo utilizzato per richiedere la pagina contenente il collegamento.
Tero Kilkanen,

Risposte:


11

C'è un modulo apache chiamato mod_substitute che può fare questo. Ecco un breve esempio:

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

Oppure, se combinato 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"

Ulteriori informazioni sono disponibili nella documentazione di Apache per mod_substitute .


Ciao, grazie per il suggerimento, purtroppo non ho avuto molta fortuna in questo percorso. L'ho provato con successo al di fuori del proxy. Sembra che mod_proxy lo ignori.
ZZ9,

Ho aggiunto alcune informazioni aggiuntive che potrebbero essere utili.
Jenny D,

1
Grazie mille, funziona. Si è rivelato un problema tecnico con Apache che raccoglieva i backup dei miei file in /etc/httpd/conf.d/ che non terminavano in .conf (vhost.bak).
ZZ9,

7

Se non hai riavviato Apache, assicurati di farlo, ma se lo hai già fatto, potresti provare un filtro di output globale che esegue uno script PHP personalizzato per fare la tua sostituzione solo per vedere se questo lo risolve per qualche motivo .

EDIT: in base al tuo commento, potrebbe essere che il sostituto non funzioni perché il contenuto è compresso. Per disattivare la compressione, aggiungi queste righe a VirtualHost:

RequestHeader unset Accept-Encoding
RequestHeader set Accept-Encoding identity

Se il problema persiste, provare quanto segue:

Aggiungi questi al tuo conf, aggiornando i percorsi ovviamente:

#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

In proxyfilter.php hanno un codice simile al seguente:

#!/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);

Se funziona, restringi il focus di questo al solo contenuto text / html come nel tuo esempio.


Ottengo un HTML 200 sulla pagina ma il browser mostra: Errore di codifica del contenuto Impossibile visualizzare la pagina che si sta tentando di visualizzare perché utilizza una forma di compressione non valida o non supportata.
ZZ9,

Ah, aggiungili al tuo VirtualHost. RequestHeader unset Accept-Encoding e RequestHeader hanno impostato l'identità Accept-Encoding
g491

Ho aggiornato la mia risposta con qualcosa per provare a far funzionare la tua linea sostitutiva originale. Consiglio di provarlo prima perché è più semplice da provare e potrebbe essere quello che sta succedendo.
g491,

Aggiornamento per un'ottima risposta, ma ho ottenuto l'altra risposta funzionante prima
ZZ9

1
Nel mio caso, è stata la compressione, inchiodata. Mi stava facendo impazzire ... grazie mille!
Quel ragazzo brasiliano, il

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.