IIS Http 重定向

Posted

技术标签:

【中文标题】IIS Http 重定向【英文标题】:IIS Http redirect 【发布时间】:2018-09-06 19:00:46 【问题描述】:

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

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

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

无法访问此页面。确保网址 https://localhost 正确。

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

但是,当禁用 HTTP 重定向时,我可以打开此 URL。我有自签名证书。

HTTP 重定向的配置是

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

所以,问题是:

    为什么*.svc 没有重定向到 HTTPS 协议? 为什么https://localhost/test.html不能在启用http重定向的情况下打开? 这是否意味着只使用 url 重写模块并摆脱重定向配置?

【问题讨论】:

查看此链接***.com/questions/30533616/… @zubairkhanzada 好的,谢谢,所以,url 重写和 iis http 重定向是一些黑盒 【参考方案1】:

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

    为主站点配置 HTTP 绑定,使端口从 80 更改为 81。此外,从外部看不到端口 81 添加新网站,将 HTTP 绑定到端口 80,此网站的 WWWRoot 为空 将 HTTP 重定向添加到这个新的空网站,使其重定向到我们主站点的 HTTPS。

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

【讨论】:

【参考方案2】:

我的目标是三重

    在地址栏中使用不带 www 的域名 自动从 HTTP 重定向到 HTTPS,不会失败或发出问题,也无需在任何类型的浏览器中接受证书 简单的故障保护安全。如果谷歌能做到,我为什么能做到?

在上一篇文章中使用“烟雾”端口的想法很聪明。在使用端口 80 时,我不断收到蓝色的 IIS 欢迎页面和 http 协议。假端口似乎迫使 asp.net 网页实际读取 Web 配置中的重定向代码。我将所有的 http 绑定更改为端口 81。添加到 web.config 中的重写 url 代码如下所示。

要测试的另一件重要的事情是关闭“必需的 SSL”,因为一篇文章表明它可能与 IIS 重写 URL 冲突(任何不显示错误的冲突都可能是一个令人头疼的问题)。在关闭 IIS 的“SSL 设置”“必需”开关并仅选中“忽略”之前,来自数百个帖子或演练设置的重写 URL 的任何组合似乎都失败了(例如,这特定于 IIS10 Win 2016,但可能与以前的所有 IIS 相同)。

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

最后不要忘记在测试页面加载之前不断删除 cookie/历史记录。在某些情况下,android 上的“擦除缓存分区”会删除任何可能导致设备出现问题的临时文件(尤其是在测试期间)。

这个问题可能是一场噩梦,因为本来应该有效的事情绝对行不通,即使逻辑是“防弹逻辑”。

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

按照流行的 ssl 站点的说明,使用 3 条规则重写 Sa 示例

<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_HOSTREQUEST_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_HOSTREQUEST_URI" redirectType="Permanent"/>
    </rule>
    <rule name="Redirect Canonical HTTP to HTTPS" stopProcessing="true">
      <match url="domain.com"/>
      <action type="Redirect" url="https://HTTP_HOSTREQUEST_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);
        

【讨论】:

以上是关于IIS Http 重定向的主要内容,如果未能解决你的问题,请参考以下文章

Win2008 r2 iis7/iis7.5系统下HTTP重定向(301重定向)图文方法

iis里URL重写重定向,http做301重定向https

尝试将 HTTP 重定向到 HTTPS(C#、IIS),但 HTTPS 在响应标头中转回 HTTP - 重定向循环

IIS 将 www 重定向到非 www 和 http 到 https:是不是可以仅使用一个重定向来完成?

IIS 7.5 HTTP 到 HTTPS 重定向

IIS 配置Http重定向到Https