必须安装URL Rewrite Module 2.1、配置含{R:1}捕获和s=参数的web.config规则、并设置ThinkPHP的url_model=2,三者缺一不可;否则IIS静默忽略重写规则,直接返回404或403。

必须安装 URL Rewrite Module 2.1
IIS 默认不带重写能力,web.config 里的 <rewrite> 标签会被完全忽略,哪怕写得再完美也没用。
要确认是否生效,打开 IIS 管理器 → 左侧“模块”列表 → 找到 UrlRewriteModule。没看到就说明没装或没启好。
安装后必须执行:iisreset(重启整个 IIS 服务),不能只重启网站。
下载地址:微软官网搜 URL Rewrite Module 2.1,选匹配系统位数的版本(x64/x86)。
web.config 要放在 public 目录下,且含正确重写动作
文件位置错了,规则就无效——必须放在 ThinkPHP 的 public 目录里(即 index.php 所在目录),不是项目根目录。
编码必须是 UTF-8 无 BOM,否则可能解析失败。
规则不能只写匹配,必须显式转发到 index.php?s=/{R:1}:
– <match url="^(.*)$"> 捕获全部路径
– <action type="Rewrite" url="index.php?s=/{R:1}" /> 这一行不能少
– 若项目部署在子目录(如 /myapp/),match 改为 ^myapp/(.*)$,url 改为 index.php?s=/{R:1}
ThinkPHP 必须启用 PATHINFO 模式
即使请求成功进了 index.php,框架不认识 s= 参数也会 404。
检查配置文件:
– TP5:config/app.php 中 'url_model' => 2
– TP6:config/app.php 中 'url_common_param' => true 且 'url_route_on' => true,同时确保未开启兼容模式
不要设 'url_html_suffix' => '.html' 却又没在规则里匹配 .html,留空最稳妥。
另外,IIS 应用池身份(如 IIS AppPool\YourApp)需对 public 目录有读取+执行权限,上层目录权限不足会导致 403。
排查 403/404 的实际顺序
别一上来就调 web.config:
– 先看 IIS 模块列表有没有 UrlRewriteModule
– 再确认 web.config 在 public 下、UTF-8 无 BOM
– 然后检查 PHP 是否能正常运行(比如直接访问 index.php 是否显示 TP 欢迎页)
– 最后核对 url_model=2 和 rule 中的 s=/{R:1} 是否一致
共享主机用户若无法安装模块,伪静态不可行,只能退回到 index.php/xxx 显式路径。
立即学习“PHP免费学习笔记(深入)”;



















