PHP:header()函数不重定向。使用HTML或JavaScript重定向时,会话信息将丢失

时间:2012-07-08 21:25:37

标签: php javascript apache redirect http-redirect

这是一个PHP / Apache问题......

  1. 我有以下代码。特别是我想强调一下 以下内容:

          // store email in session variable
    
          $_SESSION["jobseeker_email"] = $_POST["jobseeker_email"];
    
          // perform redirect
    
          $target = util_siblingurl("jobseekermain.php", true);
    
          header("Location: " . $target);
    
          exit; /* ensure code below does not executed when we redirect */
    
  2. 这就是问题所在。当我在localhost上执行此代码时它工作正常, 但是当我在远程服务器(这是一个ipage.com托管网站)上执行它时,我 没有得到预期的结果。实际上,当标题(“Location:$ target);部分运行时 我看到一个空白页面(没有重定向)。好像之前正在输出一些东西 对header()的调用,但事实并非如此,因为我已经检查了它。那么为什么不呢 工作

    1. 如果我注释掉调用header()然后退出的部分,我能够 执行html重定向或javascript重定向。但是,当我这样做 我丢失了会话变量$ _SESSION [“jobseeker_email”]。我不明白为什么 发生这种情况。
    2. 我将非常感谢您对这些问题的任何帮助,因为我需要执行重定向 并且仍然保留来自前一页的会话状态,以及服务器上的所有这些状态 (不只是在localhost上)。

          <?php
      
            session_start();
      
            require_once('include/connect.php');
            require_once('include/util.php');
      
            util_ensure_secure();
      
            if (isset($_GET['logout'])) {
      
              session_destroy();
      
              // restart session
      
              header("Location: " . util_selfurl(true));
      
            }
      
            function do_match_passwords($password1, $password2) {
      
              return strcmp($password1, $password2) == 0;
      
            }
      
            function valid_employer_login($email, $password) {
      
              global $mysqli;
      
              global $employer_error;
      
              $query = "SELECT passwd FROM Employer WHERE email = '" . $mysqli->escape_string($email) . "'";
      
              $result = $mysqli->query($query);
      
              util_check_query_result($query, $result);
      
              $invalid_credentials = false;
      
              if ($result->num_rows == 0) {
      
                $invalid_credentials = true;
      
              } else {
      
                $row = $result->fetch_assoc();
      
                $retrieved_password = $row["passwd"];
      
                if (!do_match_passwords($password, $retrieved_password))
      
              $invalid_credentials = true;
      
              }
      
              if ($invalid_credentials) {
      
                $employer_error = "Invalid credentials.";
      
                return false;
      
              }
      
              return true;
      
            }
      
            function valid_jobseeker_login($email, $password) {
      
              global $mysqli;
      
              global $jobseeker_error;
      
              $query = "SELECT passwd FROM JobSeeker WHERE email = '" . $mysqli->escape_string($email) . "'";
      
              $result = $mysqli->query($query);
      
              util_check_query_result($query, $result);
      
              $invalid_credentials = false;
      
              if ($result->num_rows == 0) {
      
                $invalid_credentials = true;
      
              } else {
      
                $row = $result->fetch_assoc();
      
                $retrieved_password = $row["passwd"];
      
                if (!do_match_passwords($password, $retrieved_password))
      
              $invalid_credentials = true;
      
              }
      
              if ($invalid_credentials) {
      
                $jobseeker_error = "Invalid credentials.";
      
                return false;
      
              }
      
              return true;
      
            }
      
            if (isset($_POST["employer_submitted"])) {
      
              global $error;
      
              // check whether specified username and password have been entered correctly
      
              if (valid_employer_login($_POST["employer_email"], $_POST["employer_password"])) {
      
                // store email in session variable
      
                $_SESSION["employer_email"] = $_POST["employer_email"];
      
                // perform redirect
      
                $target = util_siblingurl("jobseekermain.php", true);
      
                header("Location: " . $target);
      
                exit; /* ensure code below does not executed when we redirect */
      
              }
      
            }
      
            if (isset($_POST["jobseeker_submitted"])) {
      
              global $error;
      
              // check whether specified username and password have been entered correctly
      
              if (valid_jobseeker_login($_POST["jobseeker_email"], $_POST["jobseeker_password"])) {
      
                // store email in session variable
      
                $_SESSION["jobseeker_email"] = $_POST["jobseeker_email"];
      
                // perform redirect
      
                $target = util_siblingurl("jobseekermain.php", true);
      
                header("Location: " . $target);
      
                exit; /* ensure code below does not executed when we redirect */
      
              }
      
            }
      
          ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
          <html xmlns="http://www.w3.org/1999/xhtml">
            <head>
              <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
              <title>Work Net: Sign In</title>
              <link href="css/style.css" rel="stylesheet" type="text/css" />
            </head>
            <body>
              <div id="container">
                <h1>Work Net: Sign In</h1>
                <div id="content">
              <ul>
                <li>
                  <h2>Employers</h2>
                  <p><a href="accountcreate.php?accounttype=employer">Create new employer account.</a></p>
                  <form method="post" action="<?php util_selfurl(true); ?>">
                    <table>
                  <tr>
                    <td>E-mail:</td>
                    <td><input type="text" name="employer_email" value="<?= htmlentities(util_setvalueorblank($_POST['employer_email'])); ?>" />
                  </tr>
                  <tr>
                    <td>Password:</td>
                    <td><input type="password" name="employer_password" value="<?= htmlentities(util_setvalueorblank($_POST['employer_password'])); ?>" /></td>
                  </tr>
                    </table>
                    <?php if (isset($employer_error)) echo "<p style=\"color: red;\">" . htmlentities($employer_error) . "</p>"; ?>
                    <input type="hidden" name="employer_submitted" />
                    <input type="submit" value="Sign In" />
                  </form>
                  <p><a href="forgottenpassword.php?accounttype=employer">Forgotten Employer Password.</a></p>
                </li>
                <li>
                  <h2>Job Seekers</h2>
                  <p><a href="accountcreate.php?accounttype=jobseeker">Create new job seeker account.</a></p>
                  <form method="post" action="<?php util_selfurl(true); ?>">
                    <table>
                  <tr>
                    <td>E-mail:</td>
                    <td><input type="text" name="jobseeker_email" value="<?= htmlentities(util_setvalueorblank($_POST['jobseeker_email'])); ?>" />
                  </tr>
                  <tr>
                    <td>Password:</td>
                    <td><input type="password" name="jobseeker_password" value="<?= htmlentities(util_setvalueorblank($_POST['jobseeker_password'])); ?>" /></td>
                  </tr>
                    </table>
                    <?php if (isset($jobseeker_error)) echo "<p style=\"color: red;\">" . htmlentities($jobseeker_error) . "</p>"; ?>
                    <input type="hidden" name="jobseeker_submitted" />
                    <input type="submit" value="Sign In" />
                  </form>
                  <p><a href="forgottenpassword.php?accounttype=jobseeker">Forgotten Job Seeker Password.</a></p>
                </li>
              </ul>
                </div>
                <div id="footer">
              <p>
                <?php include('markup/footer.php'); ?>
              </p>
                </div><!-- end #footer -->
              </div><!-- end #container -->
            </body>
          </html>
      

