我有一个提供静态HTML页面的Apache web server
。 出于某种原因,我不能自己改变这些文件,但是我仍然希望在每一个被提供的页面中注入一些HTML。
这是可能的mod_proxy
? 如果没有,任何人都可以推荐一个提供这样的function的软件?
编辑:我必须插入某种横幅广告(例如一个javascript
)和一个跟踪像素。
你可以这样做:使用mod_rewrite来改变请求
/some/static/page.html
至
/htmlinjector.php?url=/some/static/page.html
然后使用PHP(或任何您认为合适的)来执行文件操作。 添加输出caching以提高性能。
另外, Apache Handlers听起来很有帮助:
使用CGI脚本修改静态内容
以下指令将导致对具有
html
扩展名的文件的请求触发启动footer.pl
CGI脚本。Action add-footer /cgi-bin/footer.pl AddHandler add-footer .html
然后,CGI脚本负责发送最初请求的文档(由
PATH_TRANSLATED
环境variables指向),并进行所需的修改或添加。
这或多或less是mod_rewrite方法所能做到的,只不过是less了些嘲弄。
我不知道为什么这个答案没有被提及。 对不起,如果我花了2年看到这个问题…
最简单,最强大的方式来做你想做的事情就是使用Apachefilter 。
只要有:
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 = fopen('php://stdin', 'r'); while($line = fgets($stdin)){ $line = preg_replace('/a/','A',$line); fwrite($stdout, $line); } ?>
这将把所有的“a”变成“A”。
确保在你的httpd.conf中启用filter,如下所示:
LoadModule ext_filter_module libexec/apache2/mod_ext_filter.so
这个问题在谷歌里真的很好,而且在论坛方面没有太多的东西
这里是一个关于如何使用mod_proxy_html编辑网页上的链接(内容) 的教程 。 你可能可以应用这个修改你想要的html。
更新:你确定要走这条路吗? 我认为Apache是为了服务内容,而不是创造它。 这可能会在MVC框架的视图部分。 我不会推荐这个的原因是你打破了模块化的规则 。 您的Web应用程序将与服务器的应用程序交织在一起,使未来的升级,移动等变得复杂。
我宁愿用mod_rewrite和SSI来做到这一点。
首先把path放到一个环境variables中
RewriteCond%{IS_SUBREQ}为false RewriteRule ^(/.* \。html)/page.shtml [E:filename:$ 1]
然后在shtml文件中处理
<! - #include virtual =“$ filename” - >
(这个解决scheme的一部分是基于一个stackoverflow问题https://stackoverflow.com/questions/40133/getting-apache-to-modify-static-webpages-on-the-fly/1196832 )
mod_sed在这里很合适。 例如,你可以创build一个输出filter来匹配closures的头部或者主体标签,并在它之前插入你的html。
mod_perl模块会有什么用处?
http://search.cpan.org/~gozer/Apache2-Layout-0.6/lib/Apache2/Layout.pm
这可能会做你想做的事情,或者至less让你指向正确的方向。
您可以使用Apache mod_substitute将html插入到使用某些条件或正则expression式的传出响应中。 这里是如何做到这一点的解释。
你可以看看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/
我可以通过Apache插入到所有页面的HTML,但只为我的apache托pipe的网站,而不是所有的网站,虽然我的Apache代理服务器。
这是如何工作的。 我build立了一个XAMPP,为apache 2.4下载mod_layout 5.1。 (安装mod_layout很简单,如果你使用XAMPP for windows,只需下载mod_layout.so 5.1 for windows,并把它放到你的apache模块文件夹$ home / apache / module,然后将config DSO添加到你的httpd.conf中LoadModule layout_module modules / mod_layout.so – 如果你使用的是linux或其他操作系统,你应该下载mod_layout.so for linux,然后运行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,但是你可以把它放在任何地方,只要给出正确的道路,你会没事的
Mod Layout现在已经过时了,如果你不想调用外部脚本的开销,那么对我来说最好的解决scheme就是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"