通过apache服务器内的服务器端过滤动态包含piwik代码
经过几个小时的徒劳尝试后,我想请大家通过一个简单的设置提供一些帮助: 对于我使用apache2 http服务器运行的一系列web应用程序和站点,我使用它进行简单的统计概述。那很好。让我烦恼的是,每增加一个应用程序/页面和每次更新/升级,我都必须注意手动维护piwik需要包含在html标记中的javascript代码 为了简化维护,我想让apache添加代码:我想使用一些apache模块:mod_filter、mod_env、mod_replacement和mod_include。其思想是通过过滤器将所有交付的html文件注入piwik代码。该筛选器使用替换在通过apache服务器内的服务器端过滤动态包含piwik代码,apache,filter,substitution,matomo,inclusion,Apache,Filter,Substitution,Matomo,Inclusion,经过几个小时的徒劳尝试后,我想请大家通过一个简单的设置提供一些帮助: 对于我使用apache2 http服务器运行的一系列web应用程序和站点,我使用它进行简单的统计概述。那很好。让我烦恼的是,每增加一个应用程序/页面和每次更新/升级,我都必须注意手动维护piwik需要包含在html标记中的javascript代码 为了简化维护,我想让apache添加代码:我想使用一些apache模块:mod_filter、mod_env、mod_replacement和mod_include。其思想是通过过滤
标记前面加上占位符。该占位符也是由服务器端包含处理的sgml标记。该包含最终用piwik代码替换占位符,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>
到目前为止,我的工作是:
- 基于php的动态piwik-scniplet正在工作,我可以用浏览器调用它,并查看html标记源代码中的代码,其中包含一个从配置中定义的环境变量中获取的数字id,用于测试。另外,当我以这种方式指定nin数字id时,我会得到预期的占位符
- 过滤器通常起作用(已应用):用占位符替换
标记。我可以通过注释FilterProvider并在开头添加INCLUDES指令来检查这一点。在这种情况下,我会在生成的html标记中看到占位符李> - 该FilterProvider实际上是由apache识别和执行的:在我发现配置中缺少的
等错误之前,apache不再抱怨了。当上面提到的FilterProvider没有被注释掉时,占位符也会再次被删除。所以我假设include过程正在工作李>Options+Includes
- 问题不在于服务器端包含引用了php脚本。我没有收到错误消息,使用静态文件进行的测试没有显示任何差异李>
似乎安装工作正常,没有抛出错误,重写日志中没有任何奇怪的内容。然而,尽管include过滤器可以正常工作,但我希望包含的内容是空的。第一个替换步骤插入的占位符将再次替换为第二个包含步骤。但不幸的是,它被空内容删除了。我不知道为什么 似乎是个好主意。。但是ajax加载的数据呢?向xml或json中添加返回值可能是错误的,从而使数据无效 你试过了吗
<?php include (filewithpiwik); ?>
或者更好的是,如果你能使用Wordpress,有一个自动添加到所有页面的工具。好的,我自己找到了答案。这是我第六次尝试去挖掘它,最后我成功了。我所要做的就是更改过滤器代码的定义和用法。其他一切都很好:
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
FilterDeclare PIWIK_令牌
FilterProvider PIWIK_令牌替换resp=内容类型$text/html
替换为“s | | | ni”
FilterDeclare PIWIK_码
FilterProvider PIWIK_代码包括resp=内容类型$text/html
过滤器链PIWIK_令牌PIWIK_代码
我很惊讶没有其他人尝试这样的东西。现在,我可以手动删除所有插入的脚本片段和许多地方,而无需在升级或添加页面或整个站点时再次考虑它们。我所需要的就是使用上面提到的两行指定站点piwik id。太好了
2013年1月23日更新:
我已经使用这个解决方案几个星期了,在设置上没有遇到任何问题。所以我做了一个简短的描述。也许这有助于某人:
>过滤器仅在两种情况下适用:1.)输出类型为
text/html
,因此不会触动json和stuff;2.)输出包含结束正文标记,因此不会触动html snipplets。我认为那是安全的。关于包容:这是可能的。这是通常的做法。这正是我开始尝试的原因,因此代码会自动包含。我有不同的网站作为书面,根据不同的代码,自行编写的例程和静态页面。在这里,插件不是解决方案,它是错误的方法。谢谢你思考我的问题,但这不是答案。
<?php include (filewithpiwik); ?>
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