You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP环境下如何避免页面合并输出并实现验证码前置访问

问题核心原因

你现在出现页面合并是因为index.php顶部直接用require_once引入了captcha.php,相当于把验证码页面的所有代码和输出直接嵌入到了首页中,自然会合并返回。同时原代码还存在session未启动、跳转路径错误、验证码生成逻辑错误、无验证成功状态标记的问题。


第一步:修改captcha.php

修正逻辑:启动session、正确存储验证码到session、验证通过后设置专属状态标记再跳转到首页,代码如下:

<?php
session_start(); // 必须启动session才能存储验证码和验证状态
require_once __DIR__ . '/vendor/autoload.php';
use Gregwar\Captcha\PhraseBuilder;
use Gregwar\Captcha\CaptchaBuilder;

// 已经验证通过的用户直接跳转首页,无需重复验证
if (isset($_SESSION['captcha_passed']) && $_SESSION['captcha_passed'] === true) {
    header('Location: index.php');
    exit;
}

// 处理验证码提交请求
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $check_phrase = PhraseBuilder::comparePhrases($_SESSION['phrase'] ?? '', $_POST['phrase'] ?? '');
    if ($check_phrase === true) {
        // 验证通过,设置永久有效的状态标记
        $_SESSION['captcha_passed'] = true;
        // 跳转使用访问URL路径,不要用__DIR__(这是服务器本地文件路径,不是对外访问路径)
        header('Location: index.php');
        exit;
    } else {
        $error = '验证码输入错误,请重新输入';
    }
}

// 生成新的验证码存入session
$captcha = new CaptchaBuilder;
$captcha->build();
$_SESSION['phrase'] = $captcha->getPhrase();
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>请输入验证码</title>
</head>
<body>
<?php if (isset($error)) echo '<p style="color:red;">'.$error.'</p>'; ?>
<form method="post">
    <div>
        Copy the CAPTCHA:
    </div>
    <div>
        <img src="<?php echo $captcha->inline(); ?>" alt="Captcha"/>
    </div>
    <br>
    <div>
        <label>
            <input type="text" name="phrase" />
        </label>
        <input type="submit" />
    </div>
    <br>
    <div>
        &nbsp;
    </div>
</form>
</body>
</html>

第二步:修改index.php

删除原来的require引入语句,改成先判断session内的验证状态,未通过就直接跳转到独立的验证码页面:

<?php
session_start();
// 未通过验证直接跳转去验证码页面
if (!isset($_SESSION['captcha_passed']) || $_SESSION['captcha_passed'] !== true) {
    header('Location: captcha.php');
    exit;
}
?>
<!doctype html>
<html lang="en">
    <head>
    <title>You Win!</title>
    <meta charset="utf-8" />
    </head>
    <body>
    <h1>You Really Win!</h1>
    <h2>Win Baby, Win!</h2>
    </body>
</html>

效果说明

两个页面现在完全独立,访问首页时如果未验证会自动跳转到独立的验证码页面,验证通过后才会返回首页内容,不会再出现两个页面输出合并的情况。整个逻辑仅依赖PHP超全局变量和session,不需要引入JavaScript,完全符合你的环境限制。

内容的提问来源于stack exchange,提问作者Anoduck - The Anonymous Duck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 10:24:02