thinkphp在iis伪静态失效主因是url重写模块未安装、web.config缺失关键节点或未加conditions判断真实文件/目录,需装url rewrite module 2.1、重启iis服务、配置含{r:1}捕获和s=参数的rule,并启用url_model=2。

ThinkPHP 在 Windows IIS 上伪静态失效,90% 不是规则写错了,而是根本没进到 PHP 层——URL 重写模块没装、web.config 缺关键节点、或静态资源被错误转发。
URL Rewrite Module 必须先装,且要重启整个 IIS 服务
IIS 默认不带 URL 重写功能,rewrite.dll 是独立模块。没它,<rewrite></rewrite> 节点完全被忽略,连错误日志都不会记。
- 去微软官网下载
URL Rewrite Module 2.1(支持 IIS 7.5+) - 安装后必须运行
iisreset(不是“重启网站”,是重启 IIS 服务本身) - 打开 IIS 管理器 → 左侧“模块”列表里确认出现
UrlRewriteModule,没有就说明没生效 - 共享主机用户若无法安装该模块,伪静态不可行,只能用
index.php显式路径
web.config 文件名、位置、编码一个都不能错
web.config 是大小写敏感的,且必须放在含 index.php 的网站根目录,否则 IIS 根本不读。
- 文件名必须是
web.config,不是Web.config或web.Config - 必须保存为 UTF-8 无 BOM 编码,否则 IIS 报“配置解析失败”
- XML 结构缺一不可:
<configuration></configuration>→<system.webserver></system.webserver>→<rewrite></rewrite>→<rules></rules>,漏掉任一层,整个规则失效 - 常见错误:复制了
<rule></rule>片段,但没补全外层节点,导致index.php自己也被 404
rule 中必须有 <conditions></conditions> 判断真实文件/目录存在性
只写 <match url="^(.*)$"></match> 不够——IIS 会把 /static/css/app.css 也转发给 index.php,结果样式全丢、接口 404。
-
<conditions></conditions>必须包含两条判断:{REQUEST_FILENAME} !-d(非真实目录)和{REQUEST_FILENAME} !-f(非真实文件) - 重写动作必须显式指定:
<action type="Rewrite" url="index.php?s={R:1}"></action>,不能只匹配不处理 -
stopProcessing="true"要加上,避免后续规则干扰 -
ignoreCase="false"建议显式声明,避免大小写歧义
ThinkPHP 后端配置必须同步启用 URL_MODEL = 2
前端 web.config 把请求转过去了,后端不认,照样 404。ThinkPHP 需明确告诉自己:“我要走 PATHINFO 模式”。
- 在
config/app.php或对应配置文件中设置:'url_model' => 2 - 入口文件名必须与 web.config 中
url="index.php?s={R:1}"一致,比如改过入口为start.php,这里就得同步改成start.php?s={R:1} - 如果用了子目录部署(如
http://example.com/demo/),{R:1}会包含前缀,需在路由或base_url中协调处理
最容易被忽略的是 <conditions></conditions> 里那两个 !-f 和 !-d——少了它们,你调通了路由,却丢了所有 CSS 和 JS,排查时容易绕远路。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











