É possível substituir o conteúdo de todas as páginas passadas através de um proxy similar a como o mod_rewrite é usado para URLs?

11

É possível substituir o conteúdo em todas as páginas passadas por um proxy semelhante a como o mod_rewrite é usado para URLs? A documentação do substituto não está clara.

Eu tenho algumas páginas que estou fazendo proxy reverso que possuem caminhos absolutos. Isso quebra o site. Eles precisam de substituição e ferramentas como o mod_rewrite não estão pegando-as, pois não são requisições 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>

Nenhum dos itens acima funciona na substituição da string HTML

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

com

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

Conf após alterações:

<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>
    
por AirCombat 21.04.2015 / 16:09

3 respostas

6

Existe um módulo do apache chamado mod_substitute que pode fazer isso. Aqui está um pequeno exemplo:

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

Ou, quando combinado com o 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"

Há mais informações em a documentação do Apache para mod_substitute .

    
por 21.04.2015 / 17:57
5

Se você não tiver reiniciado o Apache, certifique-se de fazer isso, mas se já tiver feito isso, você pode tentar um filtro de saída global que execute um script PHP personalizado para fazer a sua substituição apenas para ver se isso resolve por algum motivo.

EDIT: com base no seu comentário, pode ser que o substituto não esteja funcionando porque o conteúdo está compactado. Para desativar a compactação, adicione essas linhas ao seu VirtualHost:

RequestHeader unset Accept-Encoding
RequestHeader set Accept-Encoding identity

Se isso não funcionar, tente o seguinte:

Adicione-os ao seu conf, atualizando os caminhos do curso:

#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

No proxyfilter.php tem algum código como o seguinte:

#!/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 isso funcionar, reduza o foco apenas para o conteúdo text / html, como no exemplo.

    
por 21.04.2015 / 17:46
0

De acordo com o link que reescreve os cabeçalhos, você usa "

To rewrite HTML content to match the proxy, you must load and enable mod_proxy_html.

    
por 27.04.2017 / 03:22