经过几个小时的徒劳尝试,我想请大家通过一个简单的设置提供一点帮助:
对于使用apache2 http服务器运行的大量web应用程序和站点,我使用皮维克进行简单的统计概述。效果很好。让我烦恼的是,对于每一个额外的应用程序/页面和每一次更新/升级,我都必须小心地手动维护piwik需要包含到html标记中的javascript代码。
为了简化维护,我想让apache添加代码:我想使用一些apache模块: mod_filter、mod_env、mod_substitute和mod_include。其想法是通过过滤器将所有html文件与piwik代码一起注入。该过滤器使用替换在</body>标记前面加上占位符。这个占位符是服务器端包含的sgml标记。该包含最终将占位符替换为piwik代码,该代码以动态方式给出了所需的数字站点id。
因此,在配置新的虚拟主机时,只需在apache配置中指定两行:
不要再摆弄程序中的模板文件了!
我离解决方案很近,还差一步.
也许你们中的一些大师会发现我错过了什么!
虚拟主机的(大大简化的)配置:
<VirtualHost *:80>
ServerAdmin www@domain.here
ServerName some.domain.here
# include local piwik setup
SetEnv PIWIK_ID 5
Include /etc/apache2/vhosts.d/_internal.inc
DocumentRoot /some/path/here
<Directory "/some/path/here">
Options None
AllowOverride none
Order allow,deny
Allow from all
</Directory>
</VirtualHost>上面包含的(缩短的)配置文件:
# some internal resources
<Directory "/srv/www/internal">
Options None
AllowOverride None
Order deny,allow
Allow from all
</Directory>
# ----------
# internal requests to include the piwik tracking code at the bottom of every html page
# prepare required filters
FilterDeclare filter_PIWIK
FilterProvider filter_PIWIK SUBSTITUTE resp=Content-Type $text/html
FilterProvider filter_PIWIK INCLUDES resp=Content-Type $text/html
FilterChain filter_PIWIK SUBSTITUTE 's|</body>|<!--#include virtual="/piwik" --></body>|ni'
# map virtual request to the file system
Alias /piwik /srv/www/internal/piwik.php最后一个文件/srv/www/internal/piwik.php在上面的Alias中引用:这是提供piwik代码的文件。就像piwik自己计算的一样,除了一件事:数值站点索引被动态替换为来自环境变量的值。
<?php
define('piwikBase','domain.here/stats/');
define('piwikSite',apache_getenv('PIWIK_ID'));
if(is_numeric(piwikSite)){
?>
<!-- Piwik: begin tracking code -->
<script type="text/javascript">
var pkBaseURL = (("https:" == document.location.protocol) ? "https://<?php echo piwikBase; ?>" : "http://<?php echo piwikBase; ?>");
document.write(unescape("%3Cscript src='" + pkBaseURL + "piwik.js' type='text/javascript'%3E%3C/script%3E"));
</script><script type="text/javascript">
try {
var piwikTracker = Piwik.getTracker(pkBaseURL + "piwik.php", <?php echo piwikSite; ?>);
piwikTracker.trackPageView();
piwikTracker.enableLinkTracking();
} catch( err ) {}
</script><noscript><p><img src="http://<?php echo piwikBase; ?>piwik.php?idsite=<?php echo piwikSite; ?>" style="border:0" alt="" /></p></noscript>
<!-- Piwik: end tracking code -->
<?php } else { ?>
<!-- invalid piwik site id: <?php echo piwikSite;?> -->
<?php } ?>我到目前为止所做的工作:
<!-- invalid piwik site id: ... -->。</body>标记被占位符替换。我可以通过注释掉FilterProvider来检查这一点,在开始时添加包含指令。在这种情况下,我看到生成的html标记中的占位符。Options +Includes和类似的错误进行排序之前,apache不再抱怨了。另外,当上面提到的FilterProvider未被注释掉时,占位符再次被移除。因此,我假设包含过程是有效的。看起来,安装工作正常,没有抛出错误,重写日志中没有什么奇怪的地方。然而,尽管包含过滤器可以独立工作,但我希望包含的内容是空的。由第一替代步骤插入的占位符再次替换为第二包含步骤。但不幸的是,由空的内容,所以它被删除。我不知道为什么。
发布于 2012-12-09 13:48:35
好吧,我自己找到答案了。这是我第六次尝试挖掘,最后我成功了。我所要做的就是改变过滤器代码的定义和用法。其他一切都很好:
FilterDeclare PIWIK_token
FilterProvider PIWIK_token SUBSTITUTE resp=Content-Type $text/html
SUBSTITUTE 's|</body>|<!--#include virtual="/piwik" --></body>|ni'
FilterDeclare PIWIK_code
FilterProvider PIWIK_code INCLUDES resp=Content-Type $text/html
FilterChain PIWIK_token PIWIK_code我很惊讶没有其他人尝试过这样的东西。现在,我可以删除所有的脚本片段插入和如此之多的地方手动,而不必再考虑它们时,进行升级,或当我添加网页或整个网站。我所需要的是使用这两行指定站点piwik id。太棒了。
2013-01-23年度最新情况:
我已经使用这个解决方案几个星期了,没有发现一个问题的设置。所以我做了个简短的描述。这帮了一个人:
Piwik跟踪和自动片段包含
发布于 2012-12-09 03:45:27
似乎是个好主意..。但是ajax加载的数据呢?向xml或json返回值添加可能会导致数据无效。
你试过吗
<?php include (filewithpiwik); ?>或者更好的是,如果您可以使用Wordpress,有一个插件将自动添加到所有页面。
https://stackoverflow.com/questions/13637714
复制相似问题