ThinkPHP在IIS下伪静态失败主因是未安装URL Rewrite Module 2.1或web.config未生效,需安装模块、重启IIS、确认UrlRewriteModule存在,并配置含{R:1}捕获和s=参数的rule,同时框架启用url_model=2。

ThinkPHP 在 IIS 下伪静态配置失败,90% 的情况不是规则写错了,而是根本没走到 PHP 层——IIS 没装重写模块,或者 web.config 没起作用。
必须先装 URL 重写模块
IIS 默认不带 URL Rewrite 功能,哪怕 web.config 写得再标准,也会被完全忽略,且不报错。
- 去微软官网下载安装 URL Rewrite Module 2.1(支持 IIS 7.5 及以上)
- 安装完必须执行
iisreset或重启整个 IIS 服务(只重启网站无效) - 打开 IIS 管理器 → 左侧“模块”列表里要能看到 UrlRewriteModule,没有就说明没生效
- 共享主机用户无法安装模块,伪静态不可行,只能退回到
index.php/xxx显式路径
web.config 规则要显式转发到 index.php?s=
IIS 不会自动把 /user/list 转成 index.php?s=/user/list,这一步必须靠规则明确写出。
- rule 中
后,必须用{R:1}捕获路径,比如url="index.php?s=/{R:1}" -
s=参数不能省——ThinkPHP 5/6 的 PATHINFO 模式全靠它解析路由,漏掉就会 404 - 如果项目部署在子目录(如
http://site.com/shop/),match 要加前缀:,且 s= 值要与实际路径一致,例如url="index.php?s=/shop/{R:1}" - web.config 必须放在 public 目录下(不是项目根目录),编码为 UTF-8 无 BOM
ThinkPHP 框架配置要同步开启 PATHINFO 模式
IIS 把请求转给 index.php?s=xxx 后,框架还得认这个格式,否则照样 404。
- 检查
config/app.php中的'url_model' => 2(PATHINFO 模式),不能是 0 或 1 -
'url_html_suffix'如果留空,就别在 rule 里额外匹配.html;如果设了'.html',规则里就要兼容它 - 确保 public 目录是网站物理路径,且 IIS 应用池身份(如
IIS AppPool\YourApp)对该目录有读取 + 执行权限,否则会 403
常见 403/404 排查顺序
别一上来就改 web.config,按这个顺序查:
- 先确认 IIS “模块”列表中有没有 UrlRewriteModule
- 再看 web.config 是否在 public 目录下、编码是否为 UTF-8 无 BOM
- 检查是否误把 web.config 放在了项目根目录或 vendor 目录下
- 开发时用
php -S内置服务器测试,IIS 规则完全不生效,不能用来验证伪静态
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











