通过apache服务器内的服务器端过滤动态包含piwik代码

ark*_*cha 5 apache filter substitution matomo inclusion

经过几个小时毫无结果的尝试后,我想通过一个简单的设置向大家请教一点帮助:

对于我使用apache2 http服务器运行的一堆Web应用程序和站点,我使用Piwik进行简单的统计概述.这很好.令我恼火的是,每增加一个应用程序/页面和每次更新/升级,我都必须小心手动维护piwik所需的javascript代码以包含在html标记中.

为了简化维护,我希望通过apache添加代码:我想使用一些apache模块:mod_filter,mod_env,mod_substitute和mod_include.我们的想法是通过过滤器将所有html文件与piwik代码一起注入.该过滤器使用替换来为</body>标记添加占位符.该占位符再次是由服务器端包含处理的sgml标记.该包含最终用piwik代码替换占位符,该代码以动态方式给出了所需的数字站点ID.

因此,配置新虚拟主机时剩下的就是在apache配置中指定两行:

  1. 包括存储在小文件中的过滤器设置
  2. 通过设置环境变量来指定数字piwik站点id

没有更多的摆弄应用程序内的模板文件!


我非常接近解决方案,缺少一步......

也许你们中的一些大师在这里发现了我所缺少的东西!


虚拟主机的(简单易用)配置:

<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>
Run Code Online (Sandbox Code Playgroud)

上面包含的(缩短的)配置文件:

# 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
Run Code Online (Sandbox Code Playgroud)

最后文件/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 } ?>
Run Code Online (Sandbox Code Playgroud)

到目前为止我的工作:

  • 基于php的动态piwik scniplet正在工作,我可以用浏览器调用它,并查看html标记源代码中的代码,其中包含从配置中定义的环境变量中获取的数字id以用于测试目的.此外,当我指定一个nin-numeric id时,我得到了预期的占位符<!-- invalid piwik site id: ... -->
  • 该过滤器作品(施加)在一般:该</body>标签通过占位符代替.我可以通过注释掉FilterProvider在开头添加INCLUDES指令来检查这一点.在这种情况下,我在生成的html标记中看到占位符.
  • 那个FilterProvider实际上是由apache识别和执行的:在我有关于Options +Includes配置等缺失的错误之前,已经解决了,apache不再抱怨了.当上面提到的FilterProvider 没有被注释掉时,也会再次删除占位符.所以我假设包含过程正在运行.
  • 显然问题不在于服务器端包含引用了PHP脚本.我得到没有错误消息和测试与静态文件相反没有显示差异.

看起来好像设置工作正常,没有抛出错误,重写日志中没什么奇怪的.然而,尽管包含过滤器显然可以使用我希望包含的内容是空的.由第一个SUBSTITUTE步骤插入的占位符将再次由第二个INCLUDE步骤替换.但不幸的是,空的内容,所以它被删除.我不知道为什么.