Come iniettare il codice HTML in ogni pagina HTML fornita?


23

Ho un Apache web serverche fornisce pagine HTML statiche. Per qualche ragione non posso cambiare i file da soli, ma voglio ancora iniettare un po 'di HTML in ogni pagina che viene pubblicata.

È possibile con mod_proxy? In caso contrario, qualcuno potrebbe raccomandare un software che fornisce tale funzionalità?

EDIT: devo inserire una sorta di banner pubblicitario (es. A javascript) e un pixel di tracciamento.

Risposte:


18

Puoi farlo: lavora con mod_rewrite per cambiare le richieste da

/some/static/page.html

a

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

quindi usa PHP (o qualunque cosa tu ritenga opportuno) per fare la manipolazione dei file. Aggiungi una cache di output per migliorare le prestazioni.

In alternativa, i gestori di Apache sembrano utili:

Modifica del contenuto statico mediante uno script CGI

Le seguenti direttive faranno sì che le richieste di file con html estensione attivino l'avvio dello footer.plscript CGI.

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

Quindi lo script CGI è responsabile dell'invio del documento richiesto originariamente (indicato dalla PATH_TRANSLATEDvariabile d'ambiente) e di apportare qualsiasi modifica o aggiunta siano desiderati.

Questo è più o meno ciò che l'approccio mod_rewrite farebbe, solo con meno hacker.


Qualcuno può fare un esempio della soluzione mod_rewrite? (in particolare il contenuto di htmlinjector.php)
Asaf

1
Per quelli di voi che lottano con questo - non dimenticare ScriptAliase <Directory /some/static/>...</Directory>, <Directory /path/to/cgi-bin/> Options +ExecCGI</Directory>ecc. Non voglio manomettere la risposta dell'utente, ma se lo richiedi, darò maggiori informazioni.
Sridhar Sarnobat,

Esempio @asdf: <?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) ?>utilizzare $ content per caricare il resto del contenuto della pagina. puoi salvare questo file come htmlinjector.php o qualsiasi altra cosa e chiamarlo nel tuo file htaccess in questo modo:Options +FollowSymLinks RewriteEngine On RewriteCond %{REQUEST_FILENAME} /some/static/page.html RewriteRule ^(.*)$ /htmlinjector.php?url=/some/static/page.html
Gabriel Nwoffiah II

20

Non sono sicuro del perché questo non sia stato menzionato nell'elenco delle risposte. Scusa se mi ci sono voluti 2 anni per vedere questa domanda ...

Il modo più semplice e potente per fare quello che vuoi fare quello che vuoi è usare un filtro Apache .

Basta avere:

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

Una possibile sceneggiatura:

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

Questo cambierà tutte le "a" s in "A" s.

Assicurati di abilitare il filtro nel tuo httpd.conf, in questo modo:

LoadModule ext_filter_module libexec/apache2/mod_ext_filter.so

Questa domanda si colloca davvero su Google e non c'è molto là fuori in termini di forum


1
Questa è di gran lunga la soluzione migliore, sono stato in grado di trovare un problema simile. Grazie molto per la condivisione!
Harald

4

Ecco un tutorial su come utilizzare mod_proxy_html per modificare i collegamenti su una pagina Web (il contenuto). Potresti essere in grado di applicare questa modifica all'html che desideri.

AGGIORNAMENTO: sei sicuro di voler percorrere questa strada? Penso che Apache debba servire il contenuto, non crearlo. Questo probabilmente andrebbe nella vista parte di un framework MVC. Il motivo per cui non lo consiglierei è che stai infrangendo la regola della modularità . La tua applicazione web sarà intrecciata con l'applicazione che la server, complicando futuri aggiornamenti, spostamenti, ecc.


Hm, se ho capito bene mod_proxy_html non è in grado di aggiungere nuovi snipet di codice completi?
Nodo,

Non sono sicuro, ora che hai aggiunto altro, la risposta del comandante Tomalak suona meglio. Direi che sei nella terra degli hacker, la creazione di pagine web non è proprio ciò per cui Apache è, ma per servire contenuti.
Kyle Brandt,

Pensavo che ci fosse forse una sorta di proxy standalone che potrebbe riscrivere pagine HTML. Qualcosa come MySQL Proxy per MySQL. Forse Privoxy potrebbe farlo.
Nodo,

@Kyle Brandt: LOL - Penso che la menzione del grado militare ti renda ufficialmente un trekkie. Questo ha dato un senso alla mia giornata. :)
Tomalak,

4

Preferirei farlo con mod_rewrite e SSI.

Innanzitutto inserisci il percorso in una variabile di ambiente

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

quindi elaboralo nel file shtml

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

(parti di questa soluzione sono basate su una domanda stackover /programming/40133/getting-apache-to-modify-static-webpages-on-the-fly/1196832 )


1
Il motivo principale per cui si desidera utilizzare shtml per questo è che la chiamata di un CGI esterno per ogni richiesta potrebbe causare problemi di caricamento.
Alex Lehmann,

4

mod_sed si adatta bene qui. È possibile creare un filtro di output che corrisponda alla testa di chiusura o al tag body, ad esempio, e inserire il codice HTML prima di esso.



1

È possibile utilizzare Apache mod_substitute per iniettare html nelle risposte in uscita utilizzando alcuni criteri o espressioni regolari. Ecco una spiegazione di come raggiungere questo obiettivo.


1

puoi guardare nella direttiva header e footer di apache, usando le direttive qui sotto.

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

Altre letture sono qui: http://wannabe.guru.org/scott/hobbies/apache/


1

Mod Layout è ora obsoleto e se non vuoi il sovraccarico di chiamare uno script esterno, la migliore soluzione che ha funzionato per me è stata la modifica . Puoi usare mod sed per abbinare la prima riga di doc (1s) e aggiungere il codice di script dell'intestazione lì e abbinare l'ultima riga ($ s) e inserire il piè di pagina 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"

0

posso inserire html in tutte le pagine tramite Apache, ma solo per il sito ospitato dal mio apache, non tutto il sito tramite il mio server proxy apache.

funziona così. ho impostato un XAMPP, scaricare mod_layout 5.1 per apache 2.4. (installare mod_layout è semplice, se usi XAMPP per Windows, scarica mod_layout.so 5.1 per Windows e inseriscilo nella cartella del modulo apache $ home / apache / module, quindi aggiungi il DSO di configurazione al tuo httpd.conf LoadModule layout_module module / mod_layout.so - se si utilizza Linux o altri sistemi operativi, è necessario scaricare mod_layout.so per Linux, quindi eseguire il comando make per installare)

Dopo aver installato mod_layout.so per Windows, inserisci questo codice nel tuo file .htaccess o httpd.conf per ottenere l'inserimento html in tutta la tua pagina:

<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 è dove metti il ​​tuo file html o php, nella mia situazione è C: /xampp/apache/cgi-bin/footer.php, ma puoi metterlo ovunque , dai solo la strada giusta, starai bene

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.