59

解決策を探していますが、何を試してもうまくいかないようです。

ログインに成功すると、ユーザーは元のページにリダイレクトされるはずです。たとえば、投稿を閲覧していて、コメントを残すためにログインしたい場合、閲覧していた投稿にリダイレクトされる必要があります。だからここに私が持っているものがあります:

login.phpはログインフォームを示しています:

<form method="post" action="login-check.php">
... //input for username and password
</form>

login-check.phpは、ユーザー名とパスが入力されているかどうか、ユーザーが存在するかどうか、またはユーザーが既にログインしているかどうかをチェックし、pパラメーターが login.php に送信されます。

<?php
session_start();
if((empty($username) OR empty($password) AND !isset($_SESSION['id_login']))) {
   header("Location:login.php?p=1");
   exit();
}
elseif (!user_exists($username,$password) AND !isset($_SESSION['id_login'])) {
   header("Location:login.php?p=2");
   exit();
}
elseif(isset($_SESSION['id_login'])) {
   header("Location:login.php?p=3");
   exit();
}
?>

次に、パラメーターplogin.phpに送り返され、それに応じたメッセージが表示されます。

<?php
if(isset($_GET['p'])) {
  $p = $_GET["p"];

  if($p=="1")
    echo "<p class=\"red\">You didn't fill the form.</p><br></br>";
  if($p=="2")
    echo "<p class=\"red\">User exists.</p><br></br>";
  if($p=="3")
    header("Location: index.php");
}
?>

ただし、ログインに成功した後に index.php に移動する代わりに、ユーザーが以前にアクセスしたページに移動する必要があります。さまざまな方法で試しましたが、まったく機能しないか、login.php に戻ります。学校のプロジェクトでこれを行っているので、超安全である必要はありません。
また、私は自分自身をかなり初心者だと考えているので、しばらくお待ちください:D

4

18 に答える 18

80

$_GETこれを行う一般的な方法は、ユーザーの現在のページを変数を介してログイン フォームに渡すことです。

例: 記事を読んでいて、コメントを残したい場合。コメントの URL はcomment.php?articleid=17. のロード中comment.phpに、ログインしていないことがわかりますlogin.php。先ほど示したように、 に送信しようとしています。ただし、スクリプトを変更して、ログイン ページに現在の場所を記憶させるようにします。

header("Location:login.php?location=" . urlencode($_SERVER['REQUEST_URI']));
// Note: $_SERVER['REQUEST_URI'] is your current page

これにより、ユーザーは に送信されますlogin.php?location=comment.php%3Farticleid%3D17login.phpが入力されているかどうかを確認する必要$_GET['location']があります。移入されている場合は、ユーザーをこの場所 (この場合はcomment.php?articleid=17) に送信します。例えば:

//  login.php
echo '<input type="hidden" name="location" value="';
if(isset($_GET['location'])) {
    echo htmlspecialchars($_GET['location']);
}
echo '" />';
//  Will show something like this:
//  <input type="hidden" name="location" value="comment.php?articleid=17" />

 

//  login-check.php
session_start();

//  our url is now stored as $_POST['location'] (posted from login.php). If it's blank, let's ignore it. Otherwise, let's do something with it.
$redirect = NULL;
if($_POST['location'] != '') {
    $redirect = $_POST['location'];
}

if((empty($username) OR empty($password) AND !isset($_SESSION['id_login']))) {
    $url = 'login.php?p=1';
    // if we have a redirect URL, pass it back to login.php so we don't forget it
    if(isset($redirect)) {
        $url .= '&location=' . urlencode($redirect);
    }
   header("Location: " . $url);
   exit();
}
elseif (!user_exists($username,$password) AND !isset($_SESSION['id_login'])) {
    $url = 'login.php?p=2';
    if(isset($redirect)) {
        $url .= '&location=' . urlencode($redirect);
    }
   header("Location:" . $url);
   exit();
}
elseif(isset($_SESSION['id_login'])) {
    // if login is successful and there is a redirect address, send the user directly there
    if($redirect) {
        header("Location:". $redirect);
    } else {
        header("Location:login.php?p=3");
    }
    exit();
}

落とし穴

$_GET['location']ユーザーをそこに送信する前に、いくつかの検証を実行する必要があります。たとえば、あなたのサイトを使用しているユーザーにこのリンクをクリックするように伝えた場合: login.php?location=http%3A%2F%2Fmalice.com%2Fevilpage.php... 悪いことをしようとする外国の URL に送られます。

URL をパラメータurlencodeとして渡すときは、必ず を使用してください。これは特殊な URL 文字 ( 、、、など)$_GETをエンコードして、URL を壊さないようにします (例: <- これには が 2 つあり、正しく動作しません) 。?&%login.php?location=comment.php?id=17?

