Windows 2003 + IIS + PHP 验证码不显示的解决方法

一、根本原因(99% 都是这个)

PHP 验证码依赖 GD 库 + 输出前不能有任何空白 / 换行。Windows 2003 上最容易犯:
  1. GD 库没开启

  2. PHP 文件 BOM 头

  3. 输出前有空格、空行、echo、print

  4. session 冲突


二、立刻解决(按顺序做)

1. 开启 php_gd2.dll(最重要)

  1. 找到你的 php.ini

  2. 搜索:

;extension=php_gd2.dl
改成:
extension=php_gd2.dll
  1. 重启 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 完全控制
  1. 找到 php.ini 中

upload_tmp_dir = C:\WINDOWS\Temp
session.save_path = C:\WINDOWS\Temp

右键 C:\WINDOWS\Temp

  • 安全 → 添加 EveryoneIUSR_计算机名

  • 权限:读取 + 写入 + 修改


三、最简单测试代码(直接替换你的验证码)

把下面代码存为 code.phpUTF-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 条铁律(违反就不显示)

  1. <?php 前面绝对不能有任何空格、空行、汉字

  2. 文件不能是 UTF-8 BOM(必须无 BOM)

  3. 验证码文件里不能有 echo、print、HTML


四、怎么判断问题

直接访问:http://你的域名/code.php
  • 显示小红叉 × → GD 没开 或 文件有 BOM / 空格

  • 显示乱码 → header 不对 或 前面有输出

  • 显示图片 1234 → 环境正常,是你原来代码问题


遇到问题?请给我们留言

请填写您的电话号码,我们将回复您电话