VirtualHost 模块在交付给客户之前搜索和替换 HTML 网站代码
VirtualHost module to search and replace HTML website code before delivered to client
我想用以下内容替换 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 部分执行此操作,因为我无法直接修改网站代码。
我在考虑一些像 mod_substitute、mod_sed、mod_include 这样的 apache 模块。
我需要将这个 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
我想用以下内容替换 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 部分执行此操作,因为我无法直接修改网站代码。
我在考虑一些像 mod_substitute、mod_sed、mod_include 这样的 apache 模块。
我需要将这个 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