¿Cómo inyectar código HTML en cada página HTML entregada?

23

Tengo un Apache web serverque ofrece páginas HTML estáticas. Por alguna razón, no puedo cambiar los archivos, pero todavía quiero inyectar algo de HTML en cada página que se está sirviendo.

¿Es esto posible con mod_proxy? Si no es así, ¿alguien podría recomendar un software que brinde dicha función?

EDITAR: tengo que insertar algún tipo de anuncio de banner (por ejemplo, a javascript) y un píxel de seguimiento.

Nodo
fuente

Respuestas:

18

Puede hacer esto: trabajar con mod_rewrite para cambiar las solicitudes de

/some/static/page.html

a

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

luego use PHP (o lo que considere apropiado) para hacer la manipulación de archivos. Agregue un caché de salida para mejorar el rendimiento.

Como alternativa, los controladores de Apache suenan útiles:

Modificar contenido estático usando un script CGI

Las siguientes directivas harán que las solicitudes de archivos con la html extensión activen el lanzamiento del footer.plscript CGI.

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

Luego, el script CGI es responsable de enviar el documento solicitado originalmente (señalado por la PATH_TRANSLATEDvariable de entorno) y de realizar las modificaciones o adiciones que se deseen.

Esto es más o menos lo que haría el enfoque mod_rewrite, solo que con menos piratería.

Tomalak
fuente
¿Alguien puede dar un ejemplo de la solución mod_rewrite? (específicamente el contenido de htmlinjector.php)
Asaf
1
Para aquellos de ustedes que luchan con esto - no olvidar ScriptAliasy <Directory /some/static/>...</Directory>, <Directory /path/to/cgi-bin/> Options +ExecCGI</Directory>etc. Yo no quiero interferir con la respuesta del usuario, pero si usted lo solicita, le daré más información.
Sridhar Sarnobat
@asdf Ejemplo: <?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 cargar el resto del contenido de la página. puede guardar este archivo como htmlinjector.php o lo que sea y llamarlo en su archivo htaccess de esta manera:Options +FollowSymLinks RewriteEngine On RewriteCond %{REQUEST_FILENAME} /some/static/page.html RewriteRule ^(.*)$ /htmlinjector.php?url=/some/static/page.html
Gabriel Nwoffiah II
20

No estoy seguro de por qué esto no se ha mencionado en la lista de respuestas. Lo siento si me tomó 2 años ver esta pregunta ...

La forma más fácil y poderosa de hacer lo que quieres hacer es usar un filtro Apache .

Solo tengo:

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

Un posible script:

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

Esto cambiará todas las "a" en "A".

Asegúrese de habilitar el filtro en su httpd.conf, así:

LoadModule ext_filter_module libexec/apache2/mod_ext_filter.so

Esta pregunta ocupa un lugar destacado en Google y no hay mucho en términos de foros

Merc
fuente
1
Esa es, con mucho, la mejor solución, pude encontrar un problema similar. ¡Muchas gracias por compartir!
harald
4

Aquí hay un tutorial sobre cómo usar mod_proxy_html para editar los enlaces en una página web (el contenido). Es posible que pueda aplicar esta modificación al html que desee.

ACTUALIZACIÓN: ¿Estás seguro de que quieres seguir esta ruta? Creo que Apache está destinado a servir contenido, no a crearlo. Esto probablemente iría en la vista de parte de un marco MVC. La razón por la que no recomendaría esto es que está rompiendo la regla de la modularidad . Su aplicación web estará entrelazada con la aplicación que la sirve, lo que complicará futuras actualizaciones, movimientos, etc.

Kyle Brandt
fuente
Hm, si lo hago bien mod_proxy_html no es capaz de agregar nuevos fragmentos de código completos.
Nodo
No estoy seguro, ahora que ha agregado más, la respuesta del Comandante Tomalak suena mejor. Diría que está en la tierra de los piratas informáticos, la creación de páginas web no es realmente para lo que Apache es, sino para servir contenido.
Kyle Brandt
Pensé que quizás haya algún tipo de proxy independiente que podría reescribir páginas html. Algo así como MySQL Proxy para MySQL. Quizás Privoxy podría hacer esto.
Nodo
@Kyle Brandt: LOL - Creo que la mención del rango militar oficialmente te hace un trekkie. Esto hizo mi dia. :)
Tomalak
4

Preferiría hacer esto con mod_rewrite y SSI.

Primero ponga la ruta en una variable de entorno

RewriteCond% {IS_SUBREQ} false
RewriteRule ^ (/.* \. Html) /page.shtml [E: nombre de archivo: $ 1]

luego procese eso en el archivo shtml

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

(partes de esta solución se basan en una pregunta de stackoverflow /programming/40133/getting-apache-to-modify-static-webpages-on-the-fly/1196832 )

Alex Lehmann
fuente
1
Mi razón principal para querer usar shtml para esto sería que llamar a un CGI externo para cada solicitud puede causar problemas de carga.
Alex Lehmann
4

mod_sed encaja bien aquí. Puede crear un filtro de salida que coincida con la etiqueta de cabeza o cuerpo de cierre, por ejemplo, e inserte su html antes.

celador
fuente
1

Puede usar Apache mod_substitute para inyectar html en respuestas salientes utilizando algunos criterios o expresiones regulares. Aquí hay una explicación de cómo lograr esto.

Kayvan
fuente
1

puede consultar la directiva de encabezado y pie de página de apache, utilizando las siguientes directivas

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

Más lectura está aquí: http://wannabe.guru.org/scott/hobbies/apache/

Roy Rico
fuente
1

Mod Layout ahora está obsoleto y si no desea la sobrecarga de llamar a un script externo, la mejor solución que funcionó para mí fue mod sed . Puede usar mod sed para que coincida con la primera línea de doc (1s) y agregar el código del script de encabezado allí y hacer coincidir la última línea ($ s) y poner el pie de página allí.

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

Puedo insertar html en todas las páginas a través de Apache, pero solo para el sitio alojado por mi apache, no todo el sitio a través de mi servidor proxy apache.

Así es como funciona. configuré un XAMPP, descargué mod_layout 5.1 para apache 2.4. (instalar mod_layout es simple, si usa XAMPP para Windows, simplemente descargue mod_layout.so 5.1 para Windows y póngalo en su carpeta de módulo de apache $ home / apache / module, luego agregue el DSO de configuración a sus httpd.conf LoadModule layout_module modules / mod_layout.so: si usa linux u otro sistema operativo, debe descargar mod_layout.so para linux, luego ejecute make command para instalar)

Después de instalar mod_layout.so para Windows, simplemente coloque este código en su archivo .htaccess o httpd.conf obtendrá su inserción html en toda su 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 es donde pones tu archivo html o php, en mi situación es C: /xampp/apache/cgi-bin/footer.php, pero puedes ponerlo en cualquier lugar , solo da el camino correcto, estarás bien

Leon Kaden
fuente