If you’re migrating to a new website and need to map old IDs to new IDs, I’ve just discovered that the UrlRewrite plugin in IIS has a great feature I hadn’t come across before called rewriteMaps. This means instead of writing a whole bunch of indentical looking rewrite rules, you can write one – and then simply list the ID mappings.
The syntax of the RegEx takes a bit of getting used to, but in our case we needed to map
/(various|folder|names|here)/display.asp?id=[ID]
to a new website url that looked like this:
/show/[NewId]
You can define a rewriteMap very simply – most examples I saw included full URLs here, but we just used the ID maps directly:
<rewriteMaps>
<rewriteMap name="Articles">
<add key="389" value="84288" />
<add key="525" value="114571" />
<add key="526" value="114572" />
</rewriteMap>
</rewriteMaps>
You can reference a rewriteMap using {MapName:{SomeCapturedValue}}, so if SomeCapturedValue equalled 525 then you’d get back 114571 in the list above.
Because we’re looking to match a querystring based id, and you can’t match queryString parameters in the primary match clause, we needed to add a condition, and then match on that captured condition value instead, using an expression like this:
http://www.newdomain.com/show/{Articles:{C:1}}/
The final rule XML follows:
<rule name="Redirect rule for Articles" stopProcessing="true">
<match url="(articles|java|dotnet|xml|databases|training|news)/display\.asp" />
<conditions>
<add input="{QUERY_STRING}" pattern="id=([0-9]+)" />
</conditions>
<action type="Redirect" url="http://www.developerfusion.com/show/{Articles:{C:1}}/" appendQueryString="false" />
</rule>