Bagaimana cara menyuntikkan kode HTML ke setiap halaman HTML yang dikirim?

23

Saya punya Apache web serveryang memberikan halaman HTML statis. Untuk beberapa alasan saya tidak dapat mengubah file sendiri, tetapi saya masih ingin menyuntikkan beberapa HTML ke setiap halaman yang dilayani.

Apakah ini mungkin mod_proxy? Jika tidak, adakah yang bisa merekomendasikan perangkat lunak yang menyediakan fitur seperti itu?

EDIT: Saya harus memasukkan beberapa jenis iklan banner (mis. A javascript) dan piksel pelacakan.

Node
sumber

Jawaban:

18

Anda bisa melakukan ini: Bekerja dengan mod_rewrite untuk mengubah permintaan

/some/static/page.html

untuk

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

lalu gunakan PHP (atau apa pun yang menurut Anda sesuai) untuk melakukan manipulasi file. Tambahkan cache output untuk meningkatkan kinerja.

Sebagai alternatif, Apache Handlers terdengar membantu:

Memodifikasi konten statis menggunakan skrip CGI

Arahan berikut akan menyebabkan permintaan file dengan html ekstensi untuk memicu peluncuran footer.plskrip CGI.

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

Kemudian skrip CGI bertanggung jawab untuk mengirim dokumen yang diminta semula (ditunjukkan oleh PATH_TRANSLATEDvariabel lingkungan) dan melakukan modifikasi atau penambahan apa pun yang diinginkan.

Ini kurang lebih apa yang akan dilakukan oleh pendekatan mod_rewrite, hanya dengan sedikit peretasan.

Tomalak
sumber
Adakah yang bisa memberikan contoh solusi mod_rewrite? (khusus konten htmlinjector.php)
Asaf
1
Bagi Anda yang berjuang dengan ini - jangan lupa ScriptAliasdan <Directory /some/static/>...</Directory>, <Directory /path/to/cgi-bin/> Options +ExecCGI</Directory>dll. Saya tidak ingin mengutak-atik jawaban pengguna tetapi jika Anda meminta, saya akan memberikan lebih banyak info.
Sridhar Sarnobat
@asdf Contoh: <?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) ?>gunakan $ content untuk memuat sisa konten halaman. Anda dapat menyimpan file ini sebagai htmlinjector.php atau apa pun dan menyebutnya dalam file htaccess Anda seperti ini:Options +FollowSymLinks RewriteEngine On RewriteCond %{REQUEST_FILENAME} /some/static/page.html RewriteRule ^(.*)$ /htmlinjector.php?url=/some/static/page.html
Gabriel Nwoffiah II
20

Saya tidak yakin mengapa ini tidak disebutkan dalam daftar jawaban. Maaf jika butuh 2 tahun untuk melihat pertanyaan ini ...

Cara termudah, paling kuat untuk melakukan apa yang ingin Anda lakukan adalah menggunakan filter Apache .

Hanya memiliki:

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

Skrip yang mungkin:

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

Ini akan mengubah semua "a" menjadi "A".

Pastikan untuk mengaktifkan filter di httpd.conf Anda, seperti ini:

LoadModule ext_filter_module libexec/apache2/mod_ext_filter.so

Pertanyaan ini menempati urutan teratas di Google dan tidak ada banyak forum

Merc
sumber
1
Sejauh ini solusi terbaik, saya dapat menemukan masalah serupa. Terima kasih banyak sudah berbagi!
Harald
4

Berikut ini adalah tutorial tentang cara menggunakan mod_proxy_html untuk mengedit tautan pada halaman web (konten). Anda mungkin dapat menerapkan ini memodifikasi html yang Anda inginkan.

UPDATE: Anda yakin ingin menempuh rute ini? Saya pikir Apache dimaksudkan untuk menyajikan konten, bukan membuatnya. Ini mungkin akan pergi di bagian tampilan kerangka kerja MVC. Alasan saya tidak akan merekomendasikan ini adalah Anda melanggar aturan modularitas . Aplikasi web Anda akan terjalin dengan aplikasi server itu, mempersulit upgrade di masa depan, bergerak, dll.

