ThinkPHP5.*版本验证码不显示,代码是直接复制的官方手册中的代码:


<FORM method="post" class="form" action="{:url('check')}">
输入验证码:<INPUT type="text" class="text" name="code"><br/>
<div>{:captcha_img()}</div>
<INPUT type="submit" class="btn" value=" 提交 ">
</FORM>

错误截图:

网上对ThinkPHP5.*版本验证码不显示的原因总结有以下几条:

1.未安装验证码类库

解决办法:DOS切换到项目根目录,执行Composer安装类库。


composer require topthink/think-captcha=1.*

我的ThinkPHP5.*是完整版的,因此默认包含了验证码类库,排除问题1。

2.未开启GD库

解决办法:开启GD库。

经过检查,本地环境已开启GD库,排除问题2。

3.文件UTF-8 BOM头问题

解决办法:在验证码控制器中添加代码:


ob_clean();

文件位置:/vendor/topthink/think-captcha/src/CaptchaController.php

经过检查,我的文件格式为UTF-8无BOM头格式,因此排除问题3。

4.伪静态原因,右键复制验证码网址,在浏览器中打开发现是404。

这个问题是因为我们没有配置路由去隐藏 index.php,而ThinkPHP5.*的验证码默认生成的URL是不带index.php的,这就导致验证码url404从而无法显示。

解决办法:按照官方手册的教程隐藏入口文件,在入口文件的同级目录下新建.htaccess文件,输入如下代码后保存。


<IfModule mod_rewrite.c>
Options +FollowSymlinks -Multiviews
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>

然后刷新下页面,发现验证码已经正常显示了,问题解决。