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.

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.


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


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.


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 )


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.



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ąć.


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/


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"

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.