【问题标题】:Dynamic inclusion of piwik code by means of server side filtering inside apache server通过 apache 服务器内的服务器端过滤动态包含 piwik 代码
【发布时间】:2012-11-18 05:32:29
【问题描述】:

经过几个小时徒劳无功的尝试,我想请大家帮忙做一个简单的设置:

对于我使用 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>

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

# 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

上面Alias 中引用的最后一个文件/srv/www/internal/piwik.php: 这是提供 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 } ?>

到目前为止我的工作:

  • 基于 php 的动态 piwik scniplet 正在工作,我可以使用浏览器调用它,并查看 html 标记源中的代码,其中包含从配置中定义的环境变量中获取的数字 id,用于测试目的。此外,当我以这种方式指定一个 nin 数字 id 时,我得到了预期的占位符 &lt;!-- invalid piwik site id: ... --&gt;
  • 过滤器通常有效(已应用):&lt;/body&gt; 标签 替换为占位符。我可以通过注释掉在开头添加 INCLUDES 指令的 FilterProvider 来检查这一点。在这种情况下,我会在生成的 html 标记中看到占位符。
  • 那个FilterProvider实际上是被apache识别和执行的:在我出现配置中缺少Options +Includes等错误之前,已经解决了,apache不再抱怨了。当上面提到的 FilterProvider 被 not 注释掉时,占位符也被再次删除。所以我假设包含过程正在工作。
  • 显然问题不在于服务器端包含引用 php 脚本。我没有收到任何错误消息,并且使用静态文件进行的测试没有任何区别。

似乎设置工作正常,没有抛出错误,重写日志中没有什么奇怪的。但是,尽管包含过滤器显然有效,但我希望包含的内容是空的。第一个 SUBSTITUTE 步骤插入的占位符再次被第二个 INCLUDE 步骤替换。但不幸的是,由于内容为空,因此将其删除。我不知道为什么。

【问题讨论】:

    标签: apache filter substitution matomo inclusion


    【解决方案1】:

    似乎是个好主意.. 但是 ajax 加载的数据呢?添加到 xml 或 json 返回值可能不好,导致数据无效。

    你试过了吗

    <?php include (filewithpiwik); ?>
    

    或者更好的是,如果您可以使用 Wordpress,则有一个 plugin 会自动将其添加到所有页面。

    【讨论】:

    • 过滤器仅适用于两种情况:1.) 输出类型为text/html,因此不涉及 json 和内容,2.) 输出包含结束正文标记,因此 html 片段获胜不要被触动。我认为这是安全的。关于包容:这是可能的。这是通常所做的。这正是我开始此尝试的原因,以便自动包含代码。我有不同的网站,基于不同的代码、自写的例程和静态页面。插件在这里不是解决方案,这是错误的方法。所以感谢您考虑我的问题,但这不是答案。
    【解决方案2】:

    好的,我自己找到了答案。这是第六次尝试挖掘它,最后我成功了。我所要做的就是更改过滤器代码的定义和用法。其他一切都很好:

    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
    

    我很惊讶没有人尝试这样的事情。现在我可以手动删除所有插入的脚本 sn-ps 和许多地方,而无需在升级或添加页面或整个站点时再次考虑它们。我只需要使用提到的这两行来指定站点 piwik id。伟大的。

    2013-01-23 更新

    我已经使用这个解决方案几个星期了,并且没有遇到任何设置问题。所以我做了一个简短的描述。 Mabe 这对某人有帮助:

    > Piwik tracking & automatic snippet inclusion

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-17
      • 1970-01-01
      相关资源
      最近更新 更多