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

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

<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扯进来,情况就有点复杂。

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有公网地址的情况下感觉不是太安全,不知道阿里云后续有没有更好的解决方案。

猜你喜欢

转载自my.oschina.net/u/200350/blog/1787424