问题描述
上下文:Azure,Windows Server 2012 R2,IIS 8
IIS 8中的标准重写提供程序是{
和'}',它们在各种上下文中用于表示捕获,替换和符号,例如{C:0}
,{R:1}
,{HTTP_ORIGIN}
。
我正在尝试使用规则将Google跟踪代码管理器标记注入页面。
<rule name="Inject GTM After HEAD" preCondition="ResponseIsHtml1" enabled="true">
<match filterByTags="None" pattern="<head.*?>" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="true" />
<action type="Rewrite" value="{R:0}<!-- 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-XXXX');</script> <!-- End Google Tag Manager -->" />
</rule>
不不起作用,因为JavaScript包含{
,并且IIS的UrlRewrite工具立即抱怨,并带有一个黄色框,显示为The rewrite provider " w[l]=w[l]||[];w[l].push( { 'gtm.start'" does not exist
(请注意,它终止于{{1} },它将通常的:
或R
与数字限定符分开。)
我尝试将C
与{
交换,但是效果不佳,在生成的网页中提供了以下内容:
{
自然,浏览器抱怨JavaScript代码不可靠。
IIS已经存在很长时间了。我希望解决方案对某人是显而易见的。使JavaScript成为可能的通常要做的事情是什么?
LATER
有人建议我在Google上输入“ inject”一词。好主意。结果?
- Microsoft演示了如何插入JavaScript注释。
- Webtuna演示了如何注入对在线资源的引用,而不是注入一段JavaScript代码。如果不是因为我要嵌入GTM区块,这将很好用。
- EG Innovations有很多有用的信息,但是提供的代码示例也不包含括号。
解决方法
我将附加一个查询字符串,并在重定向到的页面上有条件地包含您想要的JS。
因此,您会得到类似(来自here的东西)
<rewrite>
<rules>
<rule name="Redirect for download result page" stopProcessing="true">
<match url="(.*)/test.aspx(.*)" />
<action type="Redirect" url="{R:1}/test.aspx?rf=sp" appendQueryString="true" redirectType="Found" />
<conditions>
<add input="{QUERY_STRING}" pattern="flag=value" negate="true" />
</conditions>
</rule>
</rules>
</rewrite>
然后,在您的重定向页面中,有类似的内容(来自here和here)
<script type="text/javascript">
if (window.location.href.indexOf("flag=value") > -1)) {
document.getElementsByTagName("head")[0].innerHTML += ("<script src=\"...\" type=\"text/javascript\"></script>");
}
</script>
,
我已经记录了在DEV使用的过程。
本质上,我们将GTM代码放在其他子域的js文件中,并嵌入带有指向该js文件的src的脚本标签。