Windows Server 2012 R2 IIS8.5中URL Rewrite致CLR停止的原因?
问题根源分析
这个问题我之前帮同事排查过几乎一模一样的情况,核心根源是URL Rewrite模块的位数和应用池的运行位数不匹配,咱们拆解几个关键线索:
事件日志的核心提示
事件日志里的The Module DLL C:\Windows\system32\inetsrv\rewrite.dll failed to load是关键。在64位的Windows Server 2012 R2系统中:C:\Windows\system32是64位程序的系统目录;- 32位程序访问这个路径时,会被系统自动重定向到
C:\Windows\SysWOW64目录。
你的应用池用的是.NET CLR 4.0,如果默认开启了启用32位应用程序(应用池高级设置里的选项),那么IIS会以32位进程运行,这时候它会去SysWOW64\inetsrv找rewrite.dll,但你安装的如果是64位版本的URL Rewrite模块,这个目录里根本没有对应的dll,自然加载失败,触发HTTPERR日志里的AppOffline状态,直接导致应用池崩溃停止。
手动配置无效的原因
你后来手动在applicationHost.config里添加的配置:<add name="RewriteModule" image="%SystemRoot%\system32\inetsrv\rewrite.dll" preCondition="bitness32" />问题出在路径和预条件不匹配:
bitness32预条件指定模块在32位环境下加载,但你写的路径是64位的system32目录,32位进程访问这个路径会被重定向到SysWOW64,而那里没有rewrite.dll,所以就出现了“Module 'RewriteModule' could not be found”的500错误。为什么没加规则也会崩溃?
URL Rewrite是IIS的全局模块,只要安装成功,就会被自动注册到符合预条件的所有应用池中——哪怕你没添加任何重写规则,模块加载是在应用池启动阶段就执行的,加载失败直接导致应用池无法正常启动,自然返回503错误。
具体解决方案
按照以下步骤操作,就能彻底解决问题:
步骤1:卸载现有URL Rewrite模块,重新匹配位数安装
- 打开服务器管理器→添加和删除功能,找到URL Rewrite模块卸载;
- 根据你的应用池位数选择对应版本的URL Rewrite 2.1模块安装:
- 如果应用池需要开启32位兼容(高级设置中“启用32位应用程序”设为
True),下载并安装32位版本; - 如果应用池用默认64位运行(“启用32位应用程序”设为
False),下载并安装64位版本。
注意:Windows Server 2012 R2对应的URL Rewrite模块要选适配IIS 8.5的版本,别下错了。
- 如果应用池需要开启32位兼容(高级设置中“启用32位应用程序”设为
步骤2:修复applicationHost.config的错误配置
- 打开
C:\Windows\System32\inetsrv\config\applicationHost.config文件; - 删除你之前手动添加的
<add name="RewriteModule"...>配置项——正常安装URL Rewrite模块会自动添加正确的注册信息,包含匹配位数的预条件; - 保存文件后,打开IIS管理器→站点对应的模块列表,确认
RewriteModule已经存在,且预条件和应用池位数一致(比如64位对应bitness64,32位对应bitness32)。
- 打开
步骤3:验证应用池设置并重启服务
- 右键目标应用池→高级设置,检查“启用32位应用程序”的设置,确保和你安装的URL Rewrite模块位数完全匹配;
- 重启应用池和IIS服务(可以用命令
iisreset快速重启); - 再次访问站点,应该就能正常运行了。
内容的提问来源于stack exchange,提问作者mr_blond
相关产品推荐
相关产品推荐

