ThinkPHP6在IIS上隐藏index.php需配置web.config重写规则并确保环境适配:安装URL重写模块;web.config置于项目根目录,规则指向public/index.php;IIS物理路径设为项目根,PHP的DOCUMENT_ROOT须指向public/;框架开启路由且PHP未禁用关键函数。

ThinkPHP6 在 IIS 上实现隐藏 index.php,核心是让所有非真实静态资源的请求(如 /user/login)全部交由 public/index.php 统一处理,并确保框架能正确解析路由参数。IIS 本身不支持 .htaccess,必须使用 web.config 配置 URL 重写规则,且需配合 ThinkPHP 的路径和环境设置。
一、确认 IIS 已安装 URL 重写模块
这是前提条件,没有该模块,web.config 中的重写规则不会生效:
- 下载并安装 URL Rewrite Module 2.1+(微软官方提供,支持 IIS 7.5+)
- 安装后重启 IIS 管理器,或执行
iisreset命令 - 在 IIS 管理控制台 → 选择站点 → 右侧“功能视图”中能看到“URL 重写”图标
二、web.config 规则必须指向 public/index.php
ThinkPHP6 入口强制在 public/ 目录下,web.config 必须放在 项目根目录(即包含 public/ 文件夹的目录),内容如下:
<?xml version="1.0" encoding="UTF-8"?><configuration><system.webserver><rewrite><rules><rule name="ThinkPHP6 Public Router" 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="public/index.php?s={R:1}" appendquerystring="true"></action></rule></rules></rewrite></system.webserver></configuration>
注意三点:
-
url="public/index.php?s={R:1}":明确指向public/下的入口,不是index.php(TP6 不接受根目录入口) -
stopProcessing="true":避免后续规则干扰 -
appendQueryString="true":保留原始查询参数(如?page=2)
三、IIS 站点物理路径与运行目录对齐
IIS 默认以项目根目录为网站物理路径(如 D:\myapp\),但 PHP 实际执行入口在 D:\myapp\public\。因此必须:
- 在 IIS 管理器中右键站点 → “编辑绑定” → 确认“物理路径”设为
D:\myapp\(项目根) - 进入站点 → “处理程序映射” → 找到 PHP 对应的处理器(如
php-cgi.exe)→ 双击打开 → 切换到“请求限制”选项卡 → 勾选“允许执行脚本” - 关键一步:在站点 → “高级设置” → 将 “物理路径”保持不变,但确保 PHP 的
DOCUMENT_ROOT实际指向public/;可通过在public/index.php顶部加验证 —— 输出应为D:\myapp\public,否则需在 PHP 处理器设置中调整-d document_root="D:\myapp\public"或用 web.config 透传
四、ThinkPHP6 框架与 PHP 环境适配
仅靠 web.config 不够,TP6 启动时依赖特定函数和参数:
- 确认 PHP
disable_functions中未禁用putenv、ini_set、scandir - 在
config/app.php中启用路由:'url_route_on' => true - 若使用多应用模式,确保
'default_app' => 'index'与实际目录名一致,且路由定义在对应应用的route/app.php中 - 验证方式:访问
https://yoursite.com/public/index.php应能正常加载首页;再访问https://yoursite.com/user/login(假设该路由存在),若返回正常页面且地址栏无index.php,即生效
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











