É possível substituir o conteúdo de todas as páginas passadas por um proxy semelhante ao modo como o mod_rewrite é usado para URLs?


11

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

Eu tenho algumas páginas, sou proxy reverso que possui caminhos absolutos. Isso quebra o site. Eles precisam ser substituídos e ferramentas como mod_rewrite não as estão coletando, pois não são solicitaçõ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>

Nenhuma das opções acima funciona na substituição da string HTML

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

com

<link href="/server///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>

Estou confuso. Parece que é de uma atag HTML . Clicar nesse link provavelmente não resultará no navegador da Web seguindo o link, mas em um navegador de arquivos (Windows Explorer) tentando abrir o UNC. Você está tentando substituir essa string no texto HTML?
GregL

Eles site funciona corretamente. No entanto, uma vez que o colocamos atrás de um firewall, é claro que obtemos 404s em um monte de css e imagens. Normalmente tudo fica 200
ZZ9 21/04/2015

Eles são de tags de link em um servidor IIS <link href = "// fqdn / asset"
ZZ9 21Z15

Eu não acho que você pode fornecer caminhos UNC em linktags. Se puder, não posso dizer que seria uma boa ideia. De qualquer forma, essa não é sua pergunta. De acordo com os documentos do Apache , a substitutediretiva é válida apenas dentro de Directoryblocos ou .htaccessarquivos. Tente criar um <location>bloco (mesmo que seja para /) e coloque a diretiva lá.
GregL

2
@ Gregreg, esse formato de URL é um URL "relativo ao protocolo", é uma maneira perfeitamente válida de vincular a páginas, embora não seja tão conhecido. "//domínio.com/caminho" faz com que o navegador solicite o documento com o mesmo protocolo usado para solicitar a página que contém o link.
Tero Kilkanen

Respostas:


11

Há um módulo 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 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 na documentação do Apache para mod_substitute .


Olá, obrigado pela sugestão, infelizmente não tive muita sorte nesse caminho. Eu o testei fora do proxy com sucesso. Parece que mod_proxy o ignora.
ZZ9

Eu adicionei mais algumas informações que podem ser úteis.
21715 Jenny D

1
Muito obrigado, isso funciona. Acabou sendo uma falha com o Apache pegando backups dos meus arquivos em /etc/httpd/conf.d/ que não terminavam em .conf (vhost.bak).
ZZ9

7

Se você não reiniciou o Apache, certifique-se de fazer isso, mas se já o fez, tente um filtro de saída global que execute um script PHP personalizado para fazer sua substituição apenas para ver se isso o 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 à sua conf, atualizando os caminhos, é claro:

#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, tenha um 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 para apenas o conteúdo de texto / html, como no exemplo.


Recebo um HTML 200 na página, mas o navegador mostra: Erro de codificação de conteúdo A página que você está tentando visualizar não pode ser exibida porque usa uma forma de compactação inválida ou não suportada.
ZZ9

Ah, adicione-os ao seu VirtualHost. RequestHeader UNSET Accept-Encoding e conjunto também RequestHeader Accept-Encoding identidade
g491

Atualizei minha resposta com algo para tentar colocar sua linha de substituto original em funcionamento. Eu recomendo tentar isso primeiro, pois é mais simples e pode ser o que está acontecendo.
G491

Atualização para uma grande resposta, mas eu tenho a outra resposta trabalhando primeiro
ZZ9

1
No meu caso, foi a compressão, acertou em cheio. Isso estava me deixando louco ... muito obrigado!
Aquele cara brasileiro

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.