You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows 2012 Server IIS中Codeigniter子应用间歇性404问题求助

我之前帮朋友处理过几乎一模一样的问题,结合CodeIgniter在IIS子目录部署的常见坑,给你几个针对性的排查和解决步骤:

第一步:检查CodeIgniter核心配置

首先确认框架本身的配置适配子目录环境:

  • 打开application/config/config.php,确保$config['base_url']设置为完整的子目录路径,比如http://www.domain.com/subfolder/(注意末尾的斜杠不能少),别用相对路径,IIS对绝对路径的依赖比Apache更强。
  • 如果你配置了URL重写,把$config['index_page']设为空字符串'',否则会和IIS的重写规则冲突,导致路由解析失败。
第二步:验证子目录下的URL重写规则

CodeIgniter的路由完全依赖URL重写,子目录下的规则很容易出错:

  • 确保你的subfolder目录下有正确的web.config文件,重写规则要适配子目录结构,参考示例:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="CodeIgniter Subfolder Rewrite" stopProcessing="true">
                    <match url="^(.*)$" ignoreCase="false" />
                    <conditions logicalGrouping="MatchAll">
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="index.php/{R:1}" appendQueryString="true" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>
  • 检查IIS的URL重写模块状态,有时候模块会间歇性失效。打开IIS管理器→站点→“模块”,确认RewriteModule处于启用状态;如果没找到,运行命令重新注册:%windir%\system32\inetsrv\appcmd install module /name:Rewrite /image:%windir%\system32\inetsrv\rewrite.dll
第三步:排查应用池的回收与权限问题

间歇性错误90%和应用池的状态有关:

  • 查看应用池的回收设置:打开应用池→高级设置,检查“回收”下的规则,比如是否设置了固定时间回收、内存/CPU阈值回收?如果回收后应用没有正确初始化,会导致路由失效。建议暂时关闭自动回收,测试是否还出现404;如果问题消失,再调整回收策略(比如延长回收间隔)或优化应用的内存占用。
  • 确认应用池身份权限:给应用池身份(比如IIS AppPool\你的应用池名称)添加subfolder目录的读取和执行权限,特别是index.php和application文件夹,权限继承失效是IIS部署常见的隐形坑。
第四步:通过日志定位具体错误

别盲目试错,先看日志找线索:

  • 查看IIS站点日志(默认路径C:\inetpub\logs\LogFiles),找到出现404的请求记录,重点看cs-uri-stem(请求的URL)和sc-substatus(404的子状态码,比如404.3是权限/模块问题),能帮你快速定位是特定路由还是全局规则问题。
  • 开启CodeIgniter日志:在config.php里设置$config['log_threshold'] = 2;,日志会存在application/logs目录,出现404时查看是否有路由解析失败、控制器加载错误等具体信息。
第五步:关闭快速失败保护(临时排查用)

如果应用偶尔抛出未捕获异常,IIS的快速失败保护会自动禁用应用池,导致404:

  • 打开应用池→高级设置,找到“快速失败保护”,暂时把“失败次数”调至更高(比如20)或直接关闭,测试是否还出现问题。如果是这个原因,你需要修复应用里的未捕获异常,再恢复保护设置。

按照这个顺序排查,大概率能找到问题根源——我那个朋友就是因为应用池回收后URL重写模块没有重新加载,调整了回收策略就彻底解决了。

内容的提问来源于stack exchange,提问作者santosh_dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 18:17:53