Làm cách nào để tiêm mã HTML vào mỗi trang HTML được phân phối?


23

Tôi đã có một Apache web servertrang cung cấp các trang HTML tĩnh. Vì một số lý do, tôi không thể tự thay đổi các tệp, nhưng tôi vẫn muốn đưa một số HTML vào mỗi trang đang được phục vụ.

Điều này có thể với mod_proxy? Nếu không, có ai có thể giới thiệu một phần mềm cung cấp tính năng như vậy không?

EDIT: Tôi phải chèn một số loại quảng cáo biểu ngữ (ví dụ: a javascript) và pixel theo dõi.

Câu trả lời:


18

Bạn có thể làm điều này: Làm việc với mod_rewrite để thay đổi yêu cầu từ

/some/static/page.html

đến

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

sau đó sử dụng PHP (hoặc bất cứ điều gì bạn thấy phù hợp) để thực hiện thao tác tệp. Thêm một bộ đệm đầu ra để cải thiện hiệu suất.

Thay thế, Trình xử lý Apache nghe có vẻ hữu ích:

Sửa đổi nội dung tĩnh bằng cách sử dụng tập lệnh CGI

Các chỉ thị sau đây sẽ gây ra yêu cầu cho các tệp có html phần mở rộng để kích hoạt khởi chạy footer.pltập lệnh CGI.

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

Sau đó, tập lệnh CGI chịu trách nhiệm gửi tài liệu được yêu cầu ban đầu (được chỉ ra bởi PATH_TRANSLATEDbiến môi trường) và thực hiện bất kỳ sửa đổi hoặc bổ sung nào mong muốn.

Đây ít nhiều là những gì phương pháp mod_rewrite sẽ làm, chỉ với ít tin tặc hơn.


Ai đó có thể đưa ra một ví dụ về giải pháp mod_rewrite không? (cụ thể là nội dung của htmlinjection.php)
Asaf

1
Đối với những người bạn đang vật lộn với điều này - đừng quên ScriptAlias<Directory /some/static/>...</Directory>, <Directory /path/to/cgi-bin/> Options +ExecCGI</Directory>v.v. Tôi không muốn làm xáo trộn câu trả lời của người dùng nhưng nếu bạn yêu cầu, tôi sẽ cung cấp thêm thông tin.
Sridhar Sarnobat

@asdf Ví dụ: <?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) ?>sử dụng $ content để tải phần còn lại của nội dung trang. bạn có thể lưu tệp này dưới dạng htmlinbit.php hoặc bất cứ thứ gì và gọi nó trong tệp htaccess của bạn như thế này:Options +FollowSymLinks RewriteEngine On RewriteCond %{REQUEST_FILENAME} /some/static/page.html RewriteRule ^(.*)$ /htmlinjector.php?url=/some/static/page.html
Gabriel Nwoffiah II

20

Tôi không chắc tại sao điều này không được đề cập trong danh sách câu trả lời. Xin lỗi nếu tôi mất 2 năm để xem câu hỏi này ...

Cách dễ nhất, mạnh nhất để làm những gì bạn muốn làm những gì bạn muốn là sử dụng bộ lọc Apache .

Chỉ có:

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

Một kịch bản có thể:

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

Điều này sẽ thay đổi tất cả "a" thành "A" s.

Hãy chắc chắn bật bộ lọc trong httpd.conf của bạn, như thế này:

LoadModule ext_filter_module libexec/apache2/mod_ext_filter.so

Câu hỏi này được xếp hạng thực sự trong Google và không có nhiều về mặt diễn đàn


1
Đó là giải pháp tốt nhất, tôi đã có thể tìm ra một vấn đề tương tự. Cám ơn rất nhiều vì đã chia sẻ!
harald

4

Dưới đây là hướng dẫn về cách sử dụng mod_proxy_html để chỉnh sửa các liên kết trên trang web (nội dung). Bạn có thể áp dụng điều này để sửa đổi html mà bạn muốn.

CẬP NHẬT: Bạn có chắc chắn muốn đi tuyến đường này? Tôi nghĩ rằng Apache có nghĩa là để phục vụ nội dung, không tạo ra nó. Điều này có thể sẽ đi vào phần xem của khung công tác MVC. Lý do tôi không khuyên điều này là bạn đang phá vỡ quy tắc mô đun hóa . Ứng dụng web của bạn sẽ được đan xen với ứng dụng máy chủ đó, làm phức tạp các nâng cấp, di chuyển trong tương lai, v.v.


