# IIS 绑定、主机头与 SNI：一个 IP 托管多个站点

> 理解 IP:端口:主机头 绑定，添加多个 HTTP/HTTPS 站点，正确使用 SNI，并定位绑定冲突与证书名称错误。

**测试环境**

- 版本号: 26100.33650
- 版本: Standard / Datacenter
- 架构: x64
- 证据: E1
- 核验日期: 2026-10-29
- 测试机: IIS Manager UI 参考：VM 361 Windows 11 26H2；Lab 站点 :8080 绑定；Server 2025 cmdlet 为 E1

VM 361 的 Lab 站点绑定：http、8080、IP `*`、无主机头。这是最简单的实验情形；主机头/SNI 是下一步。Windows 11 UI 参考；Server 2025 步骤 E1。

## 一句话结论

IIS 绑定是：

```text
协议  IP:端口:主机头
http      *:80:lab.internal
https     *:443:lab.internal   + SNI + 证书
```

- **IP** 可以是 `*`（全部）、具体地址或通配。
- **端口**区分端点，不是站点。
- **主机头**让多个 HTTP 站点共享 `*:80`。
- **SNI** 让 HTTPS 也按主机名选证书；没有 SNI，一个 IP:端口只能有一张证书。

一个主机名一个站点，不要一个文件夹一个站点。同一主机下的路径用应用。

## HTTP：主机头

```powershell
Import-Module WebAdministration
New-WebBinding -Name 'Lab' -Protocol http -Port 8081 -HostHeader 'lab.local'
Get-WebBinding -Name 'Lab'
```

在服务器上用 Host 头测试：

```powershell
curl.exe -H "Host: lab.local" http://127.0.0.1:8081/
```

不带头的 `curl http://127.0.0.1:8081/` 可能落到另一个站点或默认站点。这就是“localhost 行、域名不行”的常见原因。

## HTTPS：SNI

没有 SNI 时，IIS 把证书绑到 IP:端口。有 SNI 时，客户端在 TLS 握手发主机名，IIS 选证书。

```powershell
New-WebBinding -Name 'Lab' -Protocol https -Port 443 -HostHeader 'lab.example' -SslFlags 1
```

`SslFlags 1` 表示启用 SNI。然后绑证书（哈希从 `Get-ChildItem Cert:\LocalMachine\My` 取）：

```powershell
netsh http add sslcert hostnameport=lab.example:443 `
  certhash=<thumbprint> appid={4dc3e181-e14b-4a21-b022-59fc669b0914} `
  certstorename=MY
```

SNI 用 **hostname:port**。`appid` 是 IIS 用来标识绑定的任意 GUID；同一站点保持一致。

验证：

```powershell
netsh http show sslcert hostnameport=lab.example:443
curl.exe --resolve lab.example:443:127.0.0.1 https://lab.example/ -k
```

`--resolve` 让测试打到本机 IIS，不管公网 DNS；`-k` 接受实验证书，生产不要养成习惯。

## 绑定是匹配，不是猜

HTTP：先匹配协议/端口/IP，再匹配 Host 头。没有主机头匹配时，可能落到无主机头的站点（常见 Default Web Site）。

HTTPS + SNI：主机名决定证书。不匹配会：

- 客户端证书名称警告（看到错误名字）；
- 落到错误站点返回 404；
- 没有匹配的 SNI 绑定时握手失败。

## 常见故障

| 现象 | 可能原因 |
|---|---|
| 400 Bad Request | 重复/非法绑定；主机头格式错 |
| 域名 404、localhost 200 | 请求落到 Default Web Site |
| 证书名称不匹配 | 证书 SAN 不含该主机名 |
| “文件已存在” | 同一 IP:端口:主机 重复绑定 |
| 只有一个站点 HTTPS 正常 | 没 SNI / 一个 IP:端口一张证书 |
| 内网行、外网不行 | DNS/防火墙/NAT，不是 IIS |

> **警告: 不要用不同端口当路由策略**
>
> `site-a:8080` 和 `site-b:8081` 是两个端点，不是虚拟主机。用户应该用域名访问 443，就用主机头 + SNI。

## 检查表

1. 一个主机名一个站点；一个隔离边界一个应用池。
2. HTTP 和 HTTPS 用同一主机名。
3. 证书 SAN 覆盖该绑定的所有名字。
4. Default Web Site 停掉或有意绑定。
5. 用 Host 头/`--resolve` 测，不要只测 `localhost`。
6. 记录每个 IP:端口:主机 和证书指纹。

## 实验室边界

截图是 Windows 11 26H2、仅 HTTP、8080。HTTPS/SNI 与 Server 2025 角色行为是 E1，等 Server 2025 VM 和证书实验再升级。

## 来源

- [Microsoft Learn — IIS 站点绑定](https://learn.microsoft.com/zh-cn/iis/configuration/system.applicationhost/sites/site/bindings/)
- [Microsoft Learn — IIS 8 SNI](https://learn.microsoft.com/zh-cn/iis/get-started/whats-new-in-iis-8/iis-80-server-name-indication-sni-ssl-scalability)
- [Microsoft Learn — New-WebBinding](https://learn.microsoft.com/zh-cn/powershell/module/webadministration/new-webbinding)

---

来源页面: https://winbook.fyi/zh/server/web/iis-bindings/
