比如我的网站,我同时申请了两个域名vxmat.cn和vxmat.com,我需要实现
1、两个域名都访问同一个网站;
2、同时支持带www和不带www的访问;
3、必须部署https,当用户以http方式访问时,必须强制重定向到https的域名;
4、一个相同的IP和端口,在IIS中只能部署一个SSL证书,其它的Tomcat之类的没部署过,所以不知道是否支持相同的IP和端口可以部署多个SSL证书,如果支持,可以不需要看这篇文章。所以,我只部署了一个vxmat.cn的证书。如果域名与证书不匹配时,用户浏览器一般都会提示
这样的信息。
那么,有没有办法可以做到不会被提示这样的不安全呢?这也正是这篇文章的目的。如果这篇文章能帮助到您,请您点个赞!谢谢。
我最终做到了以下的访问规则:以下都是在IIS下实现的。
1、当用户以http方式访问时,会被重定向至
https://vxmat.cn/...........
为什么要管理 http 访问?因为大部分的用户,应该是基本上所有的吧,在浏览器上输入网址是,都是直接输入 www...或者是 toutiao.com,一般不会输入http或者是https的,而浏览器默认都会先以 http:// 方式进行访问(可能以后的浏览器会改成默认为https吧),此时,咱们就需要把http的访问强制重向到https上。
2、当用户以https://方式访问 https://vxmat.com 和 https://www.vxmat.com 时,会被分别重定向到 https://vxmat.cn 和 https://www.vxmat.com 。
下面就是在IIS中设置的方法。
在IIS中,有一个插件叫 IIS rewrite的功能插件,这个插件可以在IIS管理控制台上增加一个URL重写的功能。这个功能非常的实用,可以实现很多功能,比如动态功能网站的伪静态也是靠它来实现的。至于什么叫伪静态以及如何实现,需要另起一篇文章才能说的清楚了。
本站要实现的方法,就是靠它来建立重写或重定向规则后实现的。
安装好URL重写(IIS Rewrite)插件后,有两种方式建立这个规则,先说说以更改web.config来建立的规则:
1、先建立一条规则:当用户以不带s的http进行访问时,强制重定向到 https://vxmat.cn
这条规则基本上都是从网上抄的,抄的时候自己完全弄不清规则的内容是什么意思,但它实现的就是:当访问不是以https开头的时候,就会重定向到 https://vxmat.cn
<rule name="HTTP to HTTPS" enabled="true" patternSyntax="ECMAScript" stopProcessing="true"><match url="(.*)" /><conditions logicalGrouping="MatchAny" trackAllCaptures="false"><add input="{HTTPS}" pattern="off" /></conditions><action type="Redirect" url="https://vxmat.cn/{R:1}" redirectType="Found" /></rule>
在web.config节点
<configuration>
<system.webServer>
<rewrite>
<rules>
下增加上面的代码即可实现。
2、建立第二条规则:当用户以https://方式访问 https://vxmat.com 和 https://www.vxmat.com 时,会被分别重定向到 https://vxmat.cn 和 https://www.vxmat.com :
<rule name="vxmat.com->vxmat.cn" enabled="true" patternSyntax="ECMAScript" stopProcessing="true"><match url="(.*)" /><conditions logicalGrouping="MatchAll" trackAllCaptures="false"><add input="{HTTP_HOST}" pattern="(.*)vxmat.com" /></conditions><action type="Redirect" url="https://{C:1}vxmat.cn/{R:1}" /></rule>
同样的,也是在rules节点下增加上面的代码即可实现。
在网上基本上搜不到
<match url="(.*)" /><add input="{HTTP_HOST}" pattern="(.*)vxmat.com" />
这个两个节点的意思,给我建立第二条规则时造成了非常多的麻烦,可能很多人在建立规则时,也是被它给弄懵的吧。
<match url="(.*)" />
的意思,根据我配置完成第二条规则后,才知道它的意思,其实是 URL 中的域名之后的第一个/之后的路径信息的匹配。
比如访问的是
http://blog.forbs.cn/9.html ,那么它这个url匹配的只是9.html这一段字符路径信息,而并不是完整的地址。
所以,在我建立的这两个规则中,这里match url="(.*)",即所有的访问都需要匹配。
那么,第1条规则就容易理解了,即所有访问中,如果 <add input="{HTTPS}" ...中的 HTTPS这个信息匹配为off,就表示被第1条规则的条件命中,就会强制重定向到 https://vxmat.cn 上。
第2条同理,就是当匹配了第一个url的规则信息后,如果 域名部分,是 *.vxmat.com的格式或vxmat.com时,就会强制重定向到 相应的 vxmat.cn的域名格式上。
以上,就实现了只有一个SSL证书,也能实现当用户以 https://vxmat.com 访问时,也不会收到浏览器的不安全的提示。
以这种方式实现的域名重定向或重写,好处是不需要在程序代码中实现,从而减少了很多代码上的工作量,以及减少了很多出错的可能。
-------------------------------------
刚刚,时间是2022.8.15,写完文章后,再搜了一下Nginx部署多张SSL证书,发现各种文章里竟然都说是可以部署的,然后我又在我的服务器 windows 2012的IIS上又试了一下,发现还是不行。难道真的可以在nginx下部署???不太明白。有懂的,并且确认过的,希望能留言告知。
谢谢。
----------------------------------------
原来真是我弄错了。在IIS里竟然是真的可以的,只要在部署多张证书的时候,勾选 需要服务器名称指示 就可以了。看来是白折腾了。