Context: Azure, Windows Server 2012 R2, IIS 8
The standard rewrite providers in IIS 8 are {
and '}' and these are used in various contexts to represent captures, replacements and symbols, e.g. {C:0}
, {R:1}
, {HTTP_ORIGIN}
.
I'm trying to use a rule to inject Google Tag Manager markup into a page.
<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>
This does NOT work as the JavaScript contains {
and IIS's UrlRewrite tool immediately complains with a yellow box reading The rewrite provider " w[l]=w[l]||[];w[l].push( { 'gtm.start'" does not exist
(note that it terminates at the :
which would separate the usual R
or C
from the numeric qualifier.)
I have tried swapping {
with {
but this doesn't work well, giving me the following in the generated web page:
<!DOCTYPE HTML>
<html lang="en">
<head><!-- 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 -->
<meta charset="UTF-8"/>
Naturally the browser complains about dodgy JavaScript code.
IIS has been around for a long time. I expect the solution is obvious to someone. What is the usual thing to do to make inclusion of JavaScript possible?
LATER
It has been suggested that I google with the word "inject". Cool idea. Results?
- Microsoft demonstrates how to insert a JavaScript comment.
- Webtuna demonstrates how to inject a reference to an online resource, but not a slab of JavaScript code. This would work fine if it wasn't for the fact that I'm trying to embed a GTM block.
- EG Innovations has lots of good info but again the code sample provided doesn't contain braces.