我想把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的解决方案,它看起来非常强大:
-
启用Apache模块:
a2enmod ext_filter
-
在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
-该指令激活过滤器
-
-
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 ); ?>
-
重新启动Apache:
service apache2 restart