0

这是一个 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 */
    

这就是问题所在。当我在 localhost 上执行此代码时,它工作正常,但是当我在远程服务器(这是一个 ipage.com 托管站点)上执行它时,我没有得到想要的结果。事实上,当 header("Location: $target); 部分运行时,我看到一个空白页(并且没有重定向)。就好像在调用 header() 之前输出了一些东西,但事实并非如此,因为我已经检查过了,为什么它不起作用?

  1. 如果我注释掉调用 header() 的部分然后退出,我可以执行 html 重定向或 javascript 重定向。但是,当我这样做时,我会丢失会话变量 $_SESSION["jobseeker_email"]。我无法理解为什么会发生这种情况。

对于这些问题的任何帮助将不胜感激,因为我需要执行重定向并仍然保留前一页的会话状态,并且所有这些都在服务器上(不仅仅是在本地主机上)。

    <?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

4 回答 4

0

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

  1. 使用 Wireshark。准确查看您收到的标题。这可能会告诉您确切的问题原因(也许主机总是在页面顶部打印一些东西,就像一些免费主机一样?)
  2. 检查其他标头重定向是否有效。创建一个简单地执行重定向的 php 脚本,其中包含硬编码的值,并查看它是否有效。如果是这样,则意味着您的代码中的某些内容会打印到页面上,或者由于某种原因您没有成功构建目标 URL。

这是一个示例脚本:

<?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;
?>

当然,当您重定向到某些网页时,它会打印正常...

于 2012-07-08T21:54:13.923 回答
0

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

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

您看到的是白屏而不是 404 的事实使我对这个假设有些犹豫,但查看该函数的代码仍然会有所帮助。

于 2012-07-08T21:36:29.283 回答
0

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

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

谢谢

于 2013-03-28T11:42:49.513 回答
0

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

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

于 2016-08-02T06:45:51.263 回答