ThinkPHP在IIS上实现伪静态需同时满足IIS正确转发请求至index.php?s={R:1}且框架启用url_model=2的PATHINFO模式;必须安装URL Rewrite Module 2.1、将web.config置于public目录、配置含{R:1}捕获和s=参数的重写规则,并排除真实文件与目录。

ThinkPHP 在 IIS 上实现伪静态,核心是两件事:IIS 正确把请求转发给 index.php,且 ThinkPHP 能识别这个转发格式。光写个空规则没用,必须带重写动作、匹配路径、并传参 s=。
必须先装 URL 重写模块
IIS 默认不带重写功能,web.config 里的 <rewrite></rewrite> 标签会被直接忽略——连报错都不会有。操作步骤:
- 去微软官网下载安装 URL Rewrite Module 2.1(支持 IIS 7.5 及以上)
- 安装完后重启整个 IIS 服务(不是只重启网站)
- 打开 IIS 管理器 → 左侧“模块”列表里确认出现 UrlRewriteModule
- 如果用的是共享主机且无法安装模块,伪静态不可行,只能保留
index.php显式路径
web.config 文件要放在 public 目录下
不是项目根目录,也不是 application 目录,而是 放 index.php 的那个 public 目录。这是很多 403/404 的根源——IIS 应用池用户对该目录至少要有读取 + 执行权限。
若部署在子目录(如 http://site.com/shop/),web.config 仍放 shop/public/ 下,但规则需适配前缀。
立即学习“PHP免费学习笔记(深入)”;
标准可用的 web.config 规则(含 PATHINFO 支持)
以下内容复制保存为 web.config,放入 public 目录即可:
关键点说明:
-
{R:1}是正则捕获组,对应^(.*)$匹配到的完整路径(如/user/list) -
url="index.php?s={R:1}"显式转发,并带上s=参数,ThinkPHP 5/6 的 PATHINFO 模式依赖它解析路由 -
<conditions></conditions>排除真实存在的文件和目录(避免图片、CSS 等静态资源也被重写) - 若项目在子目录(如
/shop/),<match url="^shop/(.*)$">,且 <code>url="index.php?s=/{R:1}"中的路径要与实际一致
ThinkPHP 框架配置要同步开启 PATHINFO
仅 IIS 转发还不够,框架必须认得 s= 这种格式。检查 config/app.php:
-
'url_model' => 2(必须是 2,即 PATHINFO 模式;设成 1 或 0 会失效) -
'url_html_suffix' => ''(留空即可;若设了'.html',规则里就得额外匹配.html后缀)
改完配置记得清空 runtime/cache/ 目录,避免旧路由缓存干扰。



















