Como injetar código HTML em todas as páginas HTML entregues?

23

Eu tenho um Apache web serverque fornece páginas HTML estáticas. Por alguma razão, não consigo alterar os arquivos, mas ainda quero injetar um pouco de HTML em todas as páginas que estão sendo veiculadas.

Isso é possível com mod_proxy? Caso contrário, alguém poderia recomendar um software que ofereça esse recurso?

EDIT: Eu tenho que inserir algum tipo de banner (por exemplo, a javascript) e um pixel de rastreamento.


fonte

Respostas:

18

Você pode fazer o seguinte: Trabalhe com mod_rewrite para alterar solicitações de

/some/static/page.html

para

/htmlinjector.php?url=/some/static/page.html

então use PHP (ou o que achar apropriado) para fazer a manipulação de arquivos. Adicione um cache de saída para melhorar o desempenho.

Como alternativa, os Apache Handlers parecem úteis:

Modificando conteúdo estático usando um script CGI

As diretivas a seguir farão com que solicitações de arquivos com a html extensão disparem o lançamento do footer.plscript CGI.

Action add-footer /cgi-bin/footer.pl
AddHandler add-footer .html

Em seguida, o script CGI é responsável por enviar o documento originalmente solicitado (apontado pela PATH_TRANSLATEDvariável de ambiente) e fazer as modificações ou acréscimos desejados.

Isso é mais ou menos o que a abordagem mod_rewrite faria, apenas com menos invasões.

Tomalak
fonte
Alguém pode dar um exemplo da solução mod_rewrite? (especificamente o conteúdo de htmlinjector.php)
Asaf
1
Para aqueles de vocês lutando com isso - não se esqueça ScriptAliase <Directory /some/static/>...</Directory>, <Directory /path/to/cgi-bin/> Options +ExecCGI</Directory>etc. Eu não quero mexer com a resposta do usuário, mas se você pedir, vou dar mais informações.
Sridhar Sarnobat
@asdf Exemplo: <?php ob_start(); include("/some/static/page.html"); $contents = ob_get_contents(); ob_end_clean(); echo str_replace('</head>', '<script async>Some script content goes here like adsense code</script></head>', $contents) ?>use $ content para carregar o restante do conteúdo da página. você pode salvar o arquivo como htmlinjector.php ou qualquer outra coisa e chamá-lo em seu arquivo .htaccess assim:Options +FollowSymLinks RewriteEngine On RewriteCond %{REQUEST_FILENAME} /some/static/page.html RewriteRule ^(.*)$ /htmlinjector.php?url=/some/static/page.html
Gabriel Nwoffiah II
20

Não sei por que isso não foi mencionado na lista de respostas. Desculpe se demorei 2 anos para ver esta pergunta ...

A maneira mais fácil e poderosa de fazer o que você quer fazer é usar um filtro Apache .

Apenas tenha:

ExtFilterDefine css_changer mode=output intype=text/html cmd="/some/php/script.php"
SetOutputFilter css_changer

Um script possível:

#!/usr/bin/php
<?

#phpinfo(); // Uncomment to see ALL env variables
$host = $_ENV["HTTP_HOST"]; // www.site.com
$script_name = $_ENV["SCRIPT_NAME"]; // /theme/green/style.css
$pi = pathinfo($script_name);
$type = $pi['extension'];
#print "$host $script  $type";

$stdin = STDIN;

while($line = fgets($stdin)){
  $line = preg_replace('/a/', 'A', $line);

  fwrite(STDOUT, $line);
}
fclose(STDOUT);
?>

Isso mudará todos os "a" s para "A" s.

Certifique-se de habilitar o filtro no seu httpd.conf, assim:

LoadModule ext_filter_module libexec/apache2/mod_ext_filter.so

Esta questão está realmente no Google e não há muito em termos de fóruns

Merc
fonte
1
Essa é de longe a melhor solução, consegui encontrar um problema semelhante. Muito obrigado por compartilhar!
Harald
4

Aqui está um tutorial sobre como usar o mod_proxy_html para editar os links em uma página da web (o conteúdo). Você pode aplicar isso modifique o html desejado.

ATUALIZAÇÃO: Tem certeza de que deseja seguir esta rota? Eu acho que o Apache deve servir conteúdo, não criá-lo. Isso provavelmente iria na parte de exibição de uma estrutura MVC. A razão pela qual eu não recomendaria isso é que você está violando a regra da modularidade . Seu aplicativo da web será entrelaçado com o aplicativo que o servidor, complicando futuras atualizações, movimentos, etc.

