使用自定义标头重定向PHP

时间:2012-04-10 18:52:29

标签: php .htaccess redirect http-headers

我正在写一个基本的授权系统,我正在努力解决它。涉及两个文件 - index.phplogin.php。登录表单非常简单(它位于index.php内):     

<fieldset class="right">
    <label for="email">Email

        <input id="email" name="email" type="text" value=""/>
    </label>
    <label for="password">Password
        <input id="password" name="password" type="password" />
        <a href="#" onclick="$('#password-box').toggle();" >Forgot your password?<span></span></a>
    </label>
    <div class="btn-login"><button type="submit" value="Login"></button></div>
</fieldset>
</form>

login.php内容:

<?php
//  Include the launcher file.
require_once('globals.php');
require_once(CORE . 'launcher.php');

//  Collect the information sent to us.
$mail = (isset($_POST['email'])) ? $_POST['email'] : '';
$password = (isset($_POST['password'])) ? $_POST['password'] : '';

$LoginError = false;
    // AUTHORIZATION STUFF HERE
if ($LoginError) {
    header('Status: 200');
    header('X-Test: test');
    header('Location: index.php');
    exit();
}

正如您所看到的,我正在向包含该表单的脚本发送自定义标头,以防在登录时出现错误。在index.php中,我正在使用headers_list(),但是我发送的标题不在列表中。

是什么造成的?我在php_value "output_buffering" "0"文件中尝试使用.htaccess,但没有成功。

更新 在Chrome中检查后,浏览器会收到标题,但在PHP中不可用。

提前致谢。

4 个答案:

答案 0 :(得分:3)

您使用header()指定的标头()将出现在服务器的输出中 - &gt;客户。但是,在进行重定向时,浏览器会执行请求,客户端 - &gt;服务器,浏览器没有义务在此新请求中包含您的自定义标头。

答案 1 :(得分:3)

重定向被发送到客户端并由客户端处理,客户端通过导航到给定的Location: index.php来响应。您不应期望浏览器在从服务器请求index.php时提供自定义标头。

CLIENT                                    SERVER
 |------- POST login.php ------------------>|
 |                                          |
 |<- 200, Location: index.php, X-Test:test -| (this is where you send the header)
 |                                          |
 |------- GET index.php ------------------->| (no header from client to server)

答案 2 :(得分:1)

  

我正在向包含表单

的脚本发送自定义标头

不,你不是。您向客户端(用户的浏览器)发送自定义标头,客户端将忽略/丢弃它。

如果您需要维护状态,请使用Cookie /会话或在新位置放置内容,例如header('Location: index.php?login=false');

答案 3 :(得分:1)

正在接收您要发送给用户的自定义标头。但是当浏览器进行重定向时,它们会被丢弃,因为浏览器没有将它们发送到重定向页面。这就是你没有看到它们的原因。