【问题标题】:Getting Apache to modify static webpages on the fly让 Apache 动态修改静态网页
【发布时间】:2010-09-07 14:18:06
【问题描述】:

我一直在试验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 templates filtering ssi


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

        这里有一个简单的例子{假设脚本部分可以在&lt;/head&gt;之前添加 并且&lt;/head&gt; 位于换行符的开头

        #!/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
        

        【讨论】:

          【解决方案4】:

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-09-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-02-08
            相关资源
            最近更新 更多