Wie füge ich HTML-Code in jede gelieferte HTML-Seite ein?

23

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

Ist das möglich mit mod_proxy? Wenn nicht, kann jemand eine Software empfehlen, die eine solche Funktion bietet?

EDIT: Ich muss eine Art Werbebanner (zB a javascript) und ein Tracking-Pixel einfügen .

Knoten
quelle

Antworten:

18

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

/some/static/page.html

zu

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

Verwenden Sie dann PHP (oder was auch immer Sie für angemessen halten), um die Datei zu manipulieren. Fügen Sie einen Ausgabecache hinzu, um die Leistung zu verbessern.

Als Alternative klingen Apache-Handler hilfreich:

Statischen Inhalt mit einem CGI-Skript ändern

Die folgenden Anweisungen bewirken, dass Anforderungen für Dateien mit der html Erweiterung den Start des footer.plCGI-Skripts auslösen .

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

Das CGI-Skript ist dann dafür verantwortlich, das ursprünglich angeforderte Dokument (auf das die PATH_TRANSLATEDUmgebungsvariable verweist) zu senden und die gewünschten Änderungen oder Ergänzungen vorzunehmen.

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

Tomalak
quelle
Kann jemand ein Beispiel für die mod_rewrite-Lösung geben? (speziell der Inhalt von htmlinjector.php)
Asaf
1
Für diejenigen von euch kämpfen mit diesem - nicht vergessen ScriptAliasund <Directory /some/static/>...</Directory>, <Directory /path/to/cgi-bin/> Options +ExecCGI</Directory>usw. Ich bin nicht mit dem Benutzer Antwort manipulieren will , aber wenn Sie verlangen, werde ich weitere 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 wie 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
20

Ich bin nicht sicher, warum dies nicht in der Antwortliste erwähnt wurde. Es tut mir leid, wenn ich 2 Jahre gebraucht habe, um diese Frage zu sehen ...

Der einfachste und leistungsstärkste Weg, um das zu tun, was Sie wollen, ist die Verwendung eines Apache-Filters .

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.

Stellen Sie sicher, dass Sie den Filter in Ihrer httpd.conf wie folgt aktivieren:

LoadModule ext_filter_module libexec/apache2/mod_ext_filter.so

Diese Frage steht bei Google ganz oben und es gibt nicht viel in Bezug auf Foren

Merc
quelle
1
Das ist bei weitem die beste Lösung, die ich für ein ähnliches Problem finden konnte. Vielen Dank für das Teilen!
Harald
4

In diesem Tutorial erfahren Sie , wie Sie mit mod_proxy_html die Links auf einer Webseite (den Inhalt) bearbeiten. Möglicherweise können Sie dies anwenden, um die gewünschte HTML-Datei zu ändern.

UPDATE: Sind Sie sicher, dass Sie diese Route einschlagen möchten? Ich denke, Apache soll Inhalte bereitstellen, nicht erstellen. Dies würde wohl in den Ansichtsteil eines MVC-Frameworks gehen. Der Grund, warum ich dies nicht empfehlen würde, ist, dass Sie die Regel der Modularität brechen . Ihre Webanwendung wird mit der Anwendung verflochten, die sie bedient, was zukünftige Upgrades, Umzüge usw. erschwert.

Kyle Brandt
quelle
Hm, wenn ich es richtig verstehe, ist mod_proxy_html nicht in der Lage, komplett neue Code-Snipets hinzuzufügen?
Knoten
Ich bin mir nicht sicher, ob Commander Tomalaks Antwort besser klingt, nachdem Sie mehr hinzugefügt haben. Sie befinden sich im Land der Hacker, ich würde sagen, das Erstellen von Webseiten ist nicht wirklich das, wofür Apache ist, sondern das Bereitstellen von Inhalten.
Kyle Brandt
Ich dachte, dass es vielleicht eine Art eigenständigen Proxy gibt, der HTML-Seiten umschreiben könnte. So etwas wie MySQL Proxy für MySQL. Vielleicht könnte Privoxy das tun.
Knoten
@ Kyle Brandt: LOL - Ich denke, die Erwähnung des militärischen Ranges macht dich offiziell zu einem Trekkie. Das machte meinen Tag. :)
Tomalak
4

Ich würde es vorziehen, dies mit mod_rewrite und SSI zu tun.

Legen Sie zuerst den Pfad in eine Umgebungsvariable

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

Verarbeiten Sie das dann in der Shtml-Datei

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

(Teile dieser Lösung basieren auf einer Stackoverflow-Frage /programming/40133/getting-apache-to-modify-static-webpages-on-the-fly/1196832 )

Alex Lehmann
quelle
1
Mein Hauptgrund für die Verwendung von shtml ist, dass das Aufrufen eines externen CGI für jede Anforderung zu Ladeproblemen führen kann.
Alex Lehmann
4

mod_sed passt hier gut. Sie können einen Ausgabefilter erstellen, der beispielsweise mit dem schließenden Kopf- oder Körper-Tag übereinstimmt, und Ihre HTML-Datei davor einfügen.

cwarden
quelle
1

Sie können Apache mod_substitute verwenden, um HTML-Code mithilfe einiger Kriterien oder regulärer Ausdrücke in ausgehende Antworten einzufügen. Hier finden Sie eine Erklärung, wie dies erreicht werden kann.

Kayvan
quelle
1

Sie können in die Header- und Footer-Direktive von Apache schauen, indem Sie die folgenden Direktiven verwenden.

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

Weitere Informationen finden Sie hier: http://wannabe.guru.org/scott/hobbies/apache/

Roy Rico
quelle
1

Mod - Layout ist jetzt veraltet , und wenn Sie nicht möchten , dass der Aufwand für ein externes Skript aufrufen, ist die beste Lösung , die für mich gearbeitet wurde mod sed . Sie können mod sed verwenden, um die erste Zeile des Dokuments (1s) abzugleichen und dort den Skriptcode für die Kopfzeile und die letzte Zeile ($ s) einzufügen und dort die Fußzeile einzufügen.

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

Ich kann HTML auf allen Seiten über Apache einfügen, aber nur für Websites, die von meinem Apache gehostet werden, nicht für alle Websites über meinen Apache-Proxyserver.

so funktioniert es Ich richte ein XAMPP ein, lade mod_layout 5.1 für Apache 2.4 herunter. (Die Installation von mod_layout ist einfach. Wenn Sie XAMPP für Windows verwenden, laden Sie einfach mod_layout.so 5.1 für Windows herunter und legen Sie es in Ihrem Apache-Modul-Ordner $ home / apache / module ab. Fügen Sie dann das DSO config zu Ihrer httpd.conf hinzu. LoadModule layout_module modules / mod_layout.so - Wenn Sie Linux oder ein anderes Betriebssystem verwenden, sollten Sie mod_layout.so für Linux herunterladen und dann den Befehl make ausführen, um es zu installieren.

Nachdem Sie mod_layout.so für Windows installiert haben, fügen Sie diesen Code einfach in Ihre .htaccess-Datei oder httpd.conf ein.

<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 der Ort, an dem Sie Ihre HTML- oder PHP-Datei ablegen. In meiner Situation ist es C: /xampp/apache/cgi-bin/footer.php, aber Sie können sie überall ablegen , gib einfach den richtigen Weg, du wirst in Ordnung sein

Leon Kaden
quelle