Anand
Anand

Reputation: 1690

web.config redirect non-www to www

I need to redirect non-www URLs to www URL for both HTTP and HTTPS URLs. I tried following rules in web.config.

<rule name="Redirect to WWW" stopProcessing="true">
    <match url=".*" />
    <conditions>
        <add input="{HTTP_HOST}" pattern="^example.com$" />
    </conditions>
    <action type="Redirect" url="http://www.example.com/{R:0}" redirectType="Permanent" />
</rule>

<rule name="Redirect to WWW https" stopProcessing="true">
    <match url=".*" />
    <conditions>
        <add input="{HTTPS}" pattern="^example.com$" />
    </conditions>
    <action type="Redirect" url="https://www.example.com/{R:0}" redirectType="Permanent" />
</rule>

It works perfectly for non-ssl URL but in case of SSL it redirect from https://example.com to http://www.example.com.

Upvotes: 52

Views: 86848

Answers (8)

Java-Dev
Java-Dev

Reputation: 458

Add these rules to your web config file.

Rule 1: HTTP_to_HTTPS_redirect will redirect your website from HTTP to HTTPS and

Rule 2: Redirect to www will redirect your non-www URL to the www URL.

<rewrite>
  <rules>
    <rule name="HTTP_to_HTTPS_redirect" stopProcessing="true">
      <match url="(.*)" />
      <conditions>
        <add input="{HTTPS}" pattern="^OFF$" />
      </conditions>
      <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" />
    </rule>
    <rule name="Redirect to www" stopProcessing="true">
      <match url="(.*)" />
      <conditions>
        <add input="{HTTP_HOST}" pattern="^example.com$" />
      </conditions>
      <action type="Redirect" url="http://www.example.com/{R:1}" />
    </rule>
  </rules>
</rewrite>

Upvotes: 2

kamran A
kamran A

Reputation: 1

Follow the Step Below

  1. Login to your website's cPanel

  2. Click on Hosting Setting

  3. Select your preferred domain as www.example.com

Upvotes: -4

Mujahid Bhoraniya
Mujahid Bhoraniya

Reputation: 1584

This post is basically for those who need to redirect non-www to www URL in windows hosting.

In web.config file as below code:

<system.webServer>
<rewrite>
<rules>
<rule name=”Redirect example.com to www.example.com HTTP” patternSyntax=”ECMAScript” stopProcessing=”true”>
<match url=”.*” />
<conditions>
<add input=”{HTTP_HOST}” pattern=”^example.com$” />
<add input=”{HTTPS}” pattern=”off” />
</conditions>
<action type=”Redirect” url=”http://www.example.com/{R:0}” redirectType=”Permanent” appendQueryString=”true”/>
</rule>
<rule name=”Redirect example.com to www.example.com HTTPS” patternSyntax=”ECMAScript” stopProcessing=”true”>
<match url=”.*” />
<conditions>
<add input=”{HTTP_HOST}” pattern=”^example.com$” />
<add input=”{HTTPS}” pattern=”on” />
</conditions>
<action type=”Redirect” url=”https://www.example.com/{R:0}” redirectType=”Permanent” appendQueryString=”true”/>
</rule>
</rules>
</rewrite>
</system.webServer>

In the above code please note there are two rules used one for HTTP and another for HTTPS. To avoid clashing of HTTP and HTTPS in the same rule, here used two separate patterns.

I hope it works for you guys…!!

Upvotes: 0

Satpal
Satpal

Reputation: 133453

For a safer rule that works for both Match Any and Match All situations, you can use the Rewrite Map solution. It’s a perfectly good solution with the only drawback being the ever so slight extra effort to set it up since you need to create a rewrite map before you create the rule. In other words, if you choose to use this as your sole method of handling the protocol, you’ll be safe.

You can create a Rewrite Map called MapProtocol, you can use {MapProtocol:{HTTPS}} for the protocol within any rule action.

