thinkphp 5 在 iis 下伪静态失败主因是 url rewrite 模块未安装或 web.config 配置错误:需安装 url rewrite module 2.1+、web.config 必须置于 public 目录且含正确 rule(url="index.php?s={r:1}")、排除静态资源,并启用 url_route_on=true 和 pathinfo_depr='/'。

ThinkPHP 5 在 IIS 下伪静态配置失败,90% 是因为 web.config 规则没写对,或 URL Rewrite 模块根本没装 —— 不是框架问题,是 Windows 服务器环境本身不默认支持重写。
IIS 必须先装 URL Rewrite Module
ThinkPHP 的伪静态依赖 IIS 的重写能力,而这个功能不是 IIS 自带的。Windows Server 默认不装,共享主机也常禁用。
- 去 IIS 官网下载 URL Rewrite Module 2.1+(支持 Win2012+ 和 IIS 8+)
- 安装后,在 IIS 管理器 → 选择站点 → 右侧“模块”里应能看到
UrlRewriteModule - 如果看不到,说明模块未加载:检查
%windir%\System32\inetsrv\config\applicationHost.config中是否有<add name="UrlRewriteModule" image="%windir%\System32\inetsrv\iisurlrewritemodule.dll"></add>
web.config 文件必须放在 public 目录下
ThinkPHP 5 入口文件 index.php 默认在 public/ 目录,web.config 必须和它同级,放错位置(比如根目录或 application 目录)会导致规则完全不触发。
- 新建纯文本文件,命名为
web.config,编码为 UTF-8(无 BOM) - 内容如下(适配 TP5 默认 PATHINFO 路由):
<?xml version="1.0" encoding="UTF-8"?><configuration><system.webserver><rewrite><rules><rule name="ThinkPHP" stopprocessing="true"><match url="^(.*)$" ignorecase="false"></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>
注意:url="index.php?s={R:1}" 是关键 —— TP5 不依赖 PATHINFO,而是靠 s= 参数传入原始路径,所以不能写成 index.php/{R:1}。
排除静态资源,避免 404 或循环重写
上面的规则会把所有请求都转发给 index.php,包括 .css、.js、.png 这类真实存在的静态文件,导致它们被 PHP 解析报错或返回 404。
- 在
<rules></rules>内,把这个规则放在ThinkPHP规则之前:
<rule name="StaticFiles" stopprocessing="true"><match url=".*\.(?:gif|jpg|jpeg|png|css|js|ico|svg|woff|woff2|ttf|eot)$" ignorecase="true"></match><action type="None"></action></rule>
- 如果项目用了
public/Theme/或public/uploads/这类目录,且里面存了用户上传的图片,也要单独加条件排除,否则访问图片会进路由再 404 - 检查 IIS 日志(
%SystemDrive%\inetpub\logs\LogFiles\W3SVC*),看是否大量出现404.0对于.js或.png请求 —— 那就是没加静态资源排除
TP5 框架内还要确认两项配置
服务器规则只是前半步,框架自己得“认得”这个重写后的请求格式,否则仍会跳转到带 index.php 的 URL 或解析失败。
- 打开
config/app.php,确认以下两项存在且启用:
'url_route_on' => true,'pathinfo_depr' => '/',
- 不要设
'url_model' => 2(该配置已废弃于 TP5.1+),TP5.0.x 可用但不推荐;现代用法统一走路由 + PATHINFO 模拟 - 如果使用子目录部署(如
http://site.com/myapp/),需额外设置'url_domain_root' => '/myapp',否则生成的 URL 会漏掉前缀
最常被忽略的是:IIS 的 web.config 不会自动继承父目录配置,每个子应用(尤其是二级目录部署)都必须有自己独立、位置正确的 web.config,且里面的 index.php?s={R:1} 不能硬编码路径 —— 它只对当前目录生效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











