根本原因是iis未将/user/list等请求转发给index.php处理,导致thinkphp未启动;需确保web.config正确配置重写规则、已安装并启用url rewrite模块、php.ini中cgi.fix_pathinfo=1,且权限与缓存无干扰。

ThinkPHP 5.0 在 IIS 上伪静态后首页能打开、内页报 404,根本原因不是路由写错了,而是 IIS 没把 /user/list 这类请求转发给 index.php 处理——请求压根没进框架,自然无法解析任何路由。
IIS 的 web.config 必须包含正确重写规则
TP5 默认使用 index.php?s=/module/controller/action 模式,IIS 需通过 web.config 实现 URL 重写。若站点根目录下没有该文件,或规则缺失/错误,所有非根路径都会直接 404。
- 确保
web.config放在网站根目录(即index.php所在目录),不是项目根目录 - 内容必须包含标准的
<rewrite></rewrite>节点,且匹配模式为^(.*)$,目标为index.php?s={R:1} - 推荐完整规则(适用于 TP5,默认入口在根目录):
<?xml version="1.0" encoding="UTF-8"?><configuration><system.webserver><rewrite><rules><rule name="ThinkPHP" stopprocessing="true"><match url="^(.*)$"></match><condition logicalgrouping="MatchAll"><add input="{REQUEST_FILENAME}" matchtype="IsFile" negate="true"></add><add input="{REQUEST_FILENAME}" matchtype="IsDirectory" negate="true"></add></condition><action type="Rewrite" url="index.php?s={R:1}"></action></rule></rules></rewrite></system.webserver></configuration>
确认 IIS 已启用 URL Rewrite 模块
该模块不是默认安装的,缺少它,web.config 中的 <rewrite></rewrite> 会被完全忽略,等同于没配。
- 进入服务器管理器 → “添加角色和功能” → 在“Web 服务器(IIS)”→“Web 服务器”→“应用程序开发”中勾选“URL 重写”
- 安装完成后重启 IIS(运行
iisreset或在 IIS 管理器中重启站点) - 检查 IIS 管理器左侧站点节点下是否有“URL 重写”图标,没有则说明未生效
验证 PHP 是否正确传递 PATH_INFO 或 QUERY_STRING
TP5 依赖 $_GET['s'] 解析路由,而 IIS 重写后需确保参数能被 PHP 正确接收。常见干扰项:
- 检查
php.ini中cgi.fix_pathinfo=1(必须为 1,否则s=xxx可能丢失) - 避免在 IIS 中额外配置“FastCGI 设置”覆盖 PATH_INFO;TP5 不依赖
PATH_INFO,只认s=参数 - 临时在
index.php开头加:var_dump($_GET); exit;,访问/user/list,应看到["s"]=> string(11) "/user/list"
排除 Windows 权限与缓存干扰
IIS + Windows 环境下,权限和缓存问题比 Linux 更隐蔽:
- 确保 IIS_IUSRS 对网站目录有“读取与执行”、“列出文件夹内容”、“读取”权限
- 清除 ThinkPHP 运行缓存:
runtime/cache/、runtime/route.php全删掉 - 用浏览器无痕模式或
curl -I http://yoursite/user/list测试,避免浏览器缓存 404 响应
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











