为什么相同的重定向功能会给我不同的行为

时间:2012-10-21 01:13:28

标签: php codeigniter redirect http-status-code-302

如果我忽略302,我会看到redirect()停止输出,但header()没有。 redirect()使用header()设置302响应。行为不同,功能相同。是什么给了什么?

某些背景信息:我正在使用CodeIgniter建立一个网站,而我正在玩该网站应如何处理访客和会员。

扩展CI核心:

class MY_Controller extends CI_Controller {
    if (! $authenticated) redirect('/login');
}

现在是一个控制器:

class Members_only extends MY_Controller {
    function index()
    {
    // Display members only content
    }
}

然后我想,如果Alice(未经身份验证的访问者)忽略302响应怎么办?她可以在重定向后看到其余的内容吗?所以我测试了它,现在我完全糊涂了。有两个函数可供我发送302重定向。

header('Location: http://mywebsite.com/login', TRUE, 302);

来自CI的URL帮助者:

redirect('/login');

这是从内部看起来的样子:

function redirect($uri = '', $method = 'location', $http_response_code = 302)
{
    if ( ! preg_match('#^https?://#i', $uri))
    {
        $uri = site_url($uri);
    }

    switch($method)
    {
        case 'refresh' : header("Refresh:0;url=".$uri);
                         break;
        default        : header("Location: ".$uri, TRUE, $http_response_code);
                         break;
    }
    exit;
}

site_url()正在返回“http://mywebsite.com/login”。

有人可以指出我在这里缺少的东西吗?

1 个答案:

答案 0 :(得分:2)

您是否在CI重定向功能中看到了exit?因此,无论何时使用它,都会导致应用程序停止处理您剩下的任何代码。这是您遇到的“不同”行为。

http://php.net/manual/en/function.exit.php