4 个答案:

答案 0 :(得分:0)

没有看到util_siblingurl()的代码,我的猜测是你的问题是一个路径问题。 util_siblingurl()函数和Apache设置的组合可能导致路径不一致。

例如,在localhost上,您可能会被重定向到http://example.com/some/path/to/jobseekermain.php,而在远程主机上,您可能会被重定向到http://example.com/some/different/path/to/jobseekermain.php

你看到白屏而不是404这一事实让我对这个假设有些犹豫,但看到该功能的代码仍然会有所帮助。

答案 1 :(得分:0)

我可能会做两件事来找出问题所在:

  1. 使用Wireshark。确切了解您收到的标题。这可能会告诉你究竟导致问题的原因(也许托管总是在页面顶部打印一些内容,就像一些免费托管一样?)
  2. 检查其他标头重定向是否有效。创建一个简单的重定向的php脚本,其中包含硬编码的值,并看到它的工作原理。如果是这样,则表示代码中的某些内容会对页面进行一些打印,或者由于某种原因您没有成功构建目标URL。
  3. 这是一个示例脚本:

    <?php
        session_start();
    
        // I added the require just to make sure nothing is being printed there
        // (an error for example)
        require_once('include/connect.php');
        require_once('include/util.php');
    
        header("Location: " . SOME_LOCATION);
        exit;
    ?>
    

    当然有一些网页在你重定向到它时打印好了......

答案 2 :(得分:0)

我相信您的代码没有问题。实际上,像托管系统一样的ipage会导致一些问题。我也使用了ipage托管计划并面临同样的问题。

所以伙计,试着找一个比这更好的托管服务器。

由于

答案 3 :(得分:0)

我遇到了同样的问题。 Ipage托管,重定向不起作用,服务器报告已经发送了标头。原来这个问题有空白。

确保<?php code ?>标记之外没有空格或任何其他字符。在重定向之前的所有文件中,在开始标记之前和结束标记之后手动选择和删除所有内容。