让 Apache 动态修改静态网页

Getting Apache to modify static webpages on the fly

提问人:Vagnerr 提问时间:9/3/2008 最后编辑:HoldOffHungerVagnerr 更新时间:8/31/2020 访问量:4260

问:

我一直在尝试使用 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模块可以做同样的事情。最好可以按站点进行配置。

谢谢

彼得

Apache 模板 过滤 SSI

评论


答:

2赞 Grey Panther 9/3/2008 #1

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

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

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

1赞 Pablo Alsina 9/3/2008 #2

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

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

0赞 Alan Doherty 1/29/2009 #3

好的,上面的方法最大的问题是它会通过在标签之外放置一个脚本标签来破坏你的 HTML 有效性<html>

我同意其他人对您的 HTML 文件(例如 SED/AWK 脚本)进行预处理

这是一个快速示例{假设脚本部分可以添加到 和 is 在换行符的开头</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
0赞 Alex Lehmann 7/29/2009 #4

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

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

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