让Apache动态修改静态网页

时间:2008-09-02 17:45:39

标签: apache templates filtering ssi

我一直在试验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 个答案:

答案 0 :(得分:2)

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

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

您甚至可以使用sed之类的内容来执行替换。

答案 1 :(得分:1)

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

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

答案 2 :(得分: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

答案 3 :(得分:0)

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

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

    RewriteRule ^(.*)\.html /test.shtml?$1.html