Gönderilen her HTML sayfasına HTML kodu nasıl enjekte edilir?


23

Ben Apache web serverstatik HTML sayfaları sunan bir tane var . Bazı nedenlerden dolayı dosyaları değiştiremiyorum ama hala sunulan her sayfaya bir miktar HTML enjekte etmek istiyorum.

Bu mümkün mü mod_proxy? Olmazsa, kimse böyle bir özellik sağlayan bir yazılım önerebilir mi?

EDIT: Bir tür banner reklamı (örneğin a javascript) ve bir izleme pikseli eklemeliyim .

Yanıtlar:


18

Bunu yapabilirsiniz: İstekleri değiştirmek için mod_rewrite ile çalışın

/some/static/page.html

için

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

daha sonra dosya işleme yapmak için PHP (veya uygun bulursanız) kullanın. Performansı artırmak için bir çıktı önbelleği ekleyin.

Alternatif olarak, Apache İşleyicileri size yardımcı olacaktır:

Bir CGI betiği kullanarak statik içeriği değiştirme

Aşağıdaki yönergeler html , footer.plCGI betiğinin başlatılmasını tetikleyecek dosya uzantılarına yönelik isteklere neden olacaktır .

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

Daha sonra, CGI betiği, orijinal olarak istenen belgeyi ( PATH_TRANSLATEDortam değişkeninin gösterdiği şekilde ) göndermek ve istenilen değişiklikleri veya eklemeleri yapmaktan sorumludur .

Bu, mod_rewrite yaklaşımının yapacağı şeydir, ancak daha az korsanlıkla.


Birisi mod_rewrite çözümünün bir örneğini verebilir mi? (özellikle htmlinjector.php içeriği)
Asaf

1
Bu mücadele o sizin için - unutma ScriptAliasve <Directory /some/static/>...</Directory>, <Directory /path/to/cgi-bin/> Options +ExecCGI</Directory>ben kullanıcının cevap kurcalamak istemiyorum ama eğer talep, daha fazla bilgi verecektir vb.
Sridhar Sarnobat 23:16

@ asdf Örnek: <?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) ?>sayfa içeriğinin kalanını yüklemek için $ içerik kullanın. Bu dosyayı htmlinjector.php veya her neyse olarak kaydedebilir ve htaccess dosyanızda Options +FollowSymLinks RewriteEngine On RewriteCond %{REQUEST_FILENAME} /some/static/page.html RewriteRule ^(.*)$ /htmlinjector.php?url=/some/static/page.html
şöyle çağırabilirsiniz

20

Bunun cevap listesinde neden bahsedilmediğinden emin değilim. Bu soruyu görmem 2 yıl sürdü ise özür dilerim ...

İstediğinizi yapmak için en kolay ve en güçlü yol Apache filtresi kullanmaktır .

Sadece var:

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

Olası bir komut dosyası:

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

Bu, tüm "a" lar "A" larla değiştirilecektir.

Httpd.conf dosyanızdaki filtreyi şu şekilde etkinleştirdiğinizden emin olun:

LoadModule ext_filter_module libexec/apache2/mod_ext_filter.so

Bu soru Google’da gerçekten sıralanıyor ve forumlarda çok fazla bir şey yok.


1
Bu kadarıyla en iyi çözüm, benzer bir problem için bulabildim. Paylaşım için çok teşekkür ederiz!
12'de

4

Bir web sayfasındaki bağlantıları (içerik) düzenlemek için mod_proxy_html'in nasıl kullanılacağı hakkında bir öğretici . Bu değişikliği istediğiniz html ile uygulayabilirsiniz.

GÜNCELLEME: Bu rotaya gitmek istediğinize emin misiniz? Apache'nin içerik değil, içerik sunma amaçlı olduğunu düşünüyorum. Bu muhtemelen bir MVC çerçevesinin görüş kısmına gider. Bunu önermememin nedeni modülerlik kuralını çiğnemeniz . Web uygulamanız, onu sunucuya uygulayan, gelecekteki güncellemeleri, hamleleri vb. Karmaşık hale getiren uygulamalarla iç içe geçecektir.


