我无法让我的 IIS 8.5 服务器按预期运行。我正在尝试使用单独的网络服务器在同一个 IP 地址上托管两个域,都在 https 上。
自然地,IIS 被设置为我的“主要”网络服务器,监听 80 和 443。这里设置了一个带有 ssl 证书的域。我正在使用“URL Rewrite”模块将不安全的流量发送到安全端。另一个域设置为虚拟主机,并使用“HTTP 重定向”功能将流量发送到第二个网络服务器。对于第二个网络服务器,我有 Apache 2.4 在 8443 上监听,也带有证书。
所以,简单地说: http://example1.com -> URL Rewrite -> https://example1.com https://example1.com -> 从 IIS 解析和提供服务
http://example2.com -> HTTP 重定向 -> https://example2.com:8443 https://example2.com:8443 -> 由 Apache 解析和服务
我的问题是在浏览器(FF 或 Chrome)访问http://example2.com并被重定向到https://example2.com:8443之后,后续访问总是转到https://example2.com(没有端口) . 这失败了,因为在 ssl 握手期间,浏览器获得了 example1 的证书。
我已经追踪到这两个依赖 HSTS 的浏览器。一旦我清除了 HSTS 缓存,他们就能够再次找到正确的站点(使用端口)。
我怎样才能让这个设置顺利工作?我在 Apache 的 conf 中没有看到任何设置 HSTS 的内容,所以我认为它在 IIS 重定向中。我查看了这个在 IIS 上讨论 HSTS 的答案max-age
,认为我可以修改 Doug 的建议以将其设置为零以防止它被设置,但它似乎不起作用。
解决方案:
根据下面的建议,最好的解决方案是在 IIS 中托管两个域,绑定 SSL 证书并选中绑定中的“需要服务器名称指示”框。我必须对所有共享 IP 的域执行此操作。然后我可以创建一个反向代理(需要 URL 重写和应用程序请求路由模块),它将流量传递给 Apache 托管的实例。
你不能用你当前的设置。
HSTS RFC声明如下:
所以去http://www.example2.com:8443将保留端口并重定向到https://www.example2.com:8443但你不能从http://www.example2.com做同样的事情。
所以你有以下选择:
停止在 Apache 中为 example2.com 使用 HSTS,只在 IIS 中为 example1.com 使用它
使用一台主服务器监听端口 80 和 443,并将 example.com 的请求代理到端口 8443 上的另一台服务器。这更干净,因为不需要用户在非标准端口(如 8443)上使用。但是,由于您使用相同的 IP 地址,您要么必须使用称为服务器名称标识或 SNI 的进程(XP/IE8 等旧版浏览器不支持)才能通过相同的 IP 地址正确地为相同的主机提供服务HTTPS,或为两个站点使用相同的证书作为解决方法(请参阅此处的答案以了解其工作原理)。