如何在每个交付的HTML页面中注入HTML代码?


23

我有Apache web server提供静态HTML页面的。由于某些原因,我无法更改文件本身,但是我仍然想在正在提供的每个页面中注入一些HTML。

这可能mod_proxy吗?如果没有,谁能推荐具有这种功能的软件?

编辑:我必须插入某种横幅广告(例如javascript)和一个跟踪像素。

Answers:


18

您可以这样做:使用mod_rewrite更改来自的请求

/some/static/page.html

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

然后使用PHP(或任何您认为合适的方法)进行文件操作。添加输出缓存以提高性能。

另外,Apache处理程序听起来很有帮助:

使用CGI脚本修改静态内容

以下指令将导致对具有html 扩展名的文件的请求触发footer.plCGI脚本的启动 。

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

然后,CGI脚本负责发送最初请求的文档(由PATH_TRANSLATED环境变量指向 )并进行所需的修改或添加。

这或多或少是mod_rewrite方法所能做的,只有很少的黑客。


有人可以举一个mod_rewrite解决方案的例子吗?(具体来说就是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 '18

20

我不确定为什么答案列表中没有提到这一点。抱歉,我花了两年时间才看到这个问题...

做您想做的事的最简单,最强大的方法是使用Apache过滤器

只需:

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”更改为“ A”。

确保在httpd.conf中启用过滤器,如下所示:

LoadModule ext_filter_module libexec/apache2/mod_ext_filter.so

这个问题在Google中的排名确实很高,而在论坛方面却没有多少


1
到目前为止,这是最好的解决方案,我能够找到类似的问题。非常感谢您的分享!
哈拉尔德

4

这是有关如何使用mod_proxy_html编辑网页上的链接(内容)的教程。您可能可以应用此修改所需的html。

更新:确定要走这条路线吗?我认为Apache旨在提供内容,而不是创建内容。这可能会出现在MVC框架的视图部分。我不推荐这样做的原因是您违反了模块化规则。您的Web应用程序将与为其提供服务器的应用程序交织在一起,从而使将来的升级,移动等复杂化。


嗯,如果我理解正确,mod_proxy_html是否无法添加完整的新代码段?
节点

不确定,既然您添加了更多内容,Tomalak指挥官的回答听起来会更好。我会说,您身处黑客之地,创建网页并不是Apache真正的目的,而是用于提供内容的。
凯尔·布​​兰特

我坚信可能存在某种可以重写html页面的独立代理。类似于MySQL的MySQL代理。也许Privoxy可以做到这一点。
节点

@凯尔·勃兰特(Kyle Brandt):大声笑-我认为正式提到军衔会让你感到迷茫。这让我很快乐。:)
Tomalak

4

我更愿意使用mod_rewrite和SSI来做到这一点。

首先将路径放入环境变量

RewriteCond%{IS_SUBREQ}否
RewriteRule ^(/.* \。html)/page.shtml [E:文件名:$ 1]

然后在shtml文件中进行处理

<!-#include virtual =“ $ filename”->

(此解决方案的部分内容基于stackoverflow问题/programming/40133/getting-apache-to-modify-static-webpages-on-the-fly/1196832


1
我想为此使用shtml的主要原因是,为每个请求调用一个外部CGI可能会导致加载问题。
亚历克斯·莱曼

4

mod_sed非常适合这里。例如,您可以创建与关闭的head或body标签匹配的输出过滤器,并在其前面插入html。



1

您可以使用Apache mod_substitute将HTML插入到使用某些条件或正则表达式的响应中。 是如何实现此目的的说明。


1

您可以使用以下指令查看apache的header和footer指令。

<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

Mod Layout现在已过时,如果您不希望调用外部脚本的开销,那么对我最有效的最佳解决方案是mod 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

我可以通过Apache将html插入所有页面,但是只能插入由我的apache托管的网站,而不是通过apache代理服务器的所有网站。

这就是它的工作方式。我设置了XAMPP,为Apache 2.4下载了mod_layout 5.1。(安装mod_layout很简单,如果您在Windows上使用XAMPP,只需在Windows上下载mod_layout.so 5.1,然后将其放在apache模块文件夹$ home / apache / module中,然后将config DSO添加到您的httpd.conf中即可。LoadModule layout_module modules / mod_layout.so-如果您使用的是Linux或其他操作系统,则应下载适用于Linux的mod_layout.so,然后运行make命令进行安装)

在Windows下安装mod_layout.so之后,只需将此代码放在您的.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,但是您可以将其放置在任何位置,只要提供正确的路径,您就可以了

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.