VirtualHost模块在交付给客户端之前搜索和替换HTML网站代码


VirtualHost module to search and replace HTML website code before delivered to client

我想把VirtualHost的</body>元素替换为:

<!-- Piwik -->
<script type="text/javascript">
  var _paq = _paq || [];
  _paq.push(['trackPageView']);
  _paq.push(['enableLinkTracking']);
  (function() {
    var u="//stats.mydomain.com/";
    _paq.push(['setTrackerUrl', u+'piwik.php']);
    _paq.push(['setSiteId', '1']);
    var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
    g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s);
  })();
</script>
<noscript><p><img src="//stats.mydomain.com/piwik.php?idsite=1" style="border:0;" alt="" /></p></noscript>
<!-- End Piwik Code --></body>

我需要在VirtualHost部分中这样做,因为我不能直接修改网站代码。

我正在考虑一些apache模块,如mod_substitute, mod_sed, mod_include。

我需要将PIWIK统计代码添加到每个页面。

这样好吗?这个模型中哪一个最适合做这个?或许还有别的解决办法?

下面是mod_ext_filter的解决方案,它看起来非常强大:

  1. 启用Apache模块:

    a2enmod ext_filter
    
  2. 在Apache配置文件中,在VirtualHost部分添加过滤器定义:

    ExtFilterDefine my_html_filter mode=output intype=text/html cmd="/usr/bin/php5 /var/www/data/myfilter.php"
    SetOutputFilter my_html_filter
    
    • ExtFilterDefine -该指令定义过滤器
    • my_html_filter -这是我们的过滤器名称
    • mode=output -告诉Apache处理响应
    • intype=text/html -指定应该过滤的文档的MIME类型
    • cmd="/usr/bin/php5 /var/www/data/myfilter.php" -指定要运行的外部命令
    • SetOutputFilter -该指令激活过滤器
  3. PHP文件/var/www/data/myfilter.php内容:

    <?php
    $stdin = fopen('php://stdin', 'r');
    while($line = fgets($stdin)){
     $line = str_replace('</body>',"
    <!-- Piwik -->
    <script type='text/javascript'>
      var _paq = _paq || [];
      _paq.push(['trackPageView']);
      _paq.push(['enableLinkTracking']);
      (function() {
        var u='//stats.mydomain.com/';
        _paq.push(['setTrackerUrl', u+'piwik.php']);
        _paq.push(['setSiteId', '1']);
        var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
        g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s);
      })();
    </script>
    <noscript><p><img src='//stats.mydomain.com/piwik.php?idsite=1' style='border:0;' alt='' /></p></noscript>
    <!-- End Piwik Code -->
    </body>", $line);
     echo $line;
    }
    fclose( $stdin );
    ?>
    
  4. 重新启动Apache:

    service apache2 restart