Jak wstrzyknąć kod HTML do każdej dostarczonej strony HTML?

23

Mam taki, Apache web serverktóry dostarcza statyczne strony HTML. Z jakiegoś powodu nie mogę zmienić samych plików, ale nadal chcę wstrzyknąć trochę kodu HTML na każdą obsługiwaną stronę.

Czy to jest możliwe mod_proxy? Jeśli nie, czy ktoś mógłby polecić oprogramowanie, które zapewnia taką funkcję?

EDYCJA: Muszę wstawić baner reklamowy (np. A javascript) i piksel śledzący.

Węzeł
źródło

Odpowiedzi:

18

Możesz to zrobić: Pracuj z mod_rewrite, aby zmienić żądania

/some/static/page.html

do

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

następnie użyj PHP (lub cokolwiek, co uważasz za stosowne), aby manipulować plikami. Dodaj wyjściową pamięć podręczną, aby poprawić wydajność.

Alternatywnie, handlery Apache wydają się pomocne:

Modyfikowanie zawartości statycznej za pomocą skryptu CGI

Poniższe dyrektywy spowodują, że żądania plików z html rozszerzeniem wyzwalają uruchomienie footer.plskryptu CGI.

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

Następnie skrypt CGI jest odpowiedzialny za wysyłanie pierwotnie żądanego dokumentu (wskazanego przez PATH_TRANSLATEDzmienną środowiskową) i dokonywanie wszelkich wymaganych modyfikacji lub uzupełnień.

Jest to mniej więcej to, co zrobiłoby podejście mod_rewrite, tylko przy mniejszym hakowaniu.

Tomalak
źródło
Czy ktoś może podać przykład rozwiązania mod_rewrite? (w szczególności zawartość htmlinjector.php)
Asaf
1
Dla tych z was zmaga się z tym - nie zapomnieć ScriptAliasi <Directory /some/static/>...</Directory>, <Directory /path/to/cgi-bin/> Options +ExecCGI</Directory>itd. Nie chcę ingerować w odpowiedzi użytkownika, ale jeśli poprosisz, dam więcej informacji.
Sridhar Sarnobat
@asdf Przykład: <?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) ?>użyj $ content, aby załadować resztę zawartości strony. możesz zapisać ten plik jako htmlinjector.php lub cokolwiek i nazwać go w swoim pliku htaccess w następujący sposób:Options +FollowSymLinks RewriteEngine On RewriteCond %{REQUEST_FILENAME} /some/static/page.html RewriteRule ^(.*)$ /htmlinjector.php?url=/some/static/page.html
Gabriel Nwoffiah II
20

Nie jestem pewien, dlaczego nie wymieniono tego na liście odpowiedzi. Przepraszam, jeśli zajęło mi to 2 lata, aby zobaczyć to pytanie ...

Najłatwiejszym i najskuteczniejszym sposobem na robienie tego, co chcesz robić, jest filtr Apache .

Po prostu mieć:

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

Możliwy skrypt:

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

Spowoduje to zmianę wszystkich „a” na „A”.

Pamiętaj, aby włączyć filtr w httpd.conf, tak jak to:

LoadModule ext_filter_module libexec/apache2/mod_ext_filter.so

To pytanie zajmuje naprawdę wysokie miejsce w Google i nie ma tam zbyt wiele forów

Merc
źródło
1
To zdecydowanie najlepsze rozwiązanie, jakie udało mi się znaleźć dla podobnego problemu. Bardzo dziękuję za udostępnienie!
harald
4

Oto samouczek na temat używania mod_proxy_html do edycji linków na stronie internetowej (treść). Być może będziesz mógł zastosować tę modyfikację html, którą chcesz.

AKTUALIZACJA: Czy na pewno chcesz wybrać tę trasę? Myślę, że Apache ma na celu dostarczanie treści, a nie ich tworzenie. Prawdopodobnie przejdzie to w części widokowej frameworka MVC. Nie polecam tego, bo łamiesz zasadę modułowości . Twoja aplikacja internetowa będzie przeplatana z aplikacją obsługującą ją, co komplikuje przyszłe aktualizacje, przeniesienia itp.