Hừm, nếu tôi hiểu đúng thì mod_proxy_html không có khả năng thêm các đoạn mã mới hoàn chỉnh?
Nút

Không chắc chắn, bây giờ bạn đã thêm nhiều hơn, câu trả lời của Chỉ huy Tomalak nghe tốt hơn. Tôi đang nói về vùng đất của tin tặc, tôi nói rằng việc tạo các trang web không thực sự là mục đích của Apache, nó là để phục vụ nội dung.
Kyle Brandt

Tôi nghĩ rằng có thể có một số loại proxy độc lập có thể viết lại các trang html. Một cái gì đó giống như Proxy Proxy cho MySQL. Có lẽ Privoxy có thể làm điều này.
Nút

@Kyle Brandt: LOL - Tôi nghĩ rằng việc đề cập đến cấp bậc quân đội chính thức khiến bạn trở thành một trekkie. Điều này làm cho ngày của tôi. :)
Tomalak

4

Tôi muốn làm điều này với mod_rewrite và SSI.

Đầu tiên đặt đường dẫn vào một biến môi trường

RewriteCond% {IS_SUBREQ} sai
RewriteRule ^ (/.* \. Html) /page.shtml [E: tên tệp: $ 1]

sau đó xử lý nó trong tập tin shtml

<! - # bao gồm virtual = "$ tên tệp" ->

(các phần của giải pháp này dựa trên câu hỏi stackoverflow /programming/40133/getting-apache-to-modify-static-webpages-on-the-fly/1196832 )


1
Lý do chính của tôi muốn sử dụng shtml cho việc này là vì việc gọi CGI bên ngoài cho mỗi yêu cầu có thể gây ra sự cố tải.
Alex Lehmann

4

mod_sed là một phù hợp tốt ở đây. Ví dụ, bạn có thể tạo bộ lọc đầu ra khớp với thẻ đóng hoặc thẻ body và chèn html của bạn trước nó.



1

Bạn có thể sử dụng Apache mod_substolarship để đưa html vào các phản hồi gửi đi bằng cách sử dụng một số tiêu chí hoặc biểu thức thông thường. Dưới đây là một lời giải thích làm thế nào để đạt được điều này.


1

bạn có thể xem chỉ thị đầu trang và chân trang của apache, Sử dụng các lệnh dưới đây.

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

Đọc thêm tại đây: http://wannabe.guru.org/scott/hobbies/apache/


1

Giao diện Mod hiện đã lỗi thời và nếu bạn không muốn gọi thêm một tập lệnh bên ngoài, giải pháp tốt nhất phù hợp với tôi là mod sed . Bạn có thể sử dụng mod sed để khớp dòng đầu tiên của doc (1s) và thêm mã tập lệnh tiêu đề ở đó và khớp dòng cuối ($ s) và đặt chân trang ở đó.

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

tôi có thể chèn html vào tất cả các trang thông qua Apache, nhưng chỉ cho trang web được lưu trữ bởi apache của tôi, không phải tất cả các trang web mặc dù máy chủ proxy apache của tôi.

đây là cách nó hoạt động tôi thiết lập XAMPP, tải mod_layout 5.1 cho apache 2.4. (cài đặt mod_layout rất đơn giản, nếu bạn sử dụng XAMPP cho windows, chỉ cần tải xuống mod_layout.so 5.1 cho windows và đặt nó vào thư mục mô-đun apache của bạn $ home / apache / module, sau đó thêm DSO cấu hình vào mô-đun httpM.ule LoadModule layout_module / mod_layout.so - nếu bạn sử dụng linux hoặc hệ điều hành khác, bạn nên tải xuống mod_layout.so cho linux, sau đó chạy lệnh make để cài đặt)

Sau khi cài đặt mod_layout.so cho windows, chỉ cần đặt mã này vào tệp .htaccess của bạn hoặc httpd.conf bạn sẽ nhận được chèn html vào tất cả trang của bạn:

<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 là nơi bạn đặt tệp html hoặc php của mình, trong trường hợp của tôi là C: /xampp/apache/cgi-bin/footer.php, nhưng bạn có thể đặt nó ở bất kỳ đâu , chỉ cần đưa ra con đường đúng, bạn sẽ ổn thôi

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.