<rewrite>
  <rules>
    <rule name="Redirect to www" stopProcessing="true">
      <match url="(.*)" />
      <conditions trackAllCaptures="false">
        <add input="{HTTP_HOST}" pattern="^example.com$" />
      </conditions>
      <action type="Redirect"
        url="{MapProtocol:{HTTPS}}://www.example.com/{R:1}" />
    </rule>
  </rules>
  <rewriteMaps>
    <rewriteMap name="MapProtocol">
      <add key="on" value="https" />
      <add key="off" value="http" />
    </rewriteMap>
  </rewriteMaps>
</rewrite>

Reference

Upvotes: 69

Meloman
Meloman

Reputation: 3722

Since 2018, consider to use everytime https (SSL) !

So I use redirect to www and to https together.

<rule name="Redirect to www" stopProcessing="true">
    <match url="(.*)" />
    <conditions trackAllCaptures="false">
        <add input="{HTTP_HOST}" pattern="^example.com$" />
    </conditions>
    <action type="Redirect" url="https://www.example.com/{R:1}" redirectType="Permanent" />
</rule>

<rule name="HTTP/S to HTTPS Redirect" enabled="true" stopProcessing="true">
    <match url="(.*)" />
    <conditions logicalGrouping="MatchAny">
        <add input="{SERVER_PORT_SECURE}" pattern="^0$" />
    </conditions>
    <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" />
</rule>

more info here : https://forums.realmacsoftware.com/t/effective-july-2018-google-s-chrome-browser-will-mark-non-https-sites-as-not-secure/18597

Upvotes: 13

Anjan Kant
Anjan Kant

Reputation: 4316

This worked fine for me:-

<rewrite>
  <rules>
   <rule name="Redirect to WWW" stopProcessing="true">
	<match url=".*" />
	<conditions>
	<add input="{HTTP_HOST}" pattern="^myExample.in$" />
	</conditions>
	<action type="Redirect" url="https://www.myExample.in/{R:0}" redirectType="Permanent" />
</rule>
 </rules>
</rewrite>

Upvotes: 1

Chtioui Malek
Chtioui Malek

Reputation: 11515

Other answers here are unnecessary long, here's the rule i use (just copy and paste) :

<rule name="ensurewww" stopProcessing="true">
  <match url=".*" />
  <conditions>
    <add input="{CACHE_URL}" pattern="^(.+)://(?!www)(.*)" />
  </conditions>
  <action type="Redirect" url="{C:1}://www.{C:2}" redirectType="Permanent" />
</rule>

This will redirect to the www version while preserving the HTTP and HTTPS protocol

Hope this helps.

Upvotes: 26

southz rgw
southz rgw

Reputation: 373

I know this is an old post but it's not fully answered. I ended up extending Satpals answer

First rule catches http + www and second one catches non-www

For some reason i could not use MapProtocol in the fist Rule but it works with https written directly into the url.

<rewrite>
  <rules>
    <rule name="Special case www &amp; HTTPS off" enabled="true" stopProcessing="true">
      <match url="(.*)" />
      <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
        <add input="{HTTP_HOST}" pattern="^www\.example\.com$" />
        <add input="{HTTPS}" pattern="off" />
      </conditions>
      <action type="Redirect" url="https://www.example.com/{R:1}" redirectType="SeeOther" />
    </rule>
    <rule name="Redirect to www &amp; HTTPS" enabled="true" stopProcessing="true">
      <match url="(.*)" />
      <conditions trackAllCaptures="false">
        <add input="{HTTP_HOST}" pattern="^example\.com$" />
      </conditions>
      <action type="Redirect" url="{MapProtocol:{HTTPS}}://www.example.com/{R:1}" redirectType="SeeOther" />
    </rule>
  </rules>
  <rewriteMaps>
    <rewriteMap name="MapProtocol">
      <add key="on" value="https" />
      <add key="off" value="http" />
    </rewriteMap>
  </rewriteMaps>
</rewrite>

Upvotes: 2

Related Questions