Kyle Brandt
źródło
Hm, jeśli dobrze to zrobię, mod_proxy_html nie jest w stanie dodać kompletnych nowych fragmentów kodu?
Węzeł
Nie jestem pewien, skoro już dodałeś więcej, odpowiedź komandora Tomalaka brzmi lepiej. Powiedziałbym, że jesteś w krainie hakerów, tworzenie stron internetowych nie jest tak naprawdę po to, do czego służy Apache, lecz do udostępniania treści.
Kyle Brandt
Myślałem, że istnieje jakiś niezależny serwer proxy, który mógłby przepisać strony HTML. Coś jak MySQL Proxy dla MySQL. Może Privoxy mógłby to zrobić.
Węzeł
@Kyle Brandt: LOL - Myślę, że wzmianka o randze wojskowej oficjalnie czyni cię trekkierem. To poprawiło mój dzień. :)
Tomalak
4

Wolałbym to zrobić z mod_rewrite i SSI.

Najpierw umieść ścieżkę w zmiennej środowiskowej

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

następnie przetworz to w pliku shtml

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

(części tego rozwiązania są oparte na pytaniu dotyczącym przepływu stosu /programming/40133/getting-apache-to-modify-static-webpages-on-the-fly/1196832 )

Alex Lehmann
źródło
1
Moim głównym powodem, dla którego chcę użyć do tego shtml, jest to, że wywołanie zewnętrznego CGI dla każdego żądania może powodować problemy z ładowaniem.
Alex Lehmann
4

mod_sed pasuje tutaj. Możesz na przykład utworzyć filtr wyjściowy pasujący do zamykającej znacznika head lub body i wstawić przed nim swój HTML.

Cwarden
źródło
1

Możesz użyć mod_substitute Apache, aby wstrzyknąć HTML do odpowiedzi wychodzących przy użyciu niektórych kryteriów lub wyrażeń regularnych. Oto wyjaśnienie, jak to osiągnąć.

Kayvan
źródło
1

możesz zajrzeć do nagłówka i stopki dyrektywy apache, korzystając z poniższych dyrektyw.

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

Więcej lektur znajduje się tutaj: http://wannabe.guru.org/scott/hobbies/apache/

Roy Rico
źródło
1

Mod Layout jest teraz przestarzały i jeśli nie chcesz nakładać się na wywołanie zewnętrznego skryptu, najlepszym rozwiązaniem, które działało dla mnie, było mododowanie . Możesz użyć mod sed, aby dopasować pierwszy wiersz doc (1s) i dodać tam kod skryptu nagłówka i dopasować ostatni wiersz ($ s) i umieścić tam stopkę.

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
źródło
0

mogę wstawiać html do wszystkich stron za pośrednictwem Apache, ale tylko w przypadku witryny obsługiwanej przez mój apache, nie wszystkie witryny za pośrednictwem serwera proxy Apache.

tak to działa. skonfigurowałem XAMPP, pobierz mod_layout 5.1 dla apache 2.4. (instalacja mod_layout jest prosta, jeśli używasz XAMPP dla systemu Windows, po prostu pobierz mod_layout.so 5.1 dla systemu Windows i umieść go w folderze modułu apache $ home / apache / module, a następnie dodaj config DSO do swojego modułu httpd.conf LoadModule moduły układu / mod_layout.so - jeśli używasz linuxa lub innego systemu operacyjnego, powinieneś pobrać mod_layout.so dla systemu Linux, a następnie uruchomić komendę make, aby zainstalować)

Po zainstalowaniu mod_layout.so dla systemu Windows, po prostu umieść ten kod w pliku .htaccess lub httpd.conf, a otrzymasz wstawkę HTML na całą stronę:

<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 to miejsce, w którym umieszczasz swój plik HTML lub php, w mojej sytuacji jest to C: /xampp/apache/cgi-bin/footer.php, ale możesz go umieścić gdziekolwiek , podaj właściwą ścieżkę, wszystko będzie dobrze

Leon Kaden
źródło