web-dev-qa-db-ja.com

ログイン後に前のページにリダイレクトしますか? PHP

私は解決策を探していましたが、何をしようとしても、正しく解決できないようです。

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

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();
}
?>

pはlogin.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

48

これを行う一般的な方法は、$_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%3D17に送信されます。 login.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を$_GETパラメーターとして渡すときは、必ずurlencodeを使用してください。これは特別なURL文字(?&%など)をエンコードして、URLを壊さないようにします(例:login.php?location=comment.php?id=17 <-これには2つの?は正常に機能しません)

69
Chris

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

$_SERVER['HTTP_REFERER']

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

8
Djordje Bakic

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

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

そして、次のコマンドでページに戻ります:

header("Location: ". $_SESSION['current_page'])
7
Anthony

別の方法、SESSIONを使用

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

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

ログインページで

if(isset($_SESSION['rdrurl']))
header('location: '.$_SESSION['rdrurl']);
else
header('location: http://example.com');
3
Elyor

ログインページは別のページであるため、ユーザーがログインページにアクセスしたページにリダイレクトすることを想定しています。

$_SERVER['REQUEST_URI']は単に現在のページを保持します。あなたがしたいのは、$_SERVER['HTTP_REFERER']

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

3
philipobenito

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

3
Tim Martens

のようなものを使用する

$_SERVER['HTTP_REFERER'];

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

2
Drew

セッションを使用して、ログイン後に戻る現在のページを保存できます。セッションを適切に維持すると、他のページでも機能します。これを使用してブレッドクラムを開発できるため、非常に便利な手法です。

2
Sandeep Garg

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

1
jpmaster77

まず、$ _ SERVER ['HTTP_REFERER']を使用して変数のユーザー参照ページを取得する必要があります。ログインページで。

好む:

<?php 
    session_start();
    $refPage = $_SERVER['HTTP_REFERER']; 
?>

そして今、ユーザーがログインをクリックすると、ヘッダーの場所をユーザー参照ページに変更します

好む:

<?php 
if(isset($_POST[login])){
    session_start();
    header('location:' . $refPage);
}
?>

このとき、ユーザーが直接ログインページにアクセスできるため、ユーザーが空のページを参照しているかどうかを最初にチェックする必要があります。

好む:

<?php
if(isset($_POST[login])){
    session_start();
    $refPage = $_SERVER['HTTP_REFERER'];  // get reffer page url
    if(empty($refPage)){ 
        header('location: yourredirectpage'); // if ref page is empty then set default redirect page.
    }else{
        header('location:' . $refPage); // or if ref page in not empty then redirect page to reffer page
    }
}
?>


または、値$ _SERVER ['HTTP_REFERER']を設定できる非表示の入力タイプを使用できます。

好む:

<input type="hidden" name="refPage" value="<?php echo $_SERVER['HTTP_REFERER']; ?>">

ユーザーがログインをクリックすると、 refPage 前のページを評価してリダイレクトします。また、空の参照ページも確認する必要があります。ユーザーはログインページに直接アクセスできるためです。


ありがとうございました。

0
Obaidul Haque

前のページのURLを保存する関数を作成しました

//functions.php

function set_previous_page_url(){

    $current_url = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://{$_SERVER['HTTP_Host']}{$_SERVER['REQUEST_URI']}"; 
    $previous_url = $_SERVER['HTTP_REFERER'];
    if (!($current_url === $previous_url)){
        $_SESSION['redirect_url'] = $previous_url;
    }
    if(isset($_SESSION['redirect_url'])){
        $url = $_SESSION['redirect_url'];
        return $url;

    } else {
        $url = "index.php";
        return $url;
    }
}

そして、login.phpでこの関数を呼び出します

// login.php

<?php
// set previous page url to redirect after login
$url = set_previous_page_url();

if(ifItIsMethod('post')){
    if(isset($_POST['username']) && isset($_POST['password'])){
        if (login_user($_POST['username'], $_POST['password'])) {
            redirect($url);
            //unset session defined in set_previous_page_url() function
            if(isset($_SESSION['redirect_url'])){
                unset($_SESSION['redirect_url']);
            }

        } 
    }
}
?>
0
Adnan

ログインページで非表示の入力を使用します。好む:

<input name="location" value="<?php if(!empty($_SERVER['HTTP_REFERER'])) echo $_SERVER['HTTP_REFERER']; else echo 'products.php'; ?>" type="text" style="display: none;" />
0
Elyor

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

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

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

0

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

0
Grant Thomas

$ _SERVER ['REQUEST_URI'];が必要かもしれません。

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

それは彼らがいるURLを取り、成功したログイン後にそれらをリダイレクトする必要があります。

0
Rob