Hm, doğru yaparsam mod_proxy_html tam yeni kod parçacıkları ekleyemiyor mu?
Düğüm

Emin değilim, şimdi daha fazlasını eklediniz, Komutan Tomalak'ın cevabı daha iyi. Söyleyeceğim korsanlık diyarındasınız, web sayfaları oluşturmak gerçekten Apache'nin amacı değil, içerik sunmak içindir.
Kyle Brandt

Html sayfalarını yeniden yazabilecek bir tür bağımsız proxy olduğunu düşündüm. MySQL için MySQL Proxy gibi bir şey. Belki de Privoxy bunu yapabilir.
Düğüm

@Kyle Brandt: LOL - Bence askeri rütbeden bahsetmek resmen sizi bir trekkie yapar. Bu benim günümü yarattı. :)
Tomalak

4

Bunu mod_rewrite ve SSI ile yapmayı tercih ederim.

İlk önce yolu bir ortam değişkenine koyun

RewriteCond% {IS_SUBREQ} yanlış
RewriteRule ^ (/.* \. Html) /page.shtml [E: dosya adı: $ 1]

sonra onu shtml dosyasında işleyin

<! - # virtual dahil = "$ dosyaadı" ->

(bu çözümün bölümleri /programming/40133/getting-apache-to-modify-static-webpages-on-the-fly/1196832’de bir yığın akışı sorusuna dayanmaktadır )


1
Bunun için shtml kullanmak istememin temel nedeni, her istek için harici bir CGI çağırmanın yükleme sorunlarına neden olabileceğidir.
Alex Lehmann

4

mod_sed burada uygun. Örneğin, kapanış başlığına veya gövde etiketine uyan bir çıkış filtresi oluşturabilir ve önce html'nizi ekleyebilirsiniz.



1

Bazı ölçütler veya normal ifadeler kullanarak html'ye giden yanıtları enjekte etmek için Apache mod_substitute kullanabilirsiniz. İşte bunun nasıl başarılacağı hakkında bir açıklama.


1

Aşağıdaki yönergeleri kullanarak, apache üstbilgi ve altbilgi direktifine bakabilirsiniz.

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

Daha fazla okuma burada: http://wannabe.guru.org/scott/hobbies/apache/


1

Mod Layout artık modası geçmiş durumda ve harici bir script çağırmanın genel giderini istemiyorsanız, benim için çalışan en iyi çözüm mod sed oldu . Mod sed'i ilk satırın doc'ına (1s) eşleştirmek ve orada üstbilgi kod kodu eklemek ve son satırı ($ s) eşleştirmek ve altbilgiyi buraya koymak için kullanabilirsiniz.

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

Apache üzerinden tüm sayfalara html ekleyebilirim, ancak yalnızca apache proxy sunucum olsa sitem değil, apache tarafından barındırılan site için.

bu nasıl çalışır. Bir XAMPP kurdum, apache 2.4 için mod_layout 5.1'i indirdim. (mod_layout'u yüklemek basittir, eğer Windows için XAMPP kullanıyorsanız, windows için mod_layout.so 5.1 dosyasını indirip, apache modül klasörünüze $ home / apache / modülüne koyun, daha sonra httpd.conf LoadModule layout_module module / mod_layout.so - linux veya diğer işletim sistemlerini kullanıyorsanız, linux için mod_layout.so dosyasını indirmelisiniz, sonra yüklemek için make komutunu çalıştırmalısınız)

Mod_layout.so dosyasını windows için yükledikten sonra, bu kodu .htaccess dosyasına veya httpd.conf dosyasına koymanız yeterli olacaktır.

<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, html veya php dosyanızı koyduğunuz yerdir, benim durumumda C: /xampp/apache/cgi-bin/footer.php, ancak herhangi bir yere koyabilirsiniz , sadece doğru yolu ver, iyi olacaksın

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.