Windows Server环境下ThinkPHP伪静态排错手册【说明】

夏辰酱_2264

夏辰酱_2264

2026-06-18

395人浏览

原创

iis下访问/index/user直接404,是因为请求未进入thinkphp——iis默认只处理真实文件和目录,需安装并启用url rewrite模块,配置正确web.config(含stopprocessing="true"、appendquerystring="true"、无bom utf-8编码),且关闭「拒绝没有扩展名的请求」策略。

windows server环境下thinkphp伪静态排错手册【说明】

为什么 IIS 下访问 /index/user 直接 404?

不是路由没写,是请求根本没进到 ThinkPHP。IIS 默认只处理真实文件和目录,/index/user 这种路径在磁盘里不存在,就直接返回 404 —— index.php 压根没被调用。

必须靠 URL Rewrite 模块把这类请求强制转发给 index.php,否则框架连初始化都不会触发。

  • 确认 IIS 已安装 URL Rewrite Module(不能只装了但没启用)
  • web.config 必须放在和 index.php 同级的目录下(通常是 public/)
  • 规则中的 match url="^(.*)$" 要匹配全部路径,不能漏掉空路径或带查询参数的请求
  • 若部署在子目录(如 /myapp/),web.config 中的 rule 需加 patternSyntax="Wildcard" 或改用正则,并确保 stopProcessing="true"

web.config 规则写了却没生效?

常见原因是配置未加载或语法错位。IIS 不像 Nginx 那样 reload 就生效,它依赖 web.config 的位置、编码、XML 结构三者同时正确。

最简可用版本(UTF-8 编码保存,无 BOM):

windows-git-ops
windows-git-ops

在 Windows PowerShell 工作区执行 Git 操作时使用此技能,特别适用于创建分支、暂存、提交、合并、状态检查等。

下载
<?xml version="1.0" encoding="UTF-8"?><configuration><system.webserver><rewrite><rules><rule name="ThinkPHP" stopprocessing="true"><match url="^(.*)$"></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>
  • 别用记事本另存为 UTF-8 —— 它会加 BOM,IIS 解析失败直接 500;用 VS Code 或 Notepad++ 保存为 UTF-8 无 BOM
  • appendQueryString="true" 是关键,漏掉会导致 ?lang=zh-cn 这类参数丢失,多语言失效
  • 如果 index.php 不在根目录(比如在 public/),url="index.php?s={R:1}" 要改成 url="public/index.php?s={R:1}"

为什么 /index.php/index/user 能打开,但 /index/user 就白屏?

这是典型的 PATH_INFO 传递失败。ThinkPHP 6/8 默认用 PATH_INFO 解析 index.php/控制器/方法,而 IIS 不自动拆解,必须靠 rewrite 显式塞进 s 参数。

验证方式:在 index.php 开头加一行:

<?php var_dump($_GET['s'], $_SERVER['PATH_INFO']);
die();
  • 正常情况:$_GET['s'] 应为 /index/user,$_SERVER['PATH_INFO'] 可为空(TP 8+ 默认走 s 参数)
  • 如果 $_GET['s'] 是空或不存在,说明 web.config 的 action url 没把 {R:1} 正确传进去
  • 如果用了 URL_MODEL => 1(PATHINFO 模式),则 $_SERVER['PATH_INFO'] 必须有值,此时需确认 IIS 是否启用了 FastCgiModule 并设置了 PHP_FCGI_CHILDREN

宝塔 + IIS 混搭环境怎么配?

宝塔不管理 IIS,所谓“宝塔伪静态模板”对 IIS 无效。Windows Server 上跑 ThinkPHP,要么全用 IIS,要么换 Nginx —— 别指望宝塔能帮你配 IIS 的 web.config。

  • 如果你实际用的是 IIS,就别看宝塔的伪静态选项,它只是个摆设
  • 检查 PHP 运行模式:IIS 下必须用 FastCGI,不能用 ISAPI(已淘汰)
  • PHP 版本建议锁定在 8.2–8.4:PHP 8.5.5 对 $_SERVER 变量初始化更严格,旧版 web.config 可能漏传变量导致 $_SERVER['REQUEST_URI'] 为空
  • runtime 目录权限常被忽略:IIS 用户组(如 IIS_IUSRS)必须对 runtime/ 有写权限,否则即使路由通了也会因日志写入失败而静默白屏

最易被忽略的一点:IIS 的「请求筛选」默认阻止不含扩展名的请求,/index/user 会被拦截。需在 IIS 管理器 → 站点 → 「请求筛选」→ 「HTTP谓词」中允许 GET 和 HEAD,并确认「拒绝没有扩展名的请求」是关闭状态。

php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

10704

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

6261

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2135

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

3948

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

4654

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

3651

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

5237

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

4102

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

12042

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
极客学院Docker视频教程
极客学院Docker视频教程

共33课时 | 19.3万人学习

如何安装 Composer
如何安装 Composer

共1课时 | 208人学习