Windows 2003 + IIS + PHP 验证码不显示的解决方法
一、根本原因(99% 都是这个)
PHP 验证码依赖 GD 库 + 输出前不能有任何空白 / 换行。Windows 2003 上最容易犯:
GD 库没开启
PHP 文件 BOM 头
输出前有空格、空行、echo、print
session 冲突
二、立刻解决(按顺序做)
1. 开启 php_gd2.dll(最重要)
找到你的
php.ini搜索:
;extension=php_gd2.dl
改成:
extension=php_gd2.dll
重启 IIS
开始 → 运行 →
iisreset
2. 检查是否有 BOM 头(必查)
验证码文件(如 code.php、verify.php)必须是 UTF-8 无 BOM!
用记事本打开 → 另存为 → 编码选择 ANSI 或 UTF-8 无 BOM
BOM 会直接导致图片破掉。
3. 验证码文件最顶部绝对不能有任何东西
错误 ❌:
(空行) <?phpsession_start();
正确 ✅:
<?php
session_start();
ob_clean(); // 关键!清空输出缓冲区
header("Content-type: image/png");
// 后面验证码代码...必须加 ob_clean (); 否则 Windows 2003 经常输出隐形空白,图片不显示。
4. 检查 PHP 错误是否被输出
php.ini 中:display_errors = Off
错误信息会直接破坏图片流。
5. 权限问题(Windows 2003 经典坑)
给 PHP 临时目录 Users 完全控制:
找到 php.ini 中
upload_tmp_dir = C:\WINDOWS\Temp session.save_path = C:\WINDOWS\Temp
右键 C:\WINDOWS\Temp
安全 → 添加 Everyone 或 IUSR_计算机名
权限:读取 + 写入 + 修改
三、最简单测试代码(直接替换你的验证码)
把下面代码存为
code.php,UTF-8 无 BOM,访问看是否出图:<?php
session_start();
ob_clean();
header('Content-Type: image/png');
$img = imagecreatetruecolor(100, 30);
$bg = imagecolorallocate($img, 255,255,255);$
color = imagecolorallocate($img, 0,0,0);
imagefill($img,0,0,$bg);
imagestring($img,5,10,5,'1234',$color);
imagepng($img);
imagedestroy($img);
?>3. 最重要 3 条铁律(违反就不显示)
<?php 前面绝对不能有任何空格、空行、汉字
文件不能是 UTF-8 BOM(必须无 BOM)
验证码文件里不能有 echo、print、HTML
四、怎么判断问题
直接访问:
http://你的域名/code.php显示小红叉 × → GD 没开 或 文件有 BOM / 空格
显示乱码 → header 不对 或 前面有输出
显示图片 1234 → 环境正常,是你原来代码问题
