我有一个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)