我这里说的不是如何解决路径重写或者配置的问题,而是如何解释站点、应用、虚拟目录的概念和作用。
这三样东西在iis6和IIS7中的异同已经讨论过了。因为站点、应用和虚拟目录是我们在IIS上搭建网站时肯定会遇到的,但是它们的概念是那么的模糊(至少对我来说)。我在网上找了一些资料来研究。
其中有一篇写的很详细:了解IIS 7上的站点、应用、虚拟目录,这里只是一个总结。
在IIS6中,应用和虚拟目录的概率有点模糊,但在IIS7之上,这三者是标准化的,在IIS架构的层面上,它们之间的层次关系是清晰的。
在IIS6中,虽然有虚拟目录和应用两个概念,而且看起来这两个概念是独立的,但是IIS6中的一个应用实际上就是一个虚拟目录。
只是一个应用可以在medabase中设置AppFriendly Name,AppRoot,AppIsolated,AppPoolid的属性。
但是,IIS6中的site是一个例外,因为即使没有设置那些属性,它也不会被视为虚拟目录,而是一个应用程序。
在IIS7以上版本中(但目前我能接触到的IIS最高版本是win7中的IIS7.5),站点、应用、虚拟目录的概念已经标准化。
不像IIS6那么含糊。在IIS7中,它们是独立的概念,在IIS的组织结构中有一个层次关系:一个站点中可以有一个或多个应用程序,
一个应用程序中可以有一个或多个虚拟目录,一个虚拟目录对应一个物理路径。默认情况下,一个站点至少有一个应用程序。
它被称为根应用程序或默认应用程序,一个应用程序至少有一个虚拟控制器。
它叫做根虚拟目录。我们来看看my IIS7.5上一个站点的结构是如何对应IIS中这个站点的ApplicationHost.config文件的。
Note: application host. The configuration file is in the directory: \% windir% \ system \ inetsrv \ config.
我的IIS里只有一个ID为13的站点,站点下有两个应用,分别是cd和dh。从右边的配置可以看到,其实除了cd和dh应用,
Site本身也是一个应用,也就是根应用。同时,我们可以看到,
There is a virtual directory under each application, that is, the root virtual directory, which acts as the root directory of this application.
并映射到应用程序所在的物理路径。当然,每个应用程序可以有多个虚拟目录。
这些虚拟目录可以对应其他物理路径(比如dh应用下镜像虚拟目录的物理路径可以做网络中另一台计算机的共享目录)。
在IIS7中(其实IIS6也一样,只是细节不同,有点模糊,需要进一步研究),一个站点运行在一个应用池中。
默认情况下应用程序池有一个w3wp.exe,
site中的application运行在这个w3wp.exe进程中的app domain(应用程序域)中(不同application运行在不同app domain中,
以进行隔离),而同一个application的virtual directory运行在相同的app domain下。
但site下的application不一定必须跟这个site运行在相同的application pool,
application可以指定一个跟这个application的site不同的application pool。
接下来独立的阐述一下site,application和virtual derectory
站点(site)
一个站点包含一个或者多个application和一个或者多个虚拟目录。我们可以通过对site进行不同的绑定以用不同的方式对site进行访问。这里的“绑定”包含两个方面,一个是绑定的协议,
另一个就是绑定信息。绑定协议用于指定通过什么协议去和该site进行通信。IIS7+中,
对一个site可以的协议包括http,https,net.tcp,net.pipe,net.msmq,net.formatname这几种。当然,对于一个网站,最常用的就是http和https。
而绑定信息则定义了通信的基本信息,比如IP地址,通信端口,站点的一些头部信息(header)。正如前面说到的,可以为一个site添加多种绑定,只需要在IIS中对某个site进行“编辑绑定”操作即可。
应用程序(application)
application是为一个site提供功能的基本单位,例如一个购物站点可以包含两个application:一个负责呈现商品,给消费者去选购,并放入购物车,
而另一个appliation则可以专注于用户的登录以及支付业务。当一个site只有一个application时候,
这个application也就是root application或者default application,代表着这个site本身,
在applicationHost中的“application path='/' ”里面,path='/'就表示该application是该site的根应用程序。
application运行在IIS中的应用程序池中,以app domain隔离。application可以运行在IIS中任意一个应用程序池中,
而不一定要运行在这个application所在的site的应用程序池中,但对于使用托管代码开发的application(例如一个asp.net网站)必须运行在运行在.NET之上的应用程序池。
可以在IIS中对应用程序池进行设置,包括设置.NET版本(或者是非托管环境),以及设置管道模式等操作。
虚拟目录(virtual directory)
一个虚拟目录就是一个site(实际上是application)上的对一个本地计算机或者远程计算机上一个物理目录路径的一个映射名称。一个application可以拥有至少一个虚拟目录。
在applicationHost中的“virtualDirectorypath='/' ”里面,
path='/'就表示该virtual directory是该application(或者该site)的根虚拟目录。
IIS7+利用虚拟目录映射的目录路径目录下的web.config配置文件来管理该虚拟目录及其子目录(可以在applicationHost.config的sites/virtualDirectoryDefaults节中使用allowSubDirConfig='false'属性来关闭web.config对子目录的控制。