Kyle Brandt
sumber
Hm, jika saya melakukannya dengan benar, mod_proxy_html tidak dapat menambahkan snipet kode baru yang lengkap?
Node
Tidak yakin, sekarang Anda telah menambahkan lebih banyak, jawaban Komandan Tomalak terdengar lebih baik. Anda berada di tanah peretasan yang saya katakan, membuat halaman web sebenarnya bukan untuk apa Apache, itu untuk menyajikan konten.
Kyle Brandt
Saya kira mungkin ada semacam proxy mandiri yang bisa menulis ulang halaman html. Sesuatu seperti MySQL Proxy untuk MySQL. Mungkin Privoxy bisa melakukan ini.
Node
@Kyle Brandt: LOL - Saya pikir penyebutan pangkat militer secara resmi membuat Anda menjadi trekkie. Ini membuat hari saya. :)
Tomalak
4

Saya lebih suka melakukan ini dengan mod_rewrite dan SSI.

Pertama-tama letakkan path ke dalam variabel lingkungan

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

kemudian proses itu di file shtml

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

(bagian dari solusi ini didasarkan pada pertanyaan stackoverflow /programming/40133/getting-apache-to-modify-static-webpages-on-the-fly/1196832 )

Alex Lehmann
sumber
1
Alasan utama saya ingin menggunakan shtml untuk ini adalah karena memanggil CGI eksternal untuk setiap permintaan dapat menyebabkan masalah pemuatan.
Alex Lehmann
4

mod_sed sangat cocok di sini. Anda dapat membuat filter keluaran yang cocok dengan tag kepala atau badan penutup, misalnya, dan masukkan html Anda sebelumnya.

cwarden
sumber
1

Anda dapat menggunakan Apache mod_substitute untuk menyuntikkan html ke respons keluar menggunakan beberapa kriteria atau ekspresi reguler. Berikut ini penjelasan cara mencapai hal ini.

Kayvan
sumber
1

Anda dapat melihat direktif header dan footer dari apache, Menggunakan arahan di bawah ini.

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

Bacaan lebih lanjut ada di sini: http://wannabe.guru.org/scott/hobbies/apache/

Roy Rico
sumber
1

Mod Layout sekarang sudah usang dan jika Anda tidak ingin overhead memanggil skrip eksternal, solusi terbaik yang bekerja untuk saya adalah mod sed . Anda dapat menggunakan mod sed untuk mencocokkan baris pertama doc (1s) dan menambahkan kode skrip header di sana dan mencocokkan baris terakhir ($ s) dan meletakkan footer di sana.

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

saya dapat menyisipkan html ke semua halaman melalui Apache, tetapi hanya untuk situs yang di-host oleh apache saya, tidak semua situs melalui server proxy apache saya.

ini cara kerjanya. saya mengatur XAMPP, unduh mod_layout 5.1 untuk apache 2.4. (instal mod_layout sederhana, jika Anda menggunakan XAMPP untuk windows, cukup unduh mod_layout.so 5.1 untuk windows dan masukkan ke folder modul apache Anda $ home / apache / module, lalu tambahkan konfigurasi DSO ke httpd.conf LoadModule layout_module modules / mod_layout.so - jika Anda menggunakan linux atau os lain, Anda harus mengunduh mod_layout.so untuk linux, kemudian jalankan make command untuk menginstal)

Setelah menginstal mod_layout.so untuk windows, cukup masukkan kode ini pada file .htaccess Anda atau httpd.conf Anda akan mendapatkan html masukkan ke semua halaman Anda:

<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 adalah tempat Anda meletakkan file html atau php Anda, dalam situasi saya adalah C: /xampp/apache/cgi-bin/footer.php, tetapi Anda dapat meletakkannya di mana saja , berikan jalan yang benar, kamu akan baik-baik saja

Leon Kaden
sumber