经过微软的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