我一直在尝试 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 模块可以做同样的事情。优选地,可以基于每个站点进行配置。

谢谢

彼得

有帮助吗?

解决方案

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

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

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

其他提示

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

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

好的,上面的方法最大的问题是它会通过在 html 之外放置一个 script 标签来破坏你的 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

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

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

    RewriteRule ^(.*)\.html /test.shtml?$1.html
    
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top