Windows 7运行ThinkPHP需配置mod_rewrite或URL Rewrite、启用pathinfo、设置date.timezone及必需扩展;漏配会导致404、时区警告或require失败。

Windows 7 上跑 ThinkPHP 项目,不能只装 PHP 就完事——它对 mod_rewrite(Apache)或 URL Rewrite(IIS)、pathinfo 支持、时区、以及扩展依赖非常敏感。直接用默认配置,大概率卡在「404 路由失效」「date_default_timezone_get(): It is not safe to rely on the system's timezone settings」或「require(): failed to open stream」上。
ThinkPHP 要求的 PHP 扩展和 php.ini 关键项
ThinkPHP 5.1+(主流版本)最低要求 mbstring、openssl、pdo_mysql(如连 MySQL),且必须启用 date.timezone 和 cgi.fix_pathinfo = 1(IIS)或 php_admin_value cgi.fix_pathinfo 1(Apache)。漏掉任意一项,index.php?s=/home/index 类路由或时间相关函数就会出问题。
-
extension=php_mbstring.dll、extension=php_openssl.dll、extension=php_pdo_mysql.dll前的分号必须删掉 -
date.timezone = "Asia/Shanghai"必须显式设置,不能留空或注释 - IIS 下必须有
cgi.fix_pathinfo = 1;Apache 下若用mod_php,该项可不设,但用php-fpm或 FastCGI 模式时也得开 -
display_errors = On和error_reporting = E_ALL建议开发期打开,否则 ThinkPHP 的错误提示被吞掉
IIS 7 + FastCGI 下 PATH_INFO 路由 404 的原因和修复
ThinkPHP 默认使用 PATH_INFO 模式(如 http://localhost/index.php/home/index),而 IIS 默认不传递完整路径信息,导致 $_SERVER['PATH_INFO'] 为空,框架解析失败直接 404。
- 确认
cgi.fix_pathinfo = 1已在php.ini中启用(前面无分号) - 在 IIS 管理器 → 站点 → “处理程序映射” → 找到 PHP 映射 → 右键“编辑” → 勾选“将请求映射到文件(而不是目录)”
- 必须添加 URL 重写规则:在站点根目录放
web.config,内容含<rule name="ThinkPHP_Rewrite" stopProcessing="true">,匹配^index\.php/.*并重写为index.php/{R:1} - 若仍无效,临时改 ThinkPHP 配置:
'url_model' => 2(兼容模式,用?s=参数)验证是否是 PATH_INFO 问题
Apache 下 mod_rewrite 不生效的典型配置错误
ThinkPHP 的伪静态依赖 Apache 的 mod_rewrite,但 Windows 7 下常因三处疏漏导致 .htaccess 被忽略:
立即学习“PHP免费学习笔记(深入)”;
-
httpd.conf中未取消注释:LoadModule rewrite_module modules/mod_rewrite.so -
httpd.conf中对应<Directory "<your-docroot>">块里没加:AllowOverride All(仅None或FileInfo不够) - 项目根目录的
.htaccess文件名必须全小写、无扩展名,且内容第一行是RewriteEngine on,不能有 BOM 头(用 Notepad++ → 编码 → 转为 UTF-8 无 BOM) - 若用 Apache 2.4+,
Require all granted必须存在,否则 403 拦截重写规则
ThinkPHP 项目目录权限导致 include 失败
ThinkPHP 启动时会动态加载大量 think\ 和 app\ 下的类文件,Apache 在 Win7 下默认以 NT AUTHORITY\SYSTEM 运行,若项目目录没给该账户 NTFS 权限,require() 就会报 failed to open stream,且错误日志里不显示具体路径。
- 右键项目文件夹 → “属性” → “安全” → “高级” → “立即查找” → 输入
NT AUTHORITY\SYSTEM→ 添加 - 勾选“读取和执行”、“列出文件夹内容”、“读取”,**不要只点“完全控制”**(不安全)
- “应用于”必须选“此文件夹、子文件夹和文件”,否则
runtime/目录下缓存、日志写入仍失败 - 如用
php-cgi.exe+ IIS,还需确认应用程序池“启用 32 位应用程序”为True(绝大多数 PHP 包仍是 32 位)
最易被忽略的是:ThinkPHP 的 runtime 目录必须可写,且其父级(app、public)的 NTFS 权限要逐级继承;web.config 或 .htaccess 任一字符错误都会静默失效,建议先用 phpinfo() 确认 PATH_INFO 或 QUERY_STRING 是否被正确捕获。



















