18
votes

I use Azure cloud with web app and my server side written on nodejs. When web app receive a http request I want to redirect the request to https I found the solution. I put that to my web.config file inside the rules tag

        <rule name="Force HTTPS" enabled="true">
          <match url="(.*)" ignoreCase="false" />
          <conditions>
            <add input="{HTTPS}" pattern="off" />
          </conditions>
          <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" appendQueryString="false" redirectType="Permanent" />
        </rule>

The problem is when I type in the browser "https://myURL.com" it redirect to main screen every thing ok, but when I change https to http "http://myURL.com" it redirect to https://myURL.com/" and add to the url "bin/www" according that the url looks like that "http://myURL.com/bin/www", the response is: page doesn't find.

The question is how to redirect a clear url without added data to the url?

Part of my web.config file:

<rewrite>
      <rules>
        <!-- Do not interfere with requests for node-inspector debugging -->
        <rule name="NodeInspector" patternSyntax="ECMAScript" stopProcessing="true">
          <match url="^bin/www\/debug[\/]?" />
        </rule>
        <!-- First we consider whether the incoming URL matches a physical file in the /public folder -->
        <rule name="StaticContent">
          <action type="Rewrite" url="public{REQUEST_URI}" />
        </rule>
        <!-- All other URLs are mapped to the node.js site entry point -->
        <rule name="DynamicContent">
          <conditions>
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="True" />
          </conditions>
          <action type="Rewrite" url="bin/www" />
        </rule>
        <!-- Redirect all traffic to SSL -->
         <rule name="Force HTTPS" enabled="true">
          <match url="(.*)" ignoreCase="false" />
          <conditions>
            <add input="{HTTPS}" pattern="off" />
          </conditions>
          <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" appendQueryString="false" redirectType="Permanent" />
        </rule>
      </rules>
    </rewrite>
    <!-- 'bin' directory has no special meaning in node.js and apps can be placed in it -->
    <security>
      <requestFiltering>
        <hiddenSegments>
          <remove segment="bin" />
        </hiddenSegments>
      </requestFiltering>
    </security>

Thanks for answers, Michael.

4
I found the solution just cleared cookies of browser after that the bug was disappearedMichael Horojanski

4 Answers

30
votes

Go to Azure portal and open the overview page of the (Web) App Service you wanna set to HTTPS only. From the sidebar under the style section there is an option for TLS/SSL Settings. On clicking it you will get an option in the screen to set to HTTPS only. There isn't any need to manually add separate ruleset for this. This works on every tier of App Service Plan including the 'F'-Series (free subscription).

SSL/TLS Settings Page

PS: I just saw that this question was asked about 3 years ago and that time maybe there was no direct option to do this. But I am still posting my answer because as on February 2020 on Google this question still ranks first among various questions regarding automatic HTTPS redirection, thinking that it will be helpful for new viewers.

10
votes

As of November 2017, this is now a simple switch in the Azure Portal: "HTTPS Only", under Custom domains.

https://blogs.msdn.microsoft.com/benjaminperkins/2017/11/30/how-to-make-an-azure-app-service-https-only/

It's also very easy in ARM: “httpsOnly”: true

7
votes

There is also a free and open source extension for this.

  1. Go to your Web App settings sidebar, search for the "Extensions" tab and click on "Add".

Extension Tab

  1. Scroll down and find the extension Redirect HTTP to HTTPS by gregjhogan.

Add Extension

  1. Accept the terms.

Accept Terms

  1. Restart the Web App for the actions to take effect immediately.

  2. Done !

For further details on the implementation of this extension, check the source code on GitHub. The most important source file is the applicationhost.xdt.

Quote from GitHub (02-08-2017) (credits go to gregjhogan):

applicationhost.xdt

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    <location path="%XDT_SITENAME%" xdt:Transform="InsertIfMissing" xdt:Locator="Match(path)">
        <system.webServer xdt:Transform="InsertIfMissing">
            <rewrite xdt:Transform="InsertIfMissing">
                <rules xdt:Transform="InsertIfMissing" lockElements="clear">
                    <rule name="redirect HTTP to HTTPS" enabled="true" stopProcessing="true" lockItem="true">
                        <match url="(.*)" />
                        <conditions>
                            <add input="{HTTPS}" pattern="off" ignoreCase="true" />
                            <add input="{WARMUP_REQUEST}" pattern="1" negate="true" />
                        </conditions>
                        <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" appendQueryString="true" redirectType="Permanent" />
                    </rule>
                </rules>
            </rewrite>
        </system.webServer>
    </location>
</configuration>
3
votes

R:1 is a back-reference to the rule pattern. You append that to the url here:

url="https://{HTTP_HOST}/{R:1}" 

changing that into

url="https://{HTTP_HOST}" 

should result in a redirect to the https root.