Search code examples
htmliishttp-redirectweb-config

Remove HTML extension with web config permanently


I am trying to remove html extension from pages using web.config. Below is the code i am using in web.config file

<rewrite>
  <rules>
    <rule name="rewrite html">
      <match url="(.*)$" />
      <conditions logicalGrouping="MatchAll">
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
        <add input="{REQUEST_FILENAME}" negate="true" pattern="(.*).html" />
      </conditions>
      <action type="Rewrite" url="{R:1}.html" />
    </rule> 
  </rules>
</rewrite>

it is working fine and removing html extension, however there seems to be 2 problems here :

  1. When i put 'slash' it does not work and gives me not found errors. For example: http://example.com/my-page/ now it will not work, but I put http://example.com/my-page then it will work fine, so i would like to both of them to work

  2. Other problem is that .html pages are still opening. For example, if I open the page as http://example.com/my-page.html it is also working but I want it to convert to http://example.com/my-page automatically, I know I can use 301 redirects for this but that will not work as there are many of files here, so I have to use different 301 rules for different URLs.

Please Advice.

Thanks


Solution

  • URLRewrite 2.0 rule (insert this part inside system.webServer node) that replaces .html from url:

    <rewrite>
        <rules>
            <rule name="Hide .html ext">
                <match ignoreCase="true" url="^(.*)"/>
                <conditions>
                    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/>
                    <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true"/>
                    <add input="{REQUEST_FILENAME}.html" matchType="IsFile"/>
                </conditions>
                <action type="Rewrite" url="{R:0}.html"/>
            </rule>
            <rule name="Redirecting .html ext" stopProcessing="true">
                <match url="^(.*).html"/>
                <conditions logicalGrouping="MatchAny">
                    <add input="{URL}" pattern="(.*).html"/>
                </conditions>
                <action type="Redirect" url="{R:1}"/>
            </rule>
        </rules>
    </rewrite>