Frage Wie injiziere ich HTML-Code in jede gelieferte HTML-Seite?


Ich habe eine Apache web server das liefert statische HTML-Seiten. Aus irgendeinem Grund kann ich die Dateien nicht selbst ändern, aber ich möchte immer noch HTML in jede Seite einfügen, die bedient wird.

Ist das möglich mit? mod_proxy? Wenn nicht, könnte jemand eine Software empfehlen das bietet so ein Feature?

BEARBEITEN: Ich muss eine Art Werbebanner einfügen (z. B. a javascript) und ein Tracking-Pixel.


22
2017-07-27 12:16


Ursprung




Antworten:


Sie könnten dies tun: Arbeiten Sie mit mod_rewrite, um Anfragen von zu ändern

/some/static/page.html

zu

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

Dann benutze PHP (oder was immer du für angemessen hältst), um die Dateimanipulation durchzuführen. Fügen Sie einen Ausgabecache hinzu, um die Leistung zu verbessern.

Als Alternative, Apache-Handler Ton hilfreich:

Ändern des statischen Inhalts mit einem CGI   Skript

Die folgenden Anweisungen verursachen   Anfragen nach Dateien mit dem html   Verlängerung, um den Start des    footer.pl CGI-Skript.

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

Dann ist das CGI-Skript verantwortlich für   Senden der ursprünglich angeforderten   Dokument (auf das von der    PATH_TRANSLATED Umgebungsvariable)   und machen irgendwelche Modifikationen oder   Ergänzungen sind erwünscht.

Das ist mehr oder weniger das, was der mod_rewrite-Ansatz tun würde, nur mit weniger Hacking.


18
2017-07-27 12:44



Kann jemand ein Beispiel für die mod_rewrite Lösung geben? (speziell der Inhalt von htmlinjector.php) - Asaf
Für diejenigen von euch, die damit kämpfen - vergiss nicht ScriptAlias und <Directory /some/static/>...</Directory>, <Directory /path/to/cgi-bin/> Options +ExecCGI</Directory>usw. Ich möchte nicht die Antwort des Benutzers manipulieren, aber wenn Sie verlangen, werde ich mehr Informationen geben. - Sridhar-Sarnobat
@asdf Beispiel: <?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) ?> Verwenden Sie $ content, um den Rest des Seiteninhalts zu laden. Sie können diese Datei als htmlinjector.php oder was auch immer speichern und in Ihrer htaccess-Datei wie folgt aufrufen: Options +FollowSymLinks RewriteEngine On RewriteCond %{REQUEST_FILENAME} /some/static/page.html RewriteRule ^(.*)$ /htmlinjector.php?url=/some/static/page.html - Gabriel Nwoffiah II


Ich bin nicht sicher, warum dies in der Liste der Antwort nicht erwähnt wurde. Entschuldigung, wenn ich 2 Jahre gebraucht habe, um diese Frage zu sehen ...

Der einfachste und effektivste Weg, um das zu tun, was Sie wollen, ist ein Apache-Filter.

Nur haben:

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

Ein mögliches Skript:

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

Dies wird alle "a" s in "A" s ändern.

Achten Sie darauf, den Filter in Ihrer httpd.conf wie folgt zu aktivieren:

LoadModule ext_filter_module libexec/apache2/mod_ext_filter.so

Diese Frage steht bei Google wirklich hoch und es gibt nicht viel mehr in Bezug auf Foren


19
2018-06-07 01:03



Das ist bei weitem die beste Lösung, die ich für ein ähnliches Problem finden konnte. Vielen Dank für das Teilen! - harald


Hier ist ein Tutorial wie man benutzt mod_proxy_html um die Links auf einer Webseite (den Inhalt) zu bearbeiten. Sie können möglicherweise diese HTML ändern, die Sie möchten.

AKTUALISIEREN: Bist du sicher, dass du diesen Weg gehen willst? Ich denke, Apache soll Inhalte liefern, nicht schaffen. Dies würde wahrscheinlich in den View-Teil eines MVC-Frameworks gehen. Der Grund, warum ich das nicht empfehlen würde, ist, dass Sie brechen die Regel der Modularität. Ihre Webanwendung wird mit der Anwendung verwoben, die sie verwaltet, wodurch zukünftige Upgrades, Umzüge usw. erschwert werden.


