在IIS中仅勾选“Require SSL”不能阻止HTTP访问,需删除HTTP绑定或配置URL重写规则强制跳转HTTPS,并确保web.config中forms认证requireSSL="true"、API及静态资源全走HTTPS、代理环境校验X-Forwarded-Proto头。
怎么在 IIS 中给网站绑定 Require SSL
直接在 iis 管理器里勾上“要求 ssl”不等于真正锁死非 https 访问——它只影响当前绑定的协议,且对 http 端口本身没拦截能力。必须配合重定向或端口级限制才生效。
- 打开 IIS 管理器 → 选中站点 → 右侧“SSL 设置” → 勾选
Require SSL,并根据需要选择Accept或Require客户端证书(一般选后者) - 这步只让 IIS 拒绝未加密的请求,但用户仍能用
http://打开首页——因为 HTTP 绑定还开着。必须删掉 HTTP 绑定,或加 URL 重写规则强制跳转 - 如果用了反向代理(如 Nginx、Cloudflare),
Require SSL会失效,因为 IIS 收到的是代理发来的 HTTP 请求。此时得在代理层做 SSL 强制,或启用ARR SSL offloading并校验X-Forwarded-Proto
web.config 里用 rewrite 规则强制跳转 HTTPS
比单纯勾选 Require SSL 更可靠,尤其适合共用 80/443 端口、又不想删 HTTP 绑定的场景。IIS 的 URL Rewrite 模块必须已安装。
- 在
web.config的<system.webserver></system.webserver>下添加规则:
<rewrite><rules><rule name="Force HTTPS" stopprocessing="true"><match url="(.*)"></match><conditions logicalgrouping="MatchAll"><add input="{HTTPS}" pattern="^OFF$"></add></conditions><action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirecttype="Permanent"></action></rule></rules></rewrite>
{HTTPS} 变量值是 ON 或 OFF,不是布尔值,别写成 true
{HTTPS} 可能始终为 OFF。这时要改用 {HTTP_X_FORWARDED_PROTO} 判断,并确保代理透传该头为什么用户还能用 HTTP 登录后台?
常见于 ASP.NET Forms 身份验证场景:登录页被重定向到 http://,表单提交走明文,密码就裸奔了。根本原因不是 SSL 配置漏了,而是认证模块没跟上。
- 检查
web.config中<forms></forms>节点是否设置了requireSSL="true",否则即使页面是 HTTPS,表单 action 也可能生成 HTTP 地址 -
loginUrl必须写成绝对 HTTPS 地址,比如loginUrl="https://example.com/Login.aspx",不能是相对路径 - 如果用了
Response.RedirectToRoute或 MVC 的RedirectToAction,确保路由生成的 URL 协议正确——开发环境常因 localhost 无证书而绕过 HTTPS,上线后必须验证
Require SSL 对 API 接口和静态资源的影响
勾选 Require SSL 后,所有请求(包括 JS、CSS、图片、AJAX)都会被拒绝,除非它们也走 HTTPS。混合内容(HTTP 资源 + HTTPS 页面)在现代浏览器里默认被拦截。
- 前端代码里所有硬编码的
http://地址(比如fetch("http://api.example.com"))必须改成协议相对(//api.example.com)或显式https:// - IIS 默认不给静态文件(.js/.css/.png)加
Strict-Transport-Security响应头,建议在web.config中统一配置:<httpprotocol><customheaders><add name="Strict-Transport-Security" value="max-age=31536000; includeSubDomains"></add></customheaders></httpprotocol> - 某些旧版 .NET Framework 应用(如 4.5 以下)在启用
Require SSL后,Request.IsSecureConnection可能返回 false,需手动检查Request.ServerVariables["HTTPS"]











