如何将 HTML 代码注入到每个传送的 HTML 页面中?

如何将 HTML 代码注入到每个传送的 HTML 页面中?

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

这可能吗mod_proxy?如果不行,有人能推荐一款提供此功能的软件吗?

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

答案1

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

/some/static/page.html

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

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

作为备选,Apache 处理程序听起来很有帮助:

使用 CGI 脚本修改静态内容

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

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

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

这或多或少就是 mod_rewrite 方法所能做的事情,只是黑客手段较少。

答案2

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

最简单、最有效的方法就是使用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

这个问题在谷歌上排名很高,但在论坛上却没有太多相关内容

答案3

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

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

答案4

我更喜欢使用 mod_rewrite 和 SSI 来实现这一点。

首先将路径放入环境变量中

RewriteCond %{IS_SUBREQ} false
重写规则 ^(/.*\.html) /page.shtml [E=文件名:$1]

然后在 shtml 文件中处理它

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

该解决方案的部分内容基于 stackoverflow 问题: https://stackoverflow.com/questions/40133/getting-apache-to-modify-static-webpages-on-the-fly/1196832

相关内容