Google标记管理器包括在Apache中传递mod安全规则的

Google标记管理器包括在Apache中传递mod安全规则的,apache,iframe,google-tag-manager,mod-security,Apache,Iframe,Google Tag Manager,Mod Security,我一直在考虑在我的网站上使用Google Tag Manager,但由于默认的Google include代码被我服务器上的mod security安装阻止,我在第一个关卡就失败了: 标准GTM包括以下代码: <!-- Google Tag Manager --> <noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-XXXXXX" height="0" width="0" style="d

我一直在考虑在我的网站上使用Google Tag Manager,但由于默认的Google include代码被我服务器上的mod security安装阻止,我在第一个关卡就失败了:

标准GTM包括以下代码:

<!-- Google Tag Manager -->
<noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-XXXXXX"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-XXXXXX');</script>
<!-- End Google Tag Manager -->
触发的规则是ids 981000和981001

我可以理解为什么mod security可能认为带有“display:none;visibility:hidden”的iframe可能是恶意的,删除style属性会阻止触发规则981001,但由于规则981000,请求仍然失败

981000似乎对宽度和高度属性应该是什么有强烈的意见,但我尝试将它们设置为“1”和“10”,但没有效果:-(

是否有人知道如何格式化iframe以符合此规则?或者如何更改GTM包含代码,使其不包含iframe

谢谢

PS:我知道你可以通过删除整个noscript区域来解决这个问题,但是我正在寻找一个不会改变include代码功能的解决方案

PPS:这是规则981000所匹配的模式,在我的大脑在嵌套的捕获组云中爆炸之前,我可以理解其中的一半;-)

Pattern match“]+?\b(?:width | height)\b\W*?=\W*?[”]?[^“'1-9]*?(?:(?:(?:20?\.\d*))(?![\d%.])[0-3](?:\.\d*)?”

经过大量实验,我发现以下代码有效:

<!-- Google Tag Manager -->
<noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-XXXXXX"
height="21" width="21" class ="noDisplay"></iframe></noscript>
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-XXXXXX');</script>
<!-- End Google Tag Manager -->
该代码现在通过mod security,并以谷歌的预期方式(基本上)在页面中包含GTM


我希望这能帮助其他人解决同样的问题:-)

很好的解决方案,谢谢你给出答案!在时间紧迫的情况下急需帮助

新推荐的GTM实现建议将代码分为两部分,因此为了每个人的利益,下面是我如何修改上述答案以符合首选实现的。它还可以防止403禁止的错误

要在
中添加到尽可能高的位置:

<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-XXXXXX');</script>
<!-- End Google Tag Manager -->
<!-- Google Tag Manager (noscript) -->
<noscript><iframe src=""https://www.googletagmanager.com/ns.html?id=GTM-XXXXXX""
height=""21"" width=""21"" class =""noDisplay""></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->
所有这些都归功于@下划线EZ的原始解决方案,使我得以实现上述目标

.noDisplay {
display:none;
visibility:hidden;
}
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-XXXXXX');</script>
<!-- End Google Tag Manager -->
<!-- Google Tag Manager (noscript) -->
<noscript><iframe src=""https://www.googletagmanager.com/ns.html?id=GTM-XXXXXX""
height=""21"" width=""21"" class =""noDisplay""></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->
.noDisplay {display:none;visibility:hidden;}