4
2017-07-27 12:25



Hm, wenn ich es richtig verstehe mod_proxy_html ist nicht in der Lage, komplette neue Code-Snipets hinzuzufügen? - Node
Nicht sicher, jetzt, wo Sie mehr hinzugefügt haben, klingt Commander Tomalaks Antwort besser. Du bist im Land der Hackereien, würde ich sagen, Webseiten zu erstellen ist nicht wirklich das, wofür Apache ist, es ist für das Servieren von Inhalten. - Kyle Brandt♦
Ich habe mir gedacht, dass es vielleicht eine Art eigenständigen Proxy gibt, der HTML-Seiten umschreiben kann. So etwas wie MySQL Proxy für MySQL. Vielleicht könnte Privoxy das tun. - Node
@Kyle Brandt: LOL - Ich denke, die Erwähnung des militärischen Ranges macht dich offiziell zum Trekkie. Das hat meinen Tag gemacht. :) - Tomalak


Ich würde das lieber mit mod_rewrite und SSI machen.

Platziere den Pfad zuerst in eine Umgebungsvariable

RewriteCond% {IS_SUBREQ} false
RewriteRule ^ (/.* \ .html) /page.shtml [E: Dateiname: $ 1]

Dann bearbeite das in der shtml-Datei

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

(Teile dieser Lösung basieren auf einer Stackoverflow-Frage https://stackoverflow.com/questions/40133/getting-apache-to-modify-static-webpages-on-the-fly/1196832 )


4
2017-07-28 11:27



Mein Hauptgrund dafür, shtml dafür zu verwenden, wäre, dass das Aufrufen eines externen CGI für jede Anfrage Ladeprobleme verursachen könnte. - Alex Lehmann


mod_sed passt hier gut. Sie können einen Ausgabefilter erstellen, der beispielsweise dem schließenden Kopf- oder dem body-Tag entspricht und Ihren HTML-Code davor einfügen.


4
2018-01-26 16:47





Würde ein mod_perl-Modul benutzt werden?

http://search.cpan.org/~gozer/Apache2-Layout-0.6/lib/Apache2/Layout.pm

Das könnte tun, was Sie wollen, oder Sie zumindest in die richtige Richtung weisen.


1
2017-07-27 13:45



Also, ich guck mal, in dem Moment, in dem wir dazu neigen httpd.apache.org/docs/2.0/handler.html mit einem benutzerdefinierten footer.pl - Node


Sie könnten Apache mod_substitute verwenden, um HTML in ausgehende Antworten zu injizieren, indem Sie einige Kriterien oder reguläre Ausdrücke verwenden. Hier ist eine Erklärung dafür, wie dies erreicht werden kann.


1
2018-03-14 22:26





Sie können in die Kopf- und Fußzeile von Apache schauen, indem Sie die Anweisungen unten benutzen.

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

Mehr lesen ist hier: http://wannabe.guru.org/scott/hobbies/apache/


1
2017-07-28 21:39





Ich kann HTML in alle Seiten über Apache einfügen, aber nur für die Seite, die von meinem Apache gehostet wird, nicht alle Seite, obwohl mein Apache-Proxy-Server.

so funktioniert es. Ich richte einen XAMPP ein, lade mod_layout 5.1 für Apache 2.4 herunter. (install mod_layout ist einfach, wenn Sie XAMPP für Windows verwenden, laden Sie einfach mod_layout.so 5.1 für windows und legen Sie es in Ihrem Apache Modulordner $ home / apache / module, dann fügen Sie das Konfigurations-DSO zu Ihrem httpd.conf LoadModule layout_module Module / mod_layout.so - Wenn Sie Linux oder andere Betriebssysteme verwenden, sollten Sie mod_layout.so für linux herunterladen, dann führen Sie den make-Befehl zur Installation aus.

Nach der Installation von mod_layout.so für Windows, fügen Sie einfach diesen Code in Ihre .htaccess-Datei oder httpd.conf ein. Sie erhalten dann HTML-Code für alle Ihre Seiten:

<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 ist, wo Sie Ihre HTML-oder PHP-Datei, in meiner Situation ist C: /xampp/apache/cgi-bin/footer.php, aber Sie können es überall wo Gib einfach den richtigen Weg, es wird dir gut gehen


0
2018-02-25 15:46