iis下访问/index/user直接404,是因为请求未进入thinkphp——iis默认只处理真实文件和目录,需安装并启用url rewrite模块,配置正确web.config(含stopprocessing="true"、appendquerystring="true"、无bom utf-8编码),且关闭「拒绝没有扩展名的请求」策略。

为什么 IIS 下访问 /index/user 直接 404?
不是路由没写,是请求根本没进到 ThinkPHP。IIS 默认只处理真实文件和目录,/index/user 这种路径在磁盘里不存在,就直接返回 404 —— index.php 压根没被调用。
必须靠 URL Rewrite 模块把这类请求强制转发给 index.php,否则框架连初始化都不会触发。
- 确认 IIS 已安装 URL Rewrite Module(不能只装了但没启用)
-
web.config必须放在和index.php同级的目录下(通常是public/) - 规则中的
match url="^(.*)$"要匹配全部路径,不能漏掉空路径或带查询参数的请求 - 若部署在子目录(如
/myapp/),web.config中的rule需加patternSyntax="Wildcard"或改用正则,并确保stopProcessing="true"
web.config 规则写了却没生效?
常见原因是配置未加载或语法错位。IIS 不像 Nginx 那样 reload 就生效,它依赖 web.config 的位置、编码、XML 结构三者同时正确。
最简可用版本(UTF-8 编码保存,无 BOM):
<?xml version="1.0" encoding="UTF-8"?><configuration><system.webserver><rewrite><rules><rule name="ThinkPHP" stopprocessing="true"><match url="^(.*)$"></match><conditions logicalgrouping="MatchAll"><add input="{REQUEST_FILENAME}" matchtype="IsFile" negate="true"></add><add input="{REQUEST_FILENAME}" matchtype="IsDirectory" negate="true"></add></conditions><action type="Rewrite" url="index.php?s={R:1}" appendquerystring="true"></action></rule></rules></rewrite></system.webserver></configuration>
- 别用记事本另存为 UTF-8 —— 它会加 BOM,IIS 解析失败直接 500;用 VS Code 或 Notepad++ 保存为 UTF-8 无 BOM
-
appendQueryString="true"是关键,漏掉会导致?lang=zh-cn这类参数丢失,多语言失效 - 如果
index.php不在根目录(比如在public/),url="index.php?s={R:1}"要改成url="public/index.php?s={R:1}"
为什么 /index.php/index/user 能打开,但 /index/user 就白屏?
这是典型的 PATH_INFO 传递失败。ThinkPHP 6/8 默认用 PATH_INFO 解析 index.php/控制器/方法,而 IIS 不自动拆解,必须靠 rewrite 显式塞进 s 参数。
验证方式:在 index.php 开头加一行:
<?php var_dump($_GET['s'], $_SERVER['PATH_INFO']); die();
- 正常情况:
$_GET['s']应为/index/user,$_SERVER['PATH_INFO']可为空(TP 8+ 默认走s参数) - 如果
$_GET['s']是空或不存在,说明web.config的action url没把{R:1}正确传进去 - 如果用了
URL_MODEL => 1(PATHINFO 模式),则$_SERVER['PATH_INFO']必须有值,此时需确认 IIS 是否启用了FastCgiModule并设置了PHP_FCGI_CHILDREN
宝塔 + IIS 混搭环境怎么配?
宝塔不管理 IIS,所谓“宝塔伪静态模板”对 IIS 无效。Windows Server 上跑 ThinkPHP,要么全用 IIS,要么换 Nginx —— 别指望宝塔能帮你配 IIS 的 web.config。
- 如果你实际用的是 IIS,就别看宝塔的伪静态选项,它只是个摆设
- 检查 PHP 运行模式:IIS 下必须用 FastCGI,不能用 ISAPI(已淘汰)
- PHP 版本建议锁定在 8.2–8.4:PHP 8.5.5 对
$_SERVER变量初始化更严格,旧版web.config可能漏传变量导致$_SERVER['REQUEST_URI']为空 - runtime 目录权限常被忽略:IIS 用户组(如
IIS_IUSRS)必须对runtime/有写权限,否则即使路由通了也会因日志写入失败而静默白屏
最易被忽略的一点:IIS 的「请求筛选」默认阻止不含扩展名的请求,/index/user 会被拦截。需在 IIS 管理器 → 站点 → 「请求筛选」→ 「HTTP谓词」中允许 GET 和 HEAD,并确认「拒绝没有扩展名的请求」是关闭状态。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











