我将 Azure 云与 Web 应用程序一起使用,我的服务器端写在
nodejs
上。
当网络应用程序收到 http 请求时,我想将请求重定向到 https
我找到了解决方案。
我将其放入 web.config 文件中的 rules
标签中
<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>
问题是当我在浏览器中输入“https://myURL.com”时,它会重定向到主屏幕,一切正常, 但是当我将 https 更改为 http“http://myURL.com”时,它会重定向到 https://myURL.com/“并添加到 url“bin/www”,根据该 url 看起来像这样“ http://myURL.com/bin/www”,响应为:页面未找到。
问题是如何重定向一个清晰的url而不向url添加数据?
我的 web.config 文件的一部分:
<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>
感谢您的回答,迈克尔。
2024 年更新:
现在位于“设置”>“配置”>“常规设置”下:
转到 Azure 门户并打开要设置为仅 HTTPS 的 (Web) 应用服务的概述页面。在侧边栏中的设置部分下,有一个TLS/SSL设置选项。
单击它后,您将在屏幕上看到一个选项,将应用程序的协议设置为仅 HTTPS。无需为此手动添加单独的规则集。
这适用于应用程序服务计划的每一层,包括“F”系列(免费订阅)。
请注意,如果您要添加任何自定义域,您还需要添加相应的 SSL 绑定,您可以使用 LetsEncrypt 或类似工具轻松获取它们。如果您的应用程序的任何自定义主机名缺少 SSL 绑定,则:
启用“仅 HTTPS”后,在这些自定义主机名上访问您的应用程序的客户端将看到安全警告。
PS:我刚刚看到这个问题大约在三年前被问到,当时可能没有直接的选择来做到这一点。但即便如此,我还是发布了我的答案,因为在 Google 上(截至 2020 年 2 月)这个问题仍然在其他 regd 问题中排名第一。 Azure 中的自动 HTTPS 重定向。
截至 2017 年 11 月,这现在是 Azure 门户中的一个简单开关:自定义域下的“仅限 HTTPS”。
在 ARM 中也很简单:
“httpsOnly”: true
还有一个免费的开源扩展。
重新启动Web App以使操作立即生效。
完成!
有关此扩展实现的更多详细信息,查看 GitHub 上的源代码。最重要的源文件是
applicationhost.xdt
.
引用来自 GitHub (02-08-2017)(学分转到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>
R:1 是规则模式的反向引用。您将其附加到此处的网址:
url="https://{HTTP_HOST}/{R:1}"
将其更改为
url="https://{HTTP_HOST}"
应该会导致重定向到 https 根目录。