iis必须安装url rewrite module 2.1并重启服务,web.config中需显式配置,且thinkphp的url_model必须设为2(pathinfo模式),三者缺一不可。

URL Rewrite Module 没装,web.config 再对也白搭
IIS 默认不带 URL 重写能力,web.config 里的 <rewrite></rewrite> 节点会被完全忽略——连错误日志都不会记一条,直接 404 或 403。这不是 ThinkPHP 的问题,是 IIS 根本没收到重写指令。
必须手动安装微软官方模块:URL Rewrite Module 2.1(不是 2.0,IIS 7.5+ 推荐用 2.1)。安装后重启整个 IIS 服务(iisreset),再打开 IIS 管理器,左侧“模块”列表里得能看到 UrlRewriteModule 才算生效。
- 下载地址:微软官网搜索
URL Rewrite Module 2.1,选 x64 或 x86 匹配系统位数 - 共享主机用户若无法安装模块,伪静态不可行,只能退回到
index.php/xxx显式路径 - 安装完别只重启网站,必须
iisreset或重启 IIS 服务,否则模块不加载
web.config 的 rule 必须显式转发到 index.php?s=
很多示例只写 <match url="^(.*)$"></match>,但没指定怎么处理匹配结果。IIS 不会自动把 /user/list 变成 index.php?s=/user/list,这步必须靠 <action></action> 显式声明。
ThinkPHP 5/6 的 PATHINFO 模式依赖 s= 参数解析路由,漏掉它,哪怕请求进了 PHP,也会 404。
- rule 中必须包含
<action type="Rewrite" url="index.php?s={R:1}"></action> -
{R:1}是正则捕获组,对应^(.*)$匹配到的完整路径 - 如果项目入口不在根目录(比如部署在
/myapp/下),需加<match url="^myapp/(.*)$"></match>并调整url="index.php?s=/{R:1}" - 不要用网上流传的空
<conditions></conditions>或只写<match></match>不写<action></action>的配置
ThinkPHP 配置必须和 IIS 规则对齐
IIS 把请求转给 index.php?s=xxx 后,ThinkPHP 还得认得这个格式。如果框架没开 PATHINFO 模式,照样 404。
检查 config/app.php(TP5)或 config/app.php 中的 url_model 值:
- 设为
2(PATHINFO 模式),不是1(兼容模式)或0(普通模式) - 确认
url_html_suffix为空或与规则一致;若留空,就别在 rule 里匹配.html - 确保
public目录是网站物理路径,且 IIS 应用池身份(如IIS AppPool\YourApp)对该目录有读取+执行权限——上层目录权限不足会导致 403
常见 403/404 错误排查顺序
遇到 403 或 404,按这个顺序查,别一上来就改 web.config:
- 先确认
UrlRewriteModule是否出现在 IIS “模块”列表中 - 再看
web.config是否放在public目录下(不是项目根目录),且编码为 UTF-8 无 BOM - 检查
web.config中<action></action>是否存在、url值是否拼错(比如写成index.php?/s={R:1}少了等号) - 最后验证
url_model和目录权限——这两项被忽略最多,尤其权限问题常被当成配置错误反复折腾
PATHINFO 模式下,s= 参数是硬性约定,IIS 规则、框架配置、目录权限三者缺一不可。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











