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>