让Apache即时修改静态网页
时间:2020-03-05 18:46:37 来源:igfitidea点击:
我一直在尝试woopra.com一个网络分析工具。这需要将一段javascript代码添加到每个页面才能运行。对于具有通用页眉或者页脚的动态站点,这很容易,但对于完全静态的html页面却不是。
我试图通过结合使用Apache重写和SSI来解决此问题,以用所需的代码"包装"静态html。例如...
我对我的apache配置进行了以下更改
RewriteEngine On RewriteCond %{REQUEST_URI} !=test.shtml RewriteCond %{IS_SUBREQ} false RewriteRule (.*)\.html test.shtml?.html
test.shtml文件包含...
<script type="text/javascript"> var XXXXid = 'xxxxxxx'; </script> <script src="http://xxxx.woopra.com/xx/xxx.js"></script> <!--#set var="page" value="$QUERY_STRING" --> <!--#include virtual= $page -->
想法是,有一个请求
/abc.html
将被重定向到
/test.shtml?abc.html
然后shtml会将原始文件包含到响应页面中。
不幸的是,它并没有按计划进行:)任何人都可以看到我在做错什么,还是建议其他方法。是否有任何Apache模块可以做同样的事情。优选地,可以基于每个站点进行配置。
谢谢
彼德
解决方案
回答
我认为mod_filter_ext是我们正在寻找的模块。我们可以编写一个简短的Perl脚本,例如在页面中插入JS代码并将其注册以处理HTML页面:
while (<>) { s/<html>/\Q<script>....\E/; print $_; }
我们甚至可以使用诸如sed之类的东西来执行替换。
回答
如果页面是静态的,为什么要动态更改它们,而不是预处理站点上的所有页面,而是向每个页面中添加所需的javascript代码?这很简单并且可能更有效(浏览量可能比要更改的页面要多)
这可以通过很多方法来完成。我建议使用小型Perl进行内联替换。
回答
好的,以上方法的最大问题是,通过将脚本标签放在<html>
标签之外会破坏html有效性
我会同意其他人对html文件(例如sed / awk脚本)运行的预处理程序
这是一个简单的示例{假设可以将脚本部分添加到</ head>
之前
并且</ head>在换行符的开头
#!/bin/bash cd /var/webserver/whatever/ grep -r '<\/head>' */*|grep "^.*\.html*:" >/var/tmp/tempfile.txt ((lines = $(wc -l /var/tmp/dom-tempfile.txt | awk '{print }'))) if [ $lines -gt 0 ] then while read line; do sed 's/<script type="text\/javascript"> var XXXXid = "xxxxxxx"; <\/script><script src="http:\/\/xxxx\.woopra\.com\/xx\/xxx\.js"><\/script><\/head>/^<\/head>/g' $line>/var/tmp/tempfile.htm mv /var/tmp/tempfile.htm $line done < <(sed 's/\(^.*\.html*\):.*$//' /var/tmp/tempfile.txt) fi exit 0
回答
由于$ page
不包含在引号中,因此我们可能会出现语法错误,但是,造成这种错误的两个主要原因如下:
- include virtual应该以/开头的路径,在示例中,查询字符串应为/abc.html,而不是abc.html
- 重写规则也应以路径开头,因此重写规则必须为
RewriteRule ^(.*)\.html /test.shtml?.html