# IIS 站点、应用、虚拟目录与应用池：四层模型

> 分清 site/application/virtual directory/app pool，在 8080 建实验站点，并有意识地选择隔离边界。

**测试环境**

- 版本号: 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 的 IIS 站点：Default Web Site (:80) 与 Lab (:8080)。Windows 11 UI 参考；Server 2025 角色步骤为 E1。点击查看原图。

## 一句话结论

四个不同的东西：

| 对象 | 是什么 | 自己的绑定？ | 自己的应用池？ |
|---|---|---|---|
| **站点（Site）** | 一个 Web 端点：绑定 + 根目录 + 应用池 | 有 | 有 |
| **应用（Application）** | 站点内的路径段（如 `/shop`） | 无（继承站点绑定） | 有 |
| **虚拟目录** | 映射到 URL 路径的文件夹 | 无 | 无 |
| **应用池** | 工作进程边界 | 无 | — |

不同主机名/端口用**站点**；同一主机下独立应用用**应用**；纯静态内容且不需要独立进程才用**虚拟目录**。

## 实验室站点

VM 361 的 IIS 管理器显示：

- `Default Web Site`，id 1，`http/*:80:`
- `Lab`，id 2，`http/*:8080:`，根 `C:\inetpub\lab`，应用池 `labpool`

选中 Lab 站点：8080 绑定、路径 C:\inetpub\lab、已分配应用池。截图来自 Windows 11 26H2。

用 PowerShell（WebAdministration 模块）创建：

```powershell
Import-Module WebAdministration
New-Item -ItemType Directory -Force C:\inetpub\lab | Out-Null
New-WebAppPool -Name 'labpool'
New-WebSite -Name 'Lab' -PhysicalPath 'C:\inetpub\lab' -Port 8080 -ApplicationPool 'labpool'
```

或用 `appcmd`：

```bat
appcmd add apppool /name:labpool /managedRuntimeVersion:""
appcmd add site /name:Lab /physicalPath:C:\inetpub\lab /bindings:"http/*:8080:"
appcmd set app "Lab/" /applicationPool:labpool
```

`managedRuntimeVersion:""` 是 **No Managed Code**，对静态站或反代 Node/Python 是正确的。应用需要 .NET Framework 才用 v4.0。

## 加一个应用

```powershell
New-WebApplication -Site 'Lab' -Name 'shop' -PhysicalPath 'C:\apps\shop' -ApplicationPool 'shoppool'
```

得到 `http://host:8080/shop`，有自己的应用池。父站点的 `web.config` 仍会继承，除非子应用覆盖。这个继承有用，也是“根路径正常、/shop 不正常”的常见来源。

## 加一个虚拟目录

```powershell
New-WebVirtualDirectory -Site 'Lab' -Name 'docs' -PhysicalPath 'D:\StaticDocs'
```

`/docs` 映射文件夹，但用父应用的应用池。它不是隔离边界。

## 验证

```powershell
Get-Website | Select-Object Name, State, PhysicalPath, ApplicationPool
Get-WebApplication -Site 'Lab'
Get-WebVirtualDirectory -Site 'Lab'
Invoke-WebRequest http://localhost:8080/ -UseBasicParsing | Select-Object StatusCode
```

再从允许网段的另一台机器测；只测 localhost 不能证明防火墙/绑定正确。

> **警告: 不要按文件夹习惯建站点**
>
> 新站点需要绑定。只是想在同一个域名下加 `/app`，用应用，不要另开端口。端口不是路由策略。

## 常见坑

- **绑定冲突：** 两个站点同一 IP:端口，没有主机头/SNI。IIS 启动一个，另一个失败。
- **应用池错：** 静态站放 `DefaultAppPool` 还加载 .NET，增加无谓攻击面。
- **虚拟目录权限：** 应用池身份需要对目标文件夹有 NTFS 读权限，不是 IIS“连接为”就够。
- **嵌套配置：** 父 `web.config` 可能挡住子应用；读 500.19，不要直接删配置。
- **默认站点还开着：** 未绑定主机名的请求可能落到它。

## 实验室边界

UI 来自 Windows 11 26H2。cmdlet 和对象模型与 Server 2025 同族，但 Server 角色安装仍是 E1；Server 2025 VM 复现后再升级证据等级。

## 来源

- [Microsoft Learn — IIS 入门](https://learn.microsoft.com/zh-cn/iis/get-started/introduction-to-iis/iis-web-server-overview)
- [Microsoft Learn — IIS 配置](https://learn.microsoft.com/zh-cn/iis/configuration/)
- [Microsoft Learn — New-WebSite](https://learn.microsoft.com/zh-cn/powershell/module/webadministration/new-website)

---

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