วิธีการฉีดโค้ด HTML ลงในหน้า HTML ที่ส่งมอบทุกครั้งหรือไม่


23

ฉันได้รับApache web serverที่ส่งหน้า HTML คงที่ ด้วยเหตุผลบางอย่างฉันไม่สามารถเปลี่ยนไฟล์ได้ด้วยตัวเอง แต่ฉันก็ยังต้องการที่จะแทรก HTML บางส่วนลงในทุก ๆ เพจที่กำลังแสดงอยู่

เป็นไปได้ด้วยmod_proxyหรือไม่ ถ้าไม่มีใครสามารถแนะนำซอฟต์แวร์ที่มีคุณสมบัติดังกล่าว

แก้ไข: ฉันต้องแทรกโฆษณาแบนเนอร์บางประเภท (เช่นกjavascript) และพิกเซลการติดตาม

คำตอบ:


18

คุณสามารถทำได้: ทำงานกับ mod_rewrite เพื่อเปลี่ยนคำขอจาก

/some/static/page.html

ไปยัง

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

จากนั้นใช้ PHP (หรือสิ่งที่คุณเห็นว่าเหมาะสม) เพื่อจัดการไฟล์ เพิ่มแคชเอาต์พุตเพื่อปรับปรุงประสิทธิภาพ

ตัวเลือกอื่น ๆ ตัวจัดการ Apache ก็มีประโยชน์:

การแก้ไขเนื้อหาแบบคงที่โดยใช้สคริปต์ CGI

คำสั่งต่อไปนี้จะทำให้เกิดการร้องขอไฟล์ที่มีhtml ส่วนขยายเพื่อเปิดใช้งาน footer.plสคริปต์ CGI

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

จากนั้นสคริปต์ CGI จะรับผิดชอบในการส่งเอกสารที่ร้องขอมา แต่เดิม (ชี้ไปที่ PATH_TRANSLATEDตัวแปรสภาพแวดล้อม) และทำการแก้ไขหรือเพิ่มเติมตามที่ต้องการ

นี่คือวิธีที่ mod_rewrite จะทำมากขึ้นหรือน้อยลงโดยเฉพาะกับการแฮ็กที่น้อยกว่า


ใครสามารถยกตัวอย่างของ mod_rewrite solution ได้? (โดยเฉพาะเนื้อหาของ htmlinjector.php)
Asaf

1
สำหรับบรรดาของคุณดิ้นรนกับเรื่องนี้ - ไม่ลืมScriptAliasและ<Directory /some/static/>...</Directory>, <Directory /path/to/cgi-bin/> Options +ExecCGI</Directory>ฯลฯ ฉันไม่ต้องการที่จะยุ่งเกี่ยวกับคำตอบของผู้ใช้ แต่ถ้าคุณขอผมจะให้ข้อมูลเพิ่มเติม
Sridhar Sarnobat

@asdf ตัวอย่าง: <?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) ?>ใช้ $ content เพื่อโหลดเนื้อหาส่วนที่เหลือของหน้า คุณสามารถบันทึกไฟล์นี้เป็น htmlinjector.php หรืออะไรก็ได้แล้วเรียกมันในไฟล์ htaccess ของคุณแบบนี้:Options +FollowSymLinks RewriteEngine On RewriteCond %{REQUEST_FILENAME} /some/static/page.html RewriteRule ^(.*)$ /htmlinjector.php?url=/some/static/page.html
Gabriel Nwoffiah II

20

ฉันไม่แน่ใจว่าทำไมถึงไม่ได้กล่าวถึงในรายการคำตอบ ขออภัยถ้าฉันใช้เวลา 2 ปีในการดูคำถามนี้ ...

วิธีที่ง่ายและมีประสิทธิภาพมากที่สุดที่จะทำในสิ่งที่คุณต้องการจะทำสิ่งที่คุณต้องการจะใช้ตัวกรองอาปาเช่

เพียงแค่มี:

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

สคริปต์ที่เป็นไปได้:

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

สิ่งนี้จะเปลี่ยน "a" s ทั้งหมดเป็น "A"

อย่าลืมเปิดใช้งานตัวกรองใน httpd.conf เช่นนี้:

LoadModule ext_filter_module libexec/apache2/mod_ext_filter.so

คำถามนี้ได้รับการจัดอันดับอย่างแท้จริงใน Google และมีไม่มากในแง่ของฟอรัม


1
นั่นคือทางออกที่ดีที่สุดที่ฉันสามารถค้นหาปัญหาที่คล้ายกัน ขอบคุณมากสำหรับการแบ่งปัน!
แฮรัลด์

4

นี่คือบทเรียนเกี่ยวกับวิธีใช้mod_proxy_htmlเพื่อแก้ไขลิงก์ในหน้าเว็บ (เนื้อหา) คุณอาจสามารถใช้การปรับเปลี่ยนนี้กับ html ที่คุณต้องการ

UPDATE: คุณแน่ใจหรือไม่ว่าต้องการไปเส้นทางนี้ ฉันคิดว่า Apache มีจุดประสงค์เพื่อแสดงเนื้อหาไม่ใช่สร้างขึ้น นี่อาจเป็นไปในมุมมองส่วนหนึ่งของกรอบงาน MVC เหตุผลที่ฉันไม่อยากจะแนะนำเป็นคุณจะทำลายการปกครองของต้นแบบ เว็บแอปพลิเคชันของคุณจะเชื่อมโยงกับแอปพลิเคชันที่เซิร์ฟเวอร์มันทำให้การอัพเกรดในอนาคตมีความซับซ้อนมากขึ้น


