让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进行内联替换。

回答

好的,以上方法的最大问题是,通过将脚本标签放在&lt;html>标签之外会破坏html有效性

我会同意其他人对html文件(例如sed / awk脚本)运行的预处理程序

这是一个简单的示例{假设可以将脚本部分添加到&lt;/ 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