在阿里云SLB下如何实现IIS->http自动转向https

经过微软的URL Rewrite组件,实际效果是服务器返回http code 301给浏览器,浏览器作跳转。按照上面的文章提到的,在web.config中加入如下rule(或者经过IIS管理器里的URL Rewrite界面添加rule):html

<rule name="HTTP to HTTPS redirect" stopProcessing="true">
  <match url="(.*)" />
    <conditions>
      <add input="{HTTPS}" pattern="off" ignoreCase="true" />
    </conditions>
  <action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}/{R:1}" />
</rule>

上面的rule也很简单,(.*)表示全部格式的URL,{HTTPS}表示一个IIS server 变量。全部server变量以及可能的取值在这里。能够看到在用http链接时,{HTTPS}的取值是字符串“off”。{HTTP_HOST}表示web服务器的名字。前端

方法2在单台机器部署IIS的状况下没问题。可是,当把阿里云的负载均衡服务SLB扯进来,状况就有点复杂。web

SLB的背后通常有多台ECS,若是SLB不开启HTTPS端口,不在SLB上安装证书而是在后面的每台ECS的IIS上安装证书,开启IIS的443端口,某些浏览器(好比Mac 上的Chorme)会收到证书过时的错误。具体缘由还不是太清楚。因此只能用另一套方案:不在每一个ECS的IIS上安装证书,而是开启SLB的HTTPS端口,安装证书。后端

可是在这种方案下,到达SLB的https请求,会被SLB转换成http请求:浏览器

要实现http跳转到https,咱们多了一个额外的任务:区分到达IIS的http请求,是浏览器的http请求(要跳转到https),仍是SLB的https转换出来的http请求(不要跳转,返回网站内容)。想来想去,发现只能经过端口号来区分这2者,具体配置以下:安全

1,ECS的IIS上开放http的80和8123端口,确保与SLB的后端协议端口匹配。服务器

2,SLB上开放两个监听端口,前端http 80+后端http 80, 以及前端https 443+后端http 8123。负载均衡

3,URL Rewrite的rule更新成:遇到不是8123端口的http请求就跳转至https,不然不作跳转。网站

<rewrite>
      <rules>
        <rule name="HTTP to HTTPS redirect" stopProcessing="true">
          <match url="(.*)"/>
          <conditions>
           <add input="{HTTPS}" pattern="off" ignoreCase="true"/>
           <add input="{SERVER_PORT}" pattern="^8123$" negate="true"/>
          </conditions>
          <action type="Redirect" url="https://{HTTP_HOST}/{R:1}"/>
        </rule>
      </rules>
    </rewrite>

如今整个流程就变成了:浏览器请求http 80 -> slb 转发http 80到ECS的IIS ->URL Rewrite将请求重定向到https->slb 将 https的请求转换为http 8123到ECS IIS-> IIS返回真正的网站内容。阿里云

只是这样一来,IIS上要额外开一个8123的http端口,在ECS有公网地址的状况下感受不是太安全,不知道阿里云后续有没有更好的解决方案。

点我 https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=dg4zrjk6

相关文章
相关标签/搜索