isapi_rewrite重写在asp.net4.0+IIS6错误的解决方法
2014-12-02 00:00
489 查看
使用isapi_rewrie 3.x 对网站进行URL重写,环境为 Asp.net4.0、IIS6.0。
RewriteRule ^/([a-z0-9_-]+)/$ /Cate.aspx?N=$1 [NC]
但是在实践中一直显示404错误。
原因如下:
因为ASP.NET4.0在安装的过程中,已经在IIS6做了一些手脚,让它可以原生的支持的无后缀的URL请求,那么它究竟是做了什么事情呢?在实现这个功能的作者Thomas Marquardt的这篇博客上的一段话解释了它的工作原理,大概是这样的:
ASP.NET 4.0在安装的时候,会在IIS6注册一个ISAPI Filter,叫做”aspnet_filter.dll”,ISAPI Filter会先于ISAPI处理程序前执行,它会在所有的的无后缀的URL后面加一串字符“/eurl.axd/GUID”, 同时ASP.NET 4.0还会在IIS默认添加一个请求映射规则“*.axd”,映射到aspnet_isapi.dll。此时,所有的无后缀URL加上“/eurl.axd/GUID”后都会变成带.axd后缀,这样就匹配*.axd的映射规则进行ASP.NET的处理通道。在进入ASP.NET通道后,ASP.NET处理程序会删除掉“/eurl.axd/GUID”,让它还原到无后缀的原始情况,并且不会对后续的请求处理带来任何影响。此时,所有的无后缀请求,就进入了ASP.NET的处理通道中,在默认情况下,ASP.NET4.0的全局的web.config中配置了DefaultHttpHandler来接收无后缀的URL请求,但是我们也可以随意更换默认处理程序(比如ASP.NET MVC处理程序)来处理无后缀的URL请求。
从上面的解释中, 我们不难看到,这与IIS7的集成模式有本质的不同,它并不是很原生的处理方案。不得不说,这并不是一个非常流畅的解决方案,也许这也是不得以之下的非常之举。但是其实在没有ASP.NET MVC以前,对无后缀的URL请求的支持并不是那么迫切需要。即使有需要,也是通过一个URL Rewriter组件,而因为首先要进入ASP.NET 处理通道,所以这种URL Rewriter组件也需要ISAPI级别的扩展。当我们在ASP.NET 4.0的程序中,需要用类似的组件的时候,可能就会需跟上面的功能有所冲突,此时,我们可能就会需要禁用ASP.NET4.0对无后缀URL请求的这个功能。这时候你可能修改注册表相关键值(并重启IIS),或者是删除aspnet_filter.dll的注册(因为在这步增加了/eurl.axd/GUID)。
解决方法:
打开注册表找到“HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\ASP.NET\\4.0.30319.0”,添加键值名为“EnableExtensionlessUrls” 类型为“DWORD”的键值,并设置值为“0”。然后在cmd中运行“IISRESET”,重启IIS以读取注册表修改后的内容。注:此项修改就是关闭 ASP.NET 4.0对无扩展URL的处理,若将此项键值设为“1”则开启。
RewriteRule ^/([a-z0-9_-]+)/$ /Cate.aspx?N=$1 [NC]
但是在实践中一直显示404错误。
原因如下:
因为ASP.NET4.0在安装的过程中,已经在IIS6做了一些手脚,让它可以原生的支持的无后缀的URL请求,那么它究竟是做了什么事情呢?在实现这个功能的作者Thomas Marquardt的这篇博客上的一段话解释了它的工作原理,大概是这样的:
ASP.NET 4.0在安装的时候,会在IIS6注册一个ISAPI Filter,叫做”aspnet_filter.dll”,ISAPI Filter会先于ISAPI处理程序前执行,它会在所有的的无后缀的URL后面加一串字符“/eurl.axd/GUID”, 同时ASP.NET 4.0还会在IIS默认添加一个请求映射规则“*.axd”,映射到aspnet_isapi.dll。此时,所有的无后缀URL加上“/eurl.axd/GUID”后都会变成带.axd后缀,这样就匹配*.axd的映射规则进行ASP.NET的处理通道。在进入ASP.NET通道后,ASP.NET处理程序会删除掉“/eurl.axd/GUID”,让它还原到无后缀的原始情况,并且不会对后续的请求处理带来任何影响。此时,所有的无后缀请求,就进入了ASP.NET的处理通道中,在默认情况下,ASP.NET4.0的全局的web.config中配置了DefaultHttpHandler来接收无后缀的URL请求,但是我们也可以随意更换默认处理程序(比如ASP.NET MVC处理程序)来处理无后缀的URL请求。
从上面的解释中, 我们不难看到,这与IIS7的集成模式有本质的不同,它并不是很原生的处理方案。不得不说,这并不是一个非常流畅的解决方案,也许这也是不得以之下的非常之举。但是其实在没有ASP.NET MVC以前,对无后缀的URL请求的支持并不是那么迫切需要。即使有需要,也是通过一个URL Rewriter组件,而因为首先要进入ASP.NET 处理通道,所以这种URL Rewriter组件也需要ISAPI级别的扩展。当我们在ASP.NET 4.0的程序中,需要用类似的组件的时候,可能就会需跟上面的功能有所冲突,此时,我们可能就会需要禁用ASP.NET4.0对无后缀URL请求的这个功能。这时候你可能修改注册表相关键值(并重启IIS),或者是删除aspnet_filter.dll的注册(因为在这步增加了/eurl.axd/GUID)。
解决方法:
打开注册表找到“HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\ASP.NET\\4.0.30319.0”,添加键值名为“EnableExtensionlessUrls” 类型为“DWORD”的键值,并设置值为“0”。然后在cmd中运行“IISRESET”,重启IIS以读取注册表修改后的内容。注:此项修改就是关闭 ASP.NET 4.0对无扩展URL的处理,若将此项键值设为“1”则开启。
相关文章推荐
- isapi_rewrite重写在asp.net4.0+IIS6错误的解决方法
- 详解asp.net在ISAPI_rewrite 中实现伪静态的方法
- Win7的IIS配置asp.net出现“由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面。”(图文解决方法)
- Win7的IIS配置asp.net出现“由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面。”(图文解决方法)
- asp.net RewritePath重定向HTTP头Content-Location暴露真实路径解决方法
- ASP.NET仅配置数据库MSDE出现"用户 ’机器名/ASPNET’ 登录失败 解决方法
- URL 重写 only for ASP.NET 2.0: UrlRewritingNet.UrlRewrite
- 收藏:Asp.Net 连接Oracle数据库 出现"找不到 Oracle 客户端和网络组件" 彻底解决方法!
- ASP.NET连接ORACLE数据库出现乱码的解决方法
- ASP.NET中“检测到有潜在危险的表单值”的解决方法
- ASP.NET中“检测到有潜在危险的表单值”的解决方法
- [收藏]Asp.Net 连接Oracle数据库 出现"找到 Oracle 客户端和网络组件" 彻底解决方法!
- 关于IIS+ASP.net 中客户端访问出现的用户和密码提示解决方法
- ASP.NET中“检测到有潜在危险的表单值”的解决方法 (转)
- 在Asp.net中建立Microsoft.Office.Interop.Word.Application时出现“拒绝访问”错误的解决方法
- ASP.NET防止同一个帐号多个用户同时登陆的解决方法
- 解决"Visual Studio .NET 已检测到指定的 Web 服务器运行的不是 ASP.NET 1.1 版。您将无法运行 ASP.NET Web应用程序或服务"的方法
- 尝试调试 ASP.NET Web 应用程序时出现权限错误的解决方法
- Asp.net上传文件限制,在大于5M的时候出现DNS解析错误,解决方法。
- ASP.NET中“检测到有潜在危险的表单值”的解决方法