于 2013-01-25T14:23:23.127 に答える
10

ユーザーがログインページに到達したら、これを使用してどこから来たのかを確認します

$_SERVER['HTTP_REFERER']

次に、この値をセッションに設定し、認証されたらセッションの URL を使用してリダイレクトします。ただし、URL が自分のサイトである場合は、事前に確認する必要があります。たぶん、彼は別のサイトから直接ログインするために来ました:)

于 2013-01-25T14:22:11.813 に答える
9

次のように、php を使用してページを保存できます。

$_SESSION['current_page'] = $_SERVER['REQUEST_URI']

そして、次のページに戻ります。

header("Location: ". $_SESSION['current_page'])
于 2015-04-22T18:17:06.640 に答える
3

おそらく、リダイレクト先のURLをPOST変数に配置する必要があります。

于 2013-01-25T14:13:09.743 に答える
3

ログイン ページは別のページであるため、ユーザーがログイン ページに到達したページにリダイレクトすることを前提としています。

$_SERVER['REQUEST_URI']現在のページを保持するだけです。あなたがしたいことは、$_SERVER['HTTP_REFERER']

HTTP_REFERER をフォームの隠し要素に保存しますが<input type="hidden" name="referer" value="<?= $_SERVER['HTTP_REFERER'] ?>" />、フォームを処理する PHP では、ログインに失敗した場合にログイン ページにリダイレクトするロジックが必要になることに注意してください。そうでない場合は、ホームページにリダイレクトします。

于 2013-01-25T14:25:06.107 に答える
3

SESSION を使用する別の方法

現在の URL をセッションに割り当てます (すべてのページで使用します)。

$_SESSION['rdrurl'] = $_SERVER['REQUEST_URI'];

ログインページで、

if(isset($_SESSION['rdrurl']))
header('location: '.$_SESSION['rdrurl']);
else
header('location: http://example.com');
于 2016-07-02T10:32:36.820 に答える
2

のようなものを使用します

$_SERVER['HTTP_REFERER'];

ログインに成功した場合は、「ここをクリックして戻る」というリンクとリファラーへのリンクを表示し、ページがロードされたら、javascript を使用してそのページを自動的にロードします (back() などは使用しないでください)。機能は、ページを再読み込みせず、ユーザーがログインしていないように見えるためです。

于 2013-01-25T14:49:03.367 に答える
1

のようなものを試してみてください$_SERVER['HTTP_REFERER']

于 2014-01-14T00:08:10.167 に答える
0

returnurl=valueクエリ文字列のキーと値のペアをURLに書き出すことにより、前のページを「記憶」または永続化するようにフォームアクションを構築します。これは、ログインにリダイレクトする任意のページから渡すことができます。

于 2013-01-25T14:13:16.950 に答える
0

ログインページで非表示の入力を使用します。お気に入り:

<input name="location" value="<?php if(!empty($_SERVER['HTTP_REFERER'])) echo $_SERVER['HTTP_REFERER']; else echo 'products.php'; ?>" type="text" style="display: none;" />
于 2016-01-13T03:35:52.320 に答える
0

$_SERVER['REQUEST_URI']; が必要かもしれないと思います。

if(isset($_SESSION['id_login'])) {
  header("Location:" . $_SERVER['REQUEST_URI']);
}

ログインに成功すると、ユーザーがいる URL を取得してリダイレクトする必要があります。

于 2013-01-25T14:17:16.233 に答える
0

あなたが試すことができます

echo "<SCRIPT>alert(\"Login Successful Redirecting To Previous Page \");history.go(-2)</SCRIPT>";

または

echo "<SCRIPT>alert(\"Login Successful Redirecting To Previous Page \");history.go(-1)</SCRIPT>";

于 2020-10-06T11:26:24.233 に答える
0

これはどうですか:: javascript + php

echo "<script language=javascript> javascript:history.back();</script>";

ブラウザの前のボタンと同じように機能します

于 2014-04-26T12:15:16.813 に答える
-1

@philipobenitoの答えは私にとって最もうまくいきました。
最初に、ユーザーの HTTP リファラーを含む非表示の入力を作成しました

<input type="hidden" name="referer" value="<?= $_SERVER['HTTP_REFERER'] ?>" />

ログインに成功した後、ユーザーをその非表示の入力に保存されている値にリダイレクトしました

$_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
if(!empty($_POST['referer'])){
    header('Location: '.$_POST['referer']);
}
else{
    header('Location: members.php'); //members.php is a page used to send a user to their profile page.
}
exit;
于 2016-04-04T05:29:19.607 に答える