Windows Server 上 ThinkPHP 伪静态需用 web.config 替代 .htaccess,必须包含对目录/文件存在的判断条件,且 URL_MODEL 设为 2、入口文件名匹配、URL 重写模块已安装并授权。

Windows Server 上 ThinkPHP 伪静态不能直接套用 .htaccess,必须转成 IIS 能识别的格式——web.config,且规则必须包含对目录/文件存在的判断,否则会把 css、js、images 等静态资源也转发到 index.php,导致页面样式丢失或接口 404。
web.config 文件必须放在网站根目录,且结构不能缺节点
IIS 的 URL 重写模块依赖完整的 XML 层级。漏掉 <rewrite> 或 <rules> 会导致整个规则不生效,连带 index.php 都可能被 404。常见错误是复制了片段但没补全外层 <configuration> 和 <system.webServer>。
-
web.config必须保存为 UTF-8 编码(无 BOM),否则 IIS 会报配置解析失败 - 文件名必须是
web.config,不是Web.config或web.Config—— IIS 区分大小写 - 规则中
<match url="^(.*)$">后面一定要配<conditions>判断是否为真实目录或文件,否则静态资源全部走 PHP
conditions 必须排除真实存在的目录和文件
ThinkPHP 默认入口是 index.php,但项目里还有 Public、static、uploads 这类存放静态资源的目录。如果 <conditions> 为空或写错,IIS 会把 /static/css/app.css 也重写成 index.php/static/css/app.css,最终返回 404 或空白页。
- 正确写法要包含两个
<add>条件:input="{REQUEST_FILENAME}"+matchType="IsDirectory"和matchType="IsFile" - 不要只写
logicalGrouping="MatchAll"就完事,里面必须有实际条件语句 - 若项目有自定义静态路径(如
res目录),需额外加!-d/!-f类似逻辑,但 IIS 里得用<add>显式声明
URL_MODEL 必须设为 2,且入口文件名要匹配规则
ThinkPHP 的 URL_MODEL 配置决定它怎么解析 URL。设成 1(PATHINFO)或 3(兼容模式)时,web.config 规则即使生效,PHP 层也识别不了路由,结果还是 404。
立即学习“PHP免费学习笔记(深入)”;
- 在
config.php或环境配置中确认:'URL_MODEL' => 2(REWRITE 模式) -
<action>中的重写目标必须指向真实入口文件,比如项目用public/index.php入口,规则就得写成public/index.php/{R:1},不能硬写index.php/{R:1} - 如果入口文件改名(如
start.php),web.config里<action>的url值也必须同步改
权限和模块启用是前置硬条件
IIS 不像 Apache 默认开 rewrite,WinServer 上必须手动确认两点:URL 重写模块已安装、网站对应的应用程序池有读取 web.config 的权限。
- 检查服务器是否装了 IIS URL Rewrite Module,没装的话
web.config里的<rewrite>根本不会被处理 - 网站根目录的 NTFS 权限要给
IIS_IUSRS用户「读取」权限,否则 IIS 加载配置时静默失败 - 如果用了子应用或虚拟目录,
web.config必须放在该子应用的物理路径下,而不是主站根目录
最容易被忽略的是 conditions 部分的实际内容——很多人复制了模板却删掉了里面的 <add> 行,以为空 <conditions> 也能工作;还有人把 Public 目录写成 public,在 Windows 下虽然不区分大小写,但 ThinkPHP 路由解析时大小写敏感,会导致静态资源 404。



















