Cloudflare环境下IIS HTTPS重定向问题及相关配置咨询
针对你遇到的Cloudflare+IIS环境下的HTTPS重定向和域名限制问题,我给你整理两个实用的解决方案,都是适配这个场景的:
一、Cloudflare友好的HTTPS全局重定向(覆盖IP访问场景)
你之前遇到的“重定向过多”问题,核心原因是没考虑Cloudflare和IIS之间的通信协议:如果Cloudflare用HTTP协议把请求转发给你的IIS,而你的Rewrite规则只判断IIS收到的请求是否为HTTPS,就会陷入“CF转HTTP→IIS重定向到HTTPS→CF再转HTTP”的死循环。
正确的做法是利用Cloudflare发送的X-Forwarded-Proto请求头——这个头会携带用户原始请求的协议(HTTP/HTTPS),同时我们单独处理直接访问IP的场景(这类请求不会经过Cloudflare,没有CF的转发头)。
具体配置方法
你可以通过IIS管理器的URL Rewrite模块图形化配置,或者直接在站点的web.config中添加以下规则:
<rewrite> <rules> <rule name="Enforce HTTPS (CF Friendly + IP Access)" stopProcessing="true"> <match url="(.*)" /> <conditions logicalGrouping="MatchAny"> <!-- 处理经过Cloudflare的HTTP请求 --> <add input="{HTTP_X_FORWARDED_PROTO}" pattern="^https$" negate="true" /> <!-- 处理直接访问IP的HTTP请求 --> <add input="{HTTPS}" pattern="^OFF$" /> <add input="{HTTP_HOST}" pattern="^(\d+\.){3}\d+$" /> </conditions> <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" /> </rule> </rules> </rewrite>
这个规则的逻辑是:只要是经过CF的HTTP请求,或者直接访问IP的HTTP请求,就自动重定向到HTTPS,既避免了循环,又覆盖了所有需要跳转的场景。
另外建议把Cloudflare的SSL模式设置为Full或Full (Strict),不要用Flexible模式——Full模式下CF和IIS之间用HTTPS通信,安全性更高,也能减少潜在的协议兼容问题。
二、让IIS只响应指定域名(拒绝IP/其他域名访问)
有两种简单的实现方式,你可以根据自己的需求选择:
方法1:修改IIS站点绑定(最直接)
- 打开IIS管理器,找到你的.NET应用站点,右键选择「编辑绑定」;
- 只保留**主机名为
app.host.com**的HTTP和HTTPS绑定,删除所有没有指定主机名(空主机名)的绑定; - 停止或删除IIS默认站点(Default Web Site)——这样用户直接访问IP时,IIS没有对应的站点响应,会返回403/404错误。
方法2:用URL Rewrite规则拦截非指定域名
如果无法修改站点绑定,可以添加一条Rewrite规则,直接拒绝所有非app.host.com的请求:
<rewrite> <rules> <rule name="Allow Only app.host.com" stopProcessing="true"> <match url="(.*)" /> <conditions> <add input="{HTTP_HOST}" pattern="^app\.host\.com$" negate="true" /> </conditions> <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Only app.host.com is allowed" /> </rule> </rules> </rewrite>
这条规则会对所有不是app.host.com的请求返回403禁止访问,包括直接用IP访问的情况。
最后补充一点:因为你的IIS在Sonicwall防火墙后做了NAT,要确保防火墙已经正确转发了80(HTTP)和443(HTTPS)端口到IIS服务器的对应端口,同时Cloudflare的DNS记录要设置为Proxied(橙色云朵图标),这样所有域名请求都会经过Cloudflare的代理。
备注:内容来源于stack exchange,提问作者DDulla




