Como injetar código HTML em cada página HTML entregue?

22

Eu tenho um Apache web server que entrega páginas HTML estáticas. Por algum motivo, não consigo alterar os arquivos, mas ainda quero injetar um pouco de HTML em todas as páginas que estão sendo exibidas.

Isso é possível com mod_proxy ? Se não, alguém poderia recomendar um software que fornece tal recurso?

EDITAR: Eu tenho que inserir algum tipo de anúncio de banner (por exemplo, um javascript ) e um pixel de rastreamento.

    
por Node 27.07.2009 / 14:16

10 respostas

18

Você pode fazer isso: trabalhar com o mod_rewrite para alterar solicitações de

/some/static/page.html

para

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

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

Como alternativa, os Apache Handlers são úteis:

Modifying static content using a CGI script

The following directives will cause requests for files with the html extension to trigger the launch of the footer.pl CGI script.

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

Then the CGI script is responsible for sending the originally requested document (pointed to by the PATH_TRANSLATED environment variable) and making whatever modifications or additions are desired.

Isso é mais ou menos o que a abordagem mod_rewrite faria, apenas com menos hackery.

    
por 27.07.2009 / 14:44
19

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

A maneira mais fácil e eficiente de fazer o que você deseja é 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 ativar o filtro no seu httpd.conf, assim:

LoadModule ext_filter_module libexec/apache2/mod_ext_filter.so

Esta questão está no topo do Google e não há muita coisa lá fora em termos de fóruns

    
por 07.06.2012 / 03:03
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:filename:$1]

processe isso no arquivo shtml

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

(partes dessa solução são baseadas em uma pergunta do stackoverflow link )

    
por 28.07.2009 / 13:27
4

mod_sed é um bom ajuste aqui. Você pode criar um filtro de saída que corresponda à cabeça de fechamento ou à etiqueta do corpo, por exemplo, e insira o seu html antes dele.

    
por 26.01.2012 / 17:47
1

Um módulo mod_perl seria de alguma utilidade?

link

Isso pode fazer o que você quer ou, pelo menos, apontar na direção certa.

    
por 27.07.2009 / 15:45
1

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

    
por 14.03.2012 / 23:26
1

você pode olhar para 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 leituras estão aqui: link

    
por 28.07.2009 / 23:39
0

Eu posso inserir HTML para todas as páginas através do Apache, mas apenas para o site que é hospedado pelo meu apache, nem todo o site através do meu servidor proxy do Apache.

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

Após instalar o mod_layout.so para windows, basta colocar esse código no seu arquivo .htaccess ou no httpd.conf, o seu html irá inserir 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 o seu arquivo html ou php, na minha situação é C: /xampp/apache/cgi-bin/footer.php, mas você pode colocar em qualquer lugar, basta dar o caminho certo, você vai ficar bem

    
por 25.02.2016 / 16:46
0

Mod Layout agora está obsoleto e se você não quiser a sobrecarga de chamar um script externo, a melhor solução que funcionou para mim foi mod sed . Você pode usar o mod sed para coincidir com a primeira linha do doc (1s) e adicionar o código do script de cabeçalho lá e combinar a ú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"
    
por 07.04.2016 / 11:59