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

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

問題が何であるかを調べるために、おそらく2つのことを行います。

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

もちろん、リダイレクトするとOKを印刷するWebページもあります...

于 2012-07-08T21:54:13.923 に答える
0

あなたのコードに問題はないと思います。実際、ipage のようなホスティング システムはいくつかの問題を引き起こします。ipage ホスティング プランも使用しましたが、同じ問題に直面しました。

ですから、これらよりも優れた別のホスティング サーバーを見つけてみてください。

ありがとう

于 2013-03-28T11:42:49.513 に答える