3

我一直在试验woopra.com一个网络分析工具。这需要将一段 javascript 代码添加到每个页面才能运行。对于具有通用页眉或页脚的更多动态站点,这很容易,但对于完全静态的 html 页面则不然。

我试图通过使用 Apache 重写和 SSI 的组合来解决它,用所需的代码“包装”静态 html。例如...

我对我的 apache 配置进行了以下更改

    RewriteEngine On
    RewriteCond %{REQUEST_URI} !=test.shtml
    RewriteCond %{IS_SUBREQ}  false 
    RewriteRule (.*)\.html test.shtml?$1.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 模块可以做同样的事情。最好可以在每个站点的基础上进行配置。

谢谢

彼得

4

4 回答 4

2

我认为mod_filter_ext是您正在寻找的模块。例如,您可以编写一个简短的 Perl 脚本来在页面中插入 JS 代码并将其注册以处理 HTML 页面:

while (<>) {
    s/<html>/\Q<script>....\E/;
    print $_;
}

你甚至可以使用类似的东西sed来执行替换。

于 2008-09-02T17:53:01.620 回答
1

如果页面是静态的,为什么要动态更改它们而不是预处理站点上的所有页面,将所需的 javascript 添加到每个页面?这很简单而且可能更有效(您的浏览量可能比要更改的页面多)

这可以通过很多方式完成。我建议使用一个小的 perl 来进行内联替换。

于 2008-09-02T18:43:02.703 回答
0

好的,上面的方法最大的问题是它会通过在标签之外放置一个脚本标签来破坏你的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 $1}')))
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*\):.*$/\1/' /var/tmp/tempfile.txt)
fi
exit 0
于 2009-01-29T01:05:18.270 回答
0

您可能会遇到语法错误,因为$page它不包含在引号中,但是不包含在引号中的两个主要原因如下:

  • 包含虚拟应该以 / 开头的路径,在您的示例中,查询字符串应该是 /abc.html ,而不是 abc.html
  • 重写规则也应该从路径开始,所以重写规则必须是

    RewriteRule ^(.*)\.html /test.shtml?$1.html
    
于 2009-07-28T21:25:24.623 回答