อืมถ้าฉันเข้าใจถูกต้อง mod_proxy_html ไม่สามารถเพิ่มโค้ดใหม่ที่สมบูรณ์ได้หรือไม่
โหนด

ไม่แน่ใจว่าตอนนี้คุณได้เพิ่มแล้วคำตอบของ Commander Tomalak ฟังดูดีขึ้น คุณอยู่ในดินแดนแห่งการแฮ็กเกอร์ผมอยากจะบอกว่าการสร้างหน้าเว็บไม่ได้เป็นอย่างที่ Apache ทำไว้สำหรับการแสดงเนื้อหา
Kyle Brandt

ฉันคิดว่าอาจมีพร็อกซีสแตนด์อะโลนบางประเภทที่สามารถเขียนหน้า html ได้อีกครั้ง บางอย่างเช่น MySQL Proxy สำหรับ MySQL บางที Privoxy ก็สามารถทำได้
โหนด

@ Kyle Brandt: LOL - ฉันคิดว่าการพูดถึงตำแหน่งทหารอย่างเป็นทางการทำให้คุณกลายเป็น trekkie นี่ทำให้วันของฉัน :)
Tomalak

4

ฉันต้องการทำสิ่งนี้กับ mod_rewrite และ SSI

ก่อนอื่นให้วางพา ธ ลงในตัวแปรสภาพแวดล้อม

RewriteCond% {IS_SUBREQ} false
RewriteRule ^ (/.* \. html) /page.shtml [E: ชื่อไฟล์: $ 1]

จากนั้นประมวลผลในไฟล์ shtml

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

(บางส่วนของโซลูชันนี้ใช้คำถามสแต็คโอเวอร์โฟลว์/programming/40133/getting-apache-to-modify-static-webpages-on-the-fly/1196832 )


1
เหตุผลหลักที่ฉันต้องการใช้ shtml สำหรับสิ่งนี้คือการเรียก CGI ภายนอกสำหรับแต่ละคำขออาจทำให้เกิดปัญหาในการโหลด
Alex Lehmann

4

mod_sedเป็นแบบที่ดีที่นี่ คุณสามารถสร้างตัวกรองผลลัพธ์ที่ตรงกับส่วนหัวหรือแท็กปิดตัวและใส่ html ก่อนหน้า


1

โมดูล mod_perl จะมีประโยชน์หรือไม่?

http://search.cpan.org/~gozer/Apache2-Layout-0.6/lib/Apache2/Layout.pm

นั่นอาจทำในสิ่งที่คุณต้องการหรืออย่างน้อยก็ชี้คุณไปในทิศทางที่ถูกต้อง


ขอบคุณฉันจะดูในขณะนี้เรามีแนวโน้มที่จะhttpd.apache.org/docs/2.0/handler.htmlด้วย footer.pl ที่กำหนดเอง
โหนด

1

คุณสามารถใช้ Apache mod_substitute เพื่อฉีด html ลงในการตอบกลับขาออกโดยใช้เกณฑ์หรือนิพจน์ทั่วไป นี่คือคำอธิบายวิธีการบรรลุเป้าหมายนี้


1

คุณสามารถดูคำสั่งส่วนหัวและส่วนท้ายของ Apache โดยใช้คำสั่งด้านล่าง

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

อ่านเพิ่มเติมได้ที่นี่: http://wannabe.guru.org/scott/hobbies/apache/


1

มดเค้าโครงอยู่ในขณะนี้ล้าสมัยและถ้าคุณไม่ต้องการค่าใช้จ่ายของการเรียกสคริปต์ภายนอกทางออกที่ดีที่สุดซึ่งทำงานให้ฉันได้พอควร sed คุณสามารถใช้ mod sed เพื่อจับคู่บรรทัดแรกของ doc (1s) และเพิ่มรหัสสคริปต์ส่วนหัวที่นั่นและจับคู่บรรทัดสุดท้าย ($ s) และวางท้ายกระดาษ

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

ฉันสามารถแทรก html ไปยังทุกหน้าผ่าน Apache แต่เฉพาะสำหรับไซต์ที่โฮสต์โดย apache ของฉันไม่ใช่ทุกไซต์ผ่านทางพร็อกซีเซิร์ฟเวอร์ apache ของฉัน

นี่คือวิธีการทำงาน ฉันตั้งค่า XAMPP ให้ดาวน์โหลด mod_layout 5.1 สำหรับ apache 2.4 (ติดตั้ง mod_layout เป็นเรื่องง่ายถ้าคุณใช้ XAMPP สำหรับ windows เพียงแค่ดาวน์โหลด mod_layout.so 5.1 สำหรับ windows และนำไปไว้ในโฟลเดอร์โมดูล apache ของคุณ $ home / apache / โมดูลจากนั้นเพิ่ม config DSO ของคุณ httpd.conf LoadModule layout_module modules / mod_layout.so - หากคุณใช้ linux หรือระบบปฏิบัติการอื่นคุณควรดาวน์โหลด mod_layout.so สำหรับ linux จากนั้นให้รันคำสั่ง make เพื่อติดตั้ง)

หลังจากติดตั้ง mod_layout.so สำหรับ windows เพียงแค่ใส่รหัสนี้ลงในไฟล์. htaccess หรือ httpd.conf คุณจะได้รับการแทรก html ในทุกหน้าของคุณ:

<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 หรือ php ของคุณในสถานการณ์ของฉันคือ C: /xampp/apache/cgi-bin/footer.php แต่คุณสามารถใส่มันที่ไหนก็ได้ เพียงแค่ให้เส้นทางที่ถูกต้องคุณจะสบายดี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.