Search code examples
visual-studio-2012msdeploy

updating url rewriting rule with vs2012 web deployment web.config transformations


I can't figure out how to get my web.config deployment transformation to work for a rewrite rule. I've tried the following and it ignores it.

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">


 <system.webServer>
 <rewrite xdt:Transform="Replace">
  <rules>

    <rule name="Force HTTPS On Login/Register" stopProcessing="true">
      <match url="Account/Login(.*)|Register(.*)" ignoreCase="true" />
      <conditions>
        <add input="{HTTPS}" pattern="^OFF$" />
      </conditions>
      <action type="Redirect" url="https://{HTTP_HOST}/{R:0}" redirectType="Permanent" />
    </rule>


    <rule name="Force HTTPS Off" stopProcessing="true">
      <match url="((Account/Login(.*))|(Register(.*)))" negate="true" ignoreCase="true" />
      <conditions>
        <add input="{HTTPS}" pattern="^ON$" ignoreCase="true" />
      </conditions>
      <action type="Redirect" url="http://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" />
    </rule>


  </rules>
 </rewrite>
</system.webServer>

Solution

  • I use SlowCheetah to transform my web.config for production. I originally tried what you tried, but found that I had to add an empty

    <rewrite>
      <rules />
    </rewrite>
    

    to the base web.config

    and then write a transform like

    <system.webServer>
        <rewrite>
          <rules>
            <rule name="Redirect to HTTPS" stopProcessing="true" xdt:Transform="Insert">
              <match url="(.*)" />
              <conditions>
                <add input="{HTTPS}" pattern="^OFF$" />
              </conditions>
              <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
            </rule>
          </rules>
        </rewrite>
    </system.webServer>
    

    (that is a redirect transform, but I think the same principal should apply).

    Note xdt:Transform="Insert" to insert a new node into the skeletal <rules /> in the base config file.