Kyle Brandt
fonte
Hum, se eu entendi direito, mod_proxy_html não é capaz de adicionar novos trechos de código completos?
Não tenho certeza, agora que você adicionou mais, a resposta do comandante Tomalak soa melhor. Você está na terra dos hackers, eu diria, criar páginas da web não é realmente o que o Apache serve, é para exibir conteúdo.
Kyle Brandt
Pensei que talvez houvesse algum tipo de proxy independente que pudesse reescrever páginas html. Algo como o MySQL Proxy for MySQL. Talvez o Privoxy possa fazer isso.
@ Kyle Brandt: LOL - Eu acho que a menção ao posto militar oficialmente faz de você um trekkie. Isto fez o meu dia. :)
Tomalak
4

Eu preferiria fazer isso com mod_rewrite e SSI.

Primeiro, coloque o caminho em uma variável de ambiente

RewriteCond% {IS_SUBREQ} false
RewriteRule ^ (/.* \. Html) /page.shtml [E: nome do arquivo: $ 1]

então processe isso no arquivo shtml

<! - # include virtual = "$ filename" ->

(partes desta solução são baseadas em uma pergunta de stackoverflow /programming/40133/getting-apache-to-modify-static-webpages-on-the-fly/1196832 )

Alex Lehmann
fonte
1
Meu principal motivo para querer usar o shtml para isso seria que chamar um CGI externo para cada solicitação pode causar problemas de carregamento.
Alex Lehmann
4

mod_sed é um bom ajuste aqui. Você pode criar um filtro de saída que corresponda à tag de fechamento ou corpo, por exemplo, e inserir seu html antes dele.

caçador
fonte
1

Você pode usar o Apache mod_substitute para injetar html nas respostas de saída usando alguns critérios ou expressões regulares. Aqui está uma explicação de como conseguir isso.

Kayvan
fonte
1

você pode consultar a diretiva de cabeçalho e rodapé do apache, usando as diretivas abaixo.

<Directory "/usr/local/www/data/scott">
    Options +Indexes
    AllowOverride All
    AddOutputFilter LAYOUT html htm shtml
    LayoutComment On
    LayoutHeader /wrappers/scott-header.html
    LayoutFooter /wrappers/scott-footer.html
</Directory>

Mais leitura está aqui: http://wannabe.guru.org/scott/hobbies/apache/

Roy Rico
fonte
1

O Mod Layout agora está obsoleto e, se você não deseja a sobrecarga de chamar um script externo, a melhor solução que funcionou para mim foi o mod sed . Você pode usar o mod sed para corresponder à primeira linha do documento (1s) e adicionar o código do script de cabeçalho lá, à última linha ($ s) e colocar o rodapé lá.

Options Indexes FollowSymLinks Includes ExecCGI
Order Deny,Allow
Deny from none
Allow from all
Require all granted

AddOutputFilter Sed html
SetOutputFilter Sed;DEFLATE
OutputSed "1s|^|<header code>|"
OutputSed "$s|$|</footer code>|g"
MohitC
fonte
0

Eu posso inserir html em todas as páginas via Apache, mas apenas no site hospedado pelo meu apache, nem todo o site no meu servidor proxy apache.

é assim que funciona. eu configurei um XAMPP, baixei o mod_layout 5.1 para o apache 2.4. (instale mod_layout é simples, se você usa o XAMPP para windows, basta baixar o mod_layout.so 5.1 para windows e colocá-lo na pasta do módulo apache $ home / apache / module e adicione o DSO de configuração ao seu httpd.conf LoadModule layout_module modules / mod_layout.so - se você estiver usando linux ou outro sistema operacional, baixe o mod_layout.so para linux e execute o comando make para instalar)

Depois de instalar o mod_layout.so para Windows, basta colocar este código no seu arquivo .htaccess ou httpd.conf, você receberá o html insert em toda a sua página:

<IfModule mod_layout.c>
AddOutputFilter LAYOUT html 
AddOutputFilter LAYOUT htm 
AddOutputFilter LAYOUT shtml 
AddOutputFilter LAYOUT shtm 
AddOutputFilter LAYOUT cgi 
AddOutputFilter LAYOUT php 
LayoutFooter "C:/xampp/apache/cgi-bin/footer.php"
</IfModule>

C: /xampp/apache/cgi-bin/footer.php é onde você coloca seu arquivo html ou php, na minha situação é C: /xampp/apache/cgi-bin/footer.php, mas você pode colocá-lo em qualquer lugar , apenas dê o caminho certo, você ficará bem

Leon Kaden
fonte