Comment injecter du code HTML dans chaque page HTML livrée?

23

J'ai un Apache web serverqui fournit des pages HTML statiques. Pour une raison quelconque, je ne peux pas modifier les fichiers eux-mêmes, mais je veux toujours injecter du HTML dans chaque page qui est servie.

Est-ce possible avec mod_proxy? Sinon, quelqu'un pourrait-il recommander un logiciel qui offre une telle fonctionnalité?

EDIT: Je dois insérer une sorte de bannière publicitaire (par exemple a javascript) et un pixel de suivi.

Nœud
la source

Réponses:

18

Vous pouvez faire ceci: Travailler avec mod_rewrite pour modifier les demandes de

/some/static/page.html

à

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

puis utilisez PHP (ou ce que vous trouvez approprié) pour faire la manipulation de fichiers. Ajoutez un cache de sortie pour améliorer les performances.

Comme alternative, les gestionnaires Apache semblent utiles:

Modification du contenu statique à l'aide d'un script CGI

Les directives suivantes entraîneront des demandes de fichiers avec l' html extension pour déclencher le lancement du footer.plscript CGI.

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

Ensuite, le script CGI est responsable de l'envoi du document initialement demandé (indiqué par la PATH_TRANSLATEDvariable d'environnement) et des modifications ou ajouts souhaités.

C'est plus ou moins ce que ferait l'approche mod_rewrite, mais avec moins de piratage.

Tomalak
la source
Quelqu'un peut-il donner un exemple de la solution mod_rewrite? (en particulier le contenu de htmlinjector.php)
Asaf
1
Pour ceux d'entre vous qui luttent avec cela - n'oubliez pas ScriptAliaset <Directory /some/static/>...</Directory>, <Directory /path/to/cgi-bin/> Options +ExecCGI</Directory>etc. Je ne veux pas altérer la réponse de l'utilisateur mais si vous le demandez, je donnerai plus d'informations.
Sridhar Sarnobat
@asdf Exemple: <?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) ?>utilisez $ content pour charger le reste du contenu de la page. vous pouvez enregistrer ce fichier sous htmlinjector.php ou autre et l'appeler dans votre fichier htaccess comme ceci:Options +FollowSymLinks RewriteEngine On RewriteCond %{REQUEST_FILENAME} /some/static/page.html RewriteRule ^(.*)$ /htmlinjector.php?url=/some/static/page.html
Gabriel Nwoffiah II
20

Je ne sais pas pourquoi cela n'a pas été mentionné dans la liste des réponses. Désolé si cela m'a pris 2 ans pour voir cette question ...

Le moyen le plus simple et le plus puissant de faire ce que vous voulez faire ce que vous voulez est d'utiliser un filtre Apache .

Avoir juste:

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

Un script possible:

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

Cela changera tous les «a» en «A».

Assurez-vous d'activer le filtre dans votre httpd.conf, comme ceci:

LoadModule ext_filter_module libexec/apache2/mod_ext_filter.so

Cette question se classe vraiment dans Google et il n'y a pas grand-chose en termes de forums

Merc
la source
1
C'est de loin la meilleure solution que j'ai pu trouver pour un problème similaire. Merci beaucoup d'avoir partagé!
harald
4

Voici un tutoriel sur la façon d'utiliser mod_proxy_html pour modifier les liens sur une page Web (le contenu). Vous pourriez être en mesure d'appliquer cette modification le code HTML que vous souhaitez.

MISE À JOUR: Êtes-vous sûr de vouloir emprunter cette voie? Je pense qu'Apache est destiné à servir du contenu, pas à le créer. Cela irait probablement dans la partie vue d'un framework MVC. La raison pour laquelle je ne recommanderais pas cela est que vous enfreignez la règle de la modularité . Votre application Web sera étroitement liée à l'application qui la gère, ce qui complique les futures mises à niveau, déplacements, etc.

Kyle Brandt
la source
Hm, si je comprends bien, mod_proxy_html n'est pas capable d'ajouter de nouveaux extraits de code complets?
Node
Pas sûr, maintenant que vous en avez ajouté plus, la réponse du commandant Tomalak sonne mieux. Vous êtes au pays du piratage, je dirais, la création de pages Web n'est pas vraiment à quoi sert Apache, c'est pour servir du contenu.
Kyle Brandt
J'ai pensé qu'il y avait peut-être une sorte de proxy autonome qui pourrait réécrire les pages html. Quelque chose comme MySQL Proxy pour MySQL. Peut-être que Privoxy pourrait le faire.
Node
@Kyle Brandt: LOL - Je pense que la mention du grade militaire fait officiellement de vous un trekkie. Cela a fait ma journée. :)
Tomalak
4

Je préférerais le faire avec mod_rewrite et SSI.

Mettez d'abord le chemin dans une variable d'environnement

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

puis traiter cela dans le fichier shtml

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

(certaines parties de cette solution sont basées sur une question de stackoverflow /programming/40133/getting-apache-to-modify-static-webpages-on-the-fly/1196832 )

Alex Lehmann
la source
1
Ma principale raison de vouloir utiliser shtml pour cela serait que l'appel d'un CGI externe pour chaque demande pourrait causer des problèmes de charge.
Alex Lehmann
4

mod_sed est un bon ajustement ici. Vous pouvez créer un filtre de sortie qui correspond à la balise de fermeture head ou body, par exemple, et insérer votre code HTML avant celui-ci.

cwarden
la source
1

Vous pouvez utiliser Apache mod_substitute pour injecter du HTML dans les réponses sortantes à l'aide de certains critères ou expressions régulières. Voici une explication sur la façon d'y parvenir.

Kayvan
la source
1

vous pouvez regarder dans la directive en-tête et pied de page d'apache, en utilisant les directives ci-dessous.

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

Plus de lecture est ici: http://wannabe.guru.org/scott/hobbies/apache/

Roy Rico
la source
1

Mod Layout est désormais obsolète et si vous ne voulez pas la surcharge d'appeler un script externe, la meilleure solution qui a fonctionné pour moi a été mod sed . Vous pouvez utiliser mod sed pour faire correspondre la première ligne de doc (1s) et y ajouter du code de script d'en-tête et faire correspondre la dernière ligne ($ s) et y placer le pied de page.

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
la source
0

je peux insérer du HTML sur toutes les pages via Apache, mais uniquement pour le site hébergé par mon apache, pas tous les sites via mon serveur proxy apache.

c'est comme ça que ça marche. j'ai mis en place un XAMPP, téléchargez mod_layout 5.1 pour apache 2.4. (installer mod_layout est simple, si vous utilisez XAMPP pour Windows, téléchargez simplement mod_layout.so 5.1 pour windows et placez-le dans le dossier de votre module apache $ home / apache / module, puis ajoutez la configuration DSO à vos httpd.conf LoadModule layout_module modules / mod_layout.so - si vous utilisez linux ou un autre système d'exploitation, vous devez télécharger mod_layout.so pour linux, puis exécuter la commande make pour l'installer)

Après avoir installé mod_layout.so pour Windows, mettez simplement ce code sur votre fichier .htaccess ou httpd.conf vous obtiendrez une insertion html sur toute votre page:

<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 est l'endroit où vous mettez votre fichier html ou php, dans ma situation est C: /xampp/apache/cgi-bin/footer.php, mais vous pouvez le mettre n'importe où , donne juste le bon chemin, tu iras bien

Leon Kaden
la source