IIS HTTP 重定向

IIS Http redirect

我有几个关于 IIS 配置的问题。

当我在 IIS 中启用 HTTP 重定向并使用 http://localhost/SubApp 时,它被重定向到 https://localhost/SubApp,但是当它是 http://localhost/service.svc 时,它没有被重定向到 https://localhost/service.svc

也启用了重定向URL像这样https://localhost/test.html没有打开,我看到消息

Can’t reach this page. Make sure the web address https://localhost is correct.

文件内容非常简单:<html><body>test html</body></html>.

然而,当 HTTP 重定向被禁用时,我可以打开这个 URL。我有自签名证书。

HTTP 重定向的配置是

<httpRedirect enabled="true" destination="https://localhost" exactDestination="false" childOnly="false" httpResponseStatus="Permanent" />

所以,问题是:

  1. 为什么 *.svc 没有重定向到 HTTPS 协议?
  2. 为什么启用 http 重定向后 https://localhost/test.html 无法打开?
  3. 这是否意味着只使用 url 重写模块并摆脱重定向配置?

经过测试,我们发现使用 HTTP 重定向(从 HTTP 到 HTTPS)的唯一可能性是:

  1. 为主站点配置 HTTP 绑定,以便端口从 80 更改为 81。此外,端口 81 从外部不可见
  2. 添加 HTTP 绑定到端口 80 的新网站,该网站的 WWWRoot 为空
  3. 将 HTTP 重定向添加到这个新的空网站,以便它重定向到我们主站点的 HTTPS。

在这种情况下,HTTP 重定向工作正常。

我的目标是三倍

  1. 在地址栏中使用不带 www 的域名
  2. 自动从 HTTP 重定向到 HTTPS 而不会出现故障或问题,或者需要在任何类型的浏览器中接受证书
  3. 简单的故障保护安全。如果 google 可以做到,为什么我可以?

在之前的 post 中使用 'smoky' 端口的想法很聪明。在使用端口 80 时,我不断收到蓝色的 IIS 欢迎页面和 http 协议。假端口似乎强制 asp.net 网页实际读取 web 配置中的重定向代码。我将我所有的 http 绑定更改为端口 81。添加到下面显示的 web.config 中的重写 url 代码。

另一个需要测试的重要事情是关闭 'Required SSL',因为 post 表明它可能与 IIS Rewrite URL 冲突(任何未显示错误的冲突都可以是严重的头痛)。在关闭 IIS 'SSL Settings' 'Required' 之前关闭并仅保留 'Ignore' 为选中状态 从数百个 post 或演练设置中重写 URL 的任何组合似乎失败(例如,这是特定于 IIS10 Win 2016,但可能与所有以前的 IIS 相同)。

如果从静态 IP 托管,在测试期间确保请求在您的局域网之外也很重要。只需使用您的移动热点和平板电脑上的多个浏览器(例如 samsung、brave、mozilla、edge 等)即可查看每个浏览器的响应。部分原因是基于 TLS1.2 的实施和所有其他协议和密码的禁用。

最后不要忘记在测试页面加载之前不断删除 cookies/历史记录。在某些情况下,'wipe cache partition' on an android 会删除任何可能导致设备出现问题的临时文件(尤其是在测试期间)。

这个问题可能是一场噩梦,因为本应有效的事情绝对无效,即使逻辑是 'bulletproof logical'。

即使考虑并测试了所有这些因素,它也很有可能无法在某些浏览器中运行...它只是拒绝从 h*tp://domain.com IIS 欢迎页面...例如 edge、brave 等

根据热门 ssl 站点的说明,使用 3 条规则重写的示例

<rewrite>
  <rules>
    <rule name="HTTP to HTTPS redirect www" stopProcessing="true">
      <match url="www.domain.com"/>
      <conditions>
        <add input="{HTTPS}" pattern="^OFF$"/>
      </conditions>
      <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent"/>
    </rule>
    <rule name="HTTP to HTTPS redirect" stopProcessing="true">
      <match url="domain.com"/>
      <conditions>
        <add input="{HTTPS}" pattern="^OFF$"/>
      </conditions>
      <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent"/>
    </rule>
    <rule name="Redirect Canonical HTTP to HTTPS" stopProcessing="true">
      <match url="domain.com"/>
      <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}"/>
    </rule>
  </rules>
  <outboundRules>
    <rule name="Add Strict-Transport-Security when HTTPS" enabled="true">
      <match serverVariable="RESPONSE_Strict_Transport_Security" pattern=".*"/>
      <conditions>
        <add input="{HTTPS}" pattern="on" ignoreCase="true"/>
      </conditions>
      <action type="Rewrite" value="max-age=31536000; includeSubDomains; preload"/>
    </rule>
  </outboundRules>
</rewrite>

甚至一些 C# 中的页面加载代码 asp.net 可能什么都不做...但值得一试...也许在 IIS 领域是不可能的。

 protected void Application_BeginRequest(Object sender, EventArgs e)
{
    HttpContext context = HttpContext.Current;
        if (!context.Request.IsSecureConnection)
        {
            UriBuilder secureUrl = new UriBuilder(context.Request.Url);
            secureUrl.Scheme = "https";
            secureUrl.Port = 443;
            context.Response.Redirect(secureUrl.ToString(), false);
        }
}