IIS中虚拟目录不继承主站点web.config设置的办法(转载)
ASP.NET提供了强大的Web.config来配置网站,一般来说一个网站只有一个根目录下的Web.config文件,有时候我们希望子目录有着不同的权限或者参数设置,则可以在相应子目录增加一个Web.config配置文件,加入我们新的配置参数。这里需要注意的是,子目录web.config是继承父目录的所有设置的,因此,如果子目录放的是一个和父目录里不一样的网站,就不能共享父目录的配置了,否则很可能会冲突。比如很多主机都提供了将域名绑定到子目录从而能够建立多个网站的方法,以Godaddy的Windows主机为例,如果我们想通过子目录建立一个全新的网站,如果不配置好正确的Web.config,很可能会报HTTP 500错误Internal Server Error。下面会分析出现该错误的原因,并给出了正确的配置方法。
查看HTTP 500错误详情
在自己机器上很容易看到错误,但是上传到远程主机后,往往只会提示友好的错误信息,让我们无法知道细节。为了查看错误发生的原因,需要显示错误详情,修改根目录和子目录网站的Web.config文件,在system.webServer节点中添加如下配置,
<httpErrors errorMode="Detailed" />
在system.web节点添加如下配置
<customErrors mode="Off"/>
这样就可以看到详细的错误来源了。子目录网站产生500 Internal Server Error错误的原因多半是和Web.config配置冲突导致。比如在根目录定义了一个name为"connStr"的connectioinString节点,如果在子目录中定义name同样为"connStr"的connectionString节点,则会出错,因为任何配置节点都不允许重复键的加入,否则会提示Dulplicate key之类的错误。那么怎么避免子目录和根目录的配置冲突呢?一般有两种解决方法,一种是修改根目录中的Web.config,使其消除子目录和根目录的继承关系,即子目录Web.config的配置不受根目录Web.config的影响;第二种方法是修改子目录的Web.config,在所有可能和根目录的Web.config产生冲突的配置add之前先clear或者remove根目录的配置信息。下面详细讨论这两种使子目录Web.config独立于根目录的方法。
子目录使用独立Web.config的配置方法
首先看第一种方法,即通过修改根目录的Web.config消除继承关系,在根目录Web.config文件的system.web或者一切不想让子目录继承的配置节点外面添加一层location如下:
<configuration>
<!--...其他配置...-->
<location path="." inheritInChildApplications="false">
<system.web> </system.web>
</location>
<!--...其他配置...-->
</configuration>
这里inheritInChildApplications很好理解,即是否允许子目录继承,默认为true,我们修改为false就可以避免继承了。这种方法的优点是很简单,但是不够灵活,同时面对较复杂的Web.config配置,仍可能会报错。比如根目录和子目录有着不同的system.webServer配置,按照这个方法在根目录的system.webServer外面加上了location限制,不幸的是,IIS7下会出现500错误。当然,也有解决方法,可以参考下面这篇文章。
"SOLVED: IIS7, validateIntegratedModeConfiguration and inheritInChildApplications clash"
接着看第二种方法,不用修改根目录的Web.config文件,而是修改子目录的Web.config。假设根目录的Web.config设置了一个名为BlogEngine的连接字符串,要在子目录使用另一个名字为BlogEngine的连接字符串,就需要先清除已有的连接字符串(根目录继承下来的connectionString设置),清除所有的配置,可以用clear语法,清除指定名称的配置,可以用remove语法,如下
<--根目录的Web.config-->
<connectionStrings>
<add name="BlogEngine" connectionString="Data Source=localhost\SQLEXPRESS; Initial Catalog=BlogEngine1; User ID=xxx; Password=xxx" providerName="System.Data.SqlClient"/>
</connectionStrings>
<--子目录的Web.config(clear方法)-->
<connectionStrings>
<clear/>
<add name="BlogEngine" connectionString="Data Source=localhost\SQLEXPRESS; Initial Catalog=BlogEngine2; User ID=xxx; Password=xxx" providerName="System.Data.SqlClient"/>
</connectionStrings>
<--子目录的Web.config(remove方法)-->
<connectionStrings>
<remove name="BlogEngine"/>
<add name="BlogEngine" connectionString="Data Source=localhost\SQLEXPRESS; Initial Catalog=BlogEngine2; User ID=xxx; Password=xxx" providerName="System.Data.SqlClient"/>
</connectionStrings>
这里只是用connectionString为例,使用时完全可以应用在所有可以配置的节点上,任何配置节点都可以用clear和remove节点将继承来的配置先清除掉,然后再add新的配置。此方法灵活性更强,同时可以保留根目录Web.config中的部分共同配置(而无需全部重新设定)。下面是一个复杂些的例子,分别是根目录和子目录在system.webServer上的配置。
<--根目录的Web.config system.webServer配置节点-->
<modules>
<remove name="ScriptModule"/>
<add name="WwwSubDomainModule" type="BlogEngine.Core.Web.HttpModules.WwwSubDomainModule, BlogEngine.Core"/>
<add name="UrlRewrite" type="BlogEngine.Core.Web.HttpModules.UrlRewrite, BlogEngine.Core"/>
<add name="CompressionModule" type="BlogEngine.Core.Web.HttpModules.CompressionModule, BlogEngine.Core"/>
<add name="ReferrerModule" type="BlogEngine.Core.Web.HttpModules.ReferrerModule, BlogEngine.Core"/>
<add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</modules>
<--子目录的Web.config system.webServer配置节点-->
<modules runAllManagedModulesForAllRequests="true">
<remove name="WwwSubDomainModule"/>
<remove name="UrlRewrite"/>
<remove name="CompressionModule"/>
<remove name="ReferrerModule"/>
<remove name="ScriptModule"/>
<add name="UrlRewrite" type="Intelligencia.UrlRewriter.RewriterHttpModule, Intelligencia.UrlRewriter" />
<add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</modules>
<handlers>
可以看到,子目录将所有根目录定义的Modules(WwwSubDomainModule,UrlRewrite,CompressionModule,ReferrerModule,ScriptModule)都清除了,添加了自己的UrlRewrite和ScriptModule两个Module。如此配置既消除了冲突,又可以实现了配置的部分继承(子目录只有部分配置和根目录不同),而第一种方法却无法实现部分继承。
总结
了解了Web.config的继承方式和子目录的配置方法,我们就能够很轻松的运用子目录建立一个独立于父目录的全新网站,使用完全不同的数据库和连接字符串,完全不同的Module,完全不同的HttpHandler,实在是一件很爽的事情。以Godaddy为例,将域名绑定到Godaddy的子目录,修改子目录的Web.config使其不予根目录的配置冲突,一个新的网站就上线了!就是这么简单。
IIS中虚拟目录不继承主站点web.config设置的办法(转载)的更多相关文章
- IIS中ASP.NET虚拟目录不继承主站点web.config设置的办法(转载)
ASP.NET提供了强大的Web.config来配置网站,一般来说一个网站只有一个根目录下的Web.config文件,有时候我们希望子目录有着不同的权限或者参数设置,则可以在相应子目录增加一个Web. ...
- (转找了好久)实现一个2008serve的IIS的虚拟目录(通过网络路径(UNC)的形式,共享在另外一个2008服务器上
目的:实现一个2008serve的IIS的虚拟目录(通过网络路径(UNC)的形式,共享在另外一个2008服务器上) 准备工作 1.共享资源服务器为 ShareServer,IP地址为:192.168. ...
- 实现一个2008serve的IIS的虚拟目录(通过网络路径(UNC)的形式,共享在另外一个2008服务器上
转载:http://www.cnblogs.com/top5/archive/2012/12/10/2812133.html 目的:实现一个2008serve的IIS的虚拟目录(通过网络路径(UNC) ...
- IIS上虚拟目录下站点的web.config与根站点的web.config冲突解决方法
IIS7.5上在站点下部署虚拟目录,访问虚拟目录下的项目提示与父节点配置冲突.,节点与的<system.web>节点与主站点的<system.web>冲突解决方法: 在站点下的 ...
- 在.net core项目中想使用类似iis上面虚拟目录的功能
事实上iis是不支持.net core mvc项目虚拟目录的.你在iis上发布网站 然后在wwwroot目录上创建虚拟目录,指向硬盘其他位置上的文件夹,是不会有效果的. 正确的处理方式应该是修改静态文 ...
- Apache配置虚拟目录和多主机头
呃,相当古老的话题了,不过网上的资料实在是太坑爹,无奈只能自己动手做个备忘了...这里不提虚拟目录和主机头的区别了,不懂得童鞋去面壁思过吧 多个虚拟目录 首先把Apache安装到D:\Program ...
- 用C#操作IIS创建虚拟目录和网站
#region CreateWebsite 添加网站 public string CreateWebSite(string serverID, string serverComment, string ...
- 13、Apache中虚拟目录和目录权限配置
一.虚拟目录 之前的个人主页,为了安全起见,需要把~yanji 用户隐藏起来,这时就可以设置个 虚拟目录. 它在Apache服务器应用比较多,能够隐藏系统的真实目录,实用性非常高. 虚拟目录主要 通过 ...
- IIS的虚拟目录和子应用程序
一.虚拟目录 虚拟目录是指在发布的网站下建立一个虚拟子目录,指定一个固定的物理路径做为站点的应用路径. 1. 虚拟目录与父级站点共用一个应用程序池,网站Test是在D盘下建立了的虚拟目 ...
随机推荐
- CPU运行原理
问题: CPU位宽表示什么意思? 下面这个是 https://www.bilibili.com/video/av9667986?from=search&seid=336127932106862 ...
- JDK、JRE
JRE: java Runtime environment (java运行环境) JVM:java virtual machine (java 虚拟机) java程序就在jvm中运行. JDK: ja ...
- .NET Standard 2.0正式发布了
亦可赛艇 前天(2017年8月14日),.NET Standard 2.0正式版终于发布了,与之相配套的.NET Core 2.0也同时正式发布,真是令人振奋. 详情请看:https://blogs. ...
- 企业IT管理员IE11升级指南【10】—— 如何阻止IE11的安装
企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...
- 【安富莱原创开源应用第3期】花式玩转网络摄像头之VNC远程桌面版本,稳定运行2年不死机
说明: 1.前段时间开源了一个网络摄像头的TCP版本 https://www.cnblogs.com/armfly/p/9173167.html,这次再来一个远程VNC的版本.使用更方便,无需大家制作 ...
- [Swift]LeetCode314. 二叉树的竖直遍历 $ Binary Tree Vertical Order Traversal
Given a binary tree, return the vertical order traversal of its nodes' values. (ie, from top to bott ...
- java多线程(4)---volatile关键字
volatile关键字 一旦一个共享变量(类的成员变量.类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的 ...
- Redis配置与安装
Redis 是一个非关系型高性能的key-value数据库.在部分场合可以对关系数据库起到很好的补充作用.它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C, ...
- java基础(二)-----java的三大特性之继承
在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...
- .NET Core中的路由约束
背景介绍 上周给大家分享了Nancy in .NET Core学习笔记 - 路由之后, 就一直在考虑.NET Core能否实现和Nancy中一样的路由约束, 最近查阅了一下MSDN及一些国外博客, 发 ...