zoukankan      html  css  js  c++  java
  • Web.config设置system.webServer

      一般情况在iis部署web网站都非常顺利,但是遇到复杂环境,或者被配置过又正在使用的时候,就束手无策了,

      因为对IIS和Web.config不熟悉,不知其中要害,导致浪费一天甚至更久的时间去处理一个可能是不起眼的配置问题

      本文主要和大家共同探讨下Web.config的system.webServer节点配置,如有错误之处,劳烦指点下

      环境:IIS 7.0及以上

    一、总览

      system.WebServer 是 configuration 节的子级。有关更多信息,请参见 IIS 7.0: system.webServer Section Group (IIS Settings Schema)(IIS 7.0:system.webServer 节组(IIS 设置架构))。

      下面是可以在 system.WebServer 配置组中进行的 Web 服务器设置的示例:

    • 当请求未包含特定资源时,Web 服务器返回给客户端的默认文档(defaultDocument 元素)。

    • 响应的压缩设置(httpCompression 元素)。

    • 自定义标头(httpProtocol 节的 customHeaders 元素)。

    • 模块(modules 元素)。

    • 处理程序(handlers 元素)。

      system.webServer 节中的某些设置只适用于 IIS 7.0 集成模式,而不适用于经典模式。

      具体而言,如果应用程序正在经典模式下运行,则会忽略 Web.config 文件的 system.WebServer节中指定的所有托管代码模块和处理程序。

      与 IIS 的早期版本相同,托管代码模块和处理程序必须在 system.web 节的 httpModules 和 httpHandlers 元素中定义。

      本主题阐释需要修改 system.webServer 节的三个常见配置任务:

    • 添加默认文件,以便在请求 URL 未包含特定的文件时,提供该默认文件。

    • 注册托管代码模块。

    • 添加自定义响应标头。

      如果 Web.config 文件尚未包含 system.webServer 节,请在 configuration 元素中创建该节,如下面的示例所示:

       <configuration> <system.webServer> </system.webServer> </configuration>  

    二、配置默认文件

    当请求 URL 未包含 Web 应用程序的特定文件时,IIS 7.0 将提供一个默认文件。

    在 system.webServer 元素内,创建一个 defaultDocument 元素;

    在 defaultDocument 元素内,创建一个 files 元素;

    在 files 元素内创建一个 add 元素,并在 value 属性内指定默认文件的路径和名称;

    下面的示例演示了一个 system.webServer 节,该节配置为提供 Products.aspx 文件作为默认文件。

    <configuration>
      <system.webServer>
        <defaultDocument>      <files>        <add value="Products.aspx" />      </files>    </defaultDocument>
      </system.webServer>
    </configuration>

    三、注册托管代码模块

     

      每次请求时都会调用托管代码模块,通过该模块可对请求或响应进行自定义。

      在 system.webServer 元素内,创建一个 modules 元素;在 modules 元素内创建一个 add 元素,并在 name 和 type 属性中指定自定义模块。实际的名称和类型取决于要添加的模块;

      下面的示例演示如何添加名为CustomModule的自定义模块,该模块将实现为类型Samples.CustomModule。

    <configuration>
      <system.webServer>
        <modules>      <add name="CustomModule" type="Samples.CustomModule" />    </modules>
      </system.webServer>
    </configuration>

      向模块注册中添加 precondition 属性,并将其值设置为managedHandler。

      此前置条件会导致仅在请求 ASP.NET 应用程序资源(例如 .aspx 文件或托管处理程序)时才调用该模块。该资源中不包括静态文件(例如 .htm 文件)。

      其 configuration 节将类似于以下示例。

    <configuration>
      <system.webServer>
        <modules>
          <add name="CustomModule" type="Samples.CustomModule"  precondition="managedHandler" />
        </modules>
        <defaultDocument>
          <files>
            <add value="Products.aspx" />
          </files>
        </defaultDocument>
      </system.webServer>
    </configuration>

      关于MVC

      对于像MVC这种比较特殊的URL,例如www.store.com/books/GetById/2

      因为没有文件后缀名,IIS通常会无法解析,返回403或者404错误。

      ASP.NET v4.0增加了新的特性,当运行在IIS7以上版本,并且需要IIS的一个快速修复程序KB980368,配置web.config后,将会正常处理上面这种 extensionless URL。

       <validation validateIntegratedModeConfiguration="false"/>  这个主要作用是设置不检测 <system.web>中的配置 。

      <modules runAllManagedModulesForAllRequests="true" /> 这里当设置为true的时候,所有的请求,包含静态文件的请求和没有文件扩展名的请求,都会经过自定义的HttpModule,其实就是为了伪静态。

      IIS经典模式下的配置

       服务器会继续通过 Aspnet_isapi.dll 路由托管代码请求,其处理请求的方式就像应用程序在 IIS 6.0 中运行一样,aspnet_isapi.dll(IIS的native handler扩展),通过映射到System.Web.DefaultHttpHandler进行处理。

      <system.webServer>
        <validation validateIntegratedModeConfiguration="false" />
        <modules runAllManagedModulesForAllRequests="true" />
        <handlers>
          <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
          <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
          <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
          <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%Microsoft.NETFrameworkv4.0.30319aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
          <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%Microsoft.NETFramework64v4.0.30319aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
          <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
        </handlers>
      </system.webServer>

      IIS集成模式下的配置

       服务器将使用 IIS 和 ASP.NET 的集成请求处理管道来处理请求,映射到System.Web.Handlers.TransferRequestHandle来处理

    <modules runAllManagedModulesForAllRequests="true" />
        <handlers>
          <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
          <remove name="OPTIONSVerbHandler" />
          <remove name="TRACEVerbHandler" />
          <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
        </handlers>

      经典模式(classic mode)和集成模式(Integrated mode)比较 

      在经典模式下,IIS会用ISAPI扩展(ISAPI extension aspnet_isapi.dll)和 ISAPI过滤器(ISAPI filter aspnet_filter.dll)来调用ASP.NET运行库来处理请求。

      使用经典模式的话,服务器会用两种管道来处理请求一个负责源代码,另外一个负责托管代码。在这种模式下,应用程序不能充分使用IIS7.X提供的服务。

      httpHandler 和 httpModule 在集成和经典模式下的区别

      经典模式,在web.config的 <system.web> 的子节点<httpModules> 加入<add name="MyHttpModule" type="WebApplication.MyHttpModule, WebApplication"/>

      集成模式,在web.config的 <system.webServer> <modules> 加入<add name="MyHttpModule" type="WebApplication.MyHttpModule, WebApplication"/>

    四、配置自定义响应标头

      利用自定义响应标头,可向浏览器发送应用程序特定的信息。例如,可以添加 Content-Language 标头来描述网页正文中使用的语言。若要执行此操作,请提供一个或多个语言和国家/地区值,例如 en-US(美国英语)或 en-GB(英国英语)。

      在 system.webServer 元素内,创建一个 httpProtocol 元素。

      在 httpProtocol 元素内,创建一个 customHeaders 元素。

      在 customHeaders 元素内创建一个 add 标记,并在 name 和 value 属性中指定自定义标头。实际的名称和类型将取决于该标头在应用程序中的功能。

      下面的示例演示如何添加名为CustomHeader且值为CustomHeader的自定义标头。

    <configuration>
      <system.webServer>
        <httpProtocol>      <customHeaders>        <add name="CustomHeader" value="CustomHeader" />      <customHeaders>    </httpProtocol>
      </system.webServer>
    </configuration>

    五、配置静态内容

    <staticContent>元素配置与Internet Information Services(IIS)7中的静态文件处理请求相关的多个设置。

    <staticContent>元素包含以下三个属性,指定IIS 7是否应将文档页脚应用于静态文件:

      enableDocFooter属性指定是否启用文档页脚。

      defaultDocFooter属性包含:

        如果isDocFooterFileName属性设置为false,则IIS 7将用于文档页脚的文本字符串

        如果isDocFooterFileName属性设置为true,则文件的完整限定路径包含IIS 7将用于文档页脚的文本。

      如上所述,isDocFooterFileName属性指定defaultDocFooter属性是否包含IIS 7将用于文档页脚的文本字符串或包含IIS 7将用于文档页脚的文本的文件的标准路径。

       注意:默认情况下,isDocFooterFileName属性设置为false并全局锁定。要为文档页脚使用文件,您需要在全局级别将isDocFooterFileName属性设置为true,或者解锁该属性。

    配置mineMap节点,增加mime类型

    在app和音频视频横行的时代,增加mime类型成了iis必不可少的配置

    配置mineMap节点,使得网站部署一步到位,不用每次为新服务器添加

        <staticContent>
          <remove fileExtension=".woff" />
          <remove fileExtension=".woff2" />
          <mimeMap fileExtension=".woff" mimeType="application/font-woff" />
          <mimeMap fileExtension=".woff2" mimeType="application/font-woff" />
        </staticContent>

    再贴一段常用代码

    <staticContent>
      <remove fileExtension=".mp4" />
      <remove fileExtension=".m4a" />
      <remove fileExtension=".m4v" />
      <remove fileExtension=".ogv" />
      <remove fileExtension=".webm" />
      <mimeMap fileExtension=".mp4" mimeType="video/mp4" />
      <mimeMap fileExtension=".m4a" mimeType="video/mp4"/>
      <mimeMap fileExtension=".m4v" mimeType="video/m4v" />
      <mimeMap fileExtension=".ogv" mimeType="video/ogg"/>
      <mimeMap fileExtension=".webm" mimeType="video/webm"/>
    </staticContent>

    注意:添加之前必须先remove,否则如果原来已存在,会引起异常

    参考文章:

    https://technet.microsoft.com/zh-cn/sysinternals/bb763179.aspx

    https://www.iis.net/configreference/system.webserver/staticcontent

    http://www.cnblogs.com/imust2008/p/5651752.html

  • 相关阅读:
    MVC View基础(转)
    ASP.NET MVC:自定义 Route 生成小写 Url(转)
    python抓取360百科踩过的坑!
    数组循环移位的几种解法
    volatile型变量自增操作的隐患
    HAWQ技术解析(十八) —— 问题排查
    系列网页。前端开发流程
    Python图像处理(8):边缘检測
    析构函数
    Spring(八)编码剖析@Resource注解的实现原理
  • 原文地址:https://www.cnblogs.com/xcsn/p/6939628.html
Copyright © 2011-2022 走看看