Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
登录后是否重定向到上一页?PHP_Php_Authentication_Redirect - Fatal编程技术网

登录后是否重定向到上一页?PHP

登录后是否重定向到上一页?PHP,php,authentication,redirect,Php,Authentication,Redirect,我一直在寻找一个解决方案,但不管我怎么努力,我似乎都不能把它做好 成功登录后,用户应该被重定向到他来自的页面,比如说,他正在浏览一篇文章并想登录,这样他就可以留下评论,所以他应该被重定向到他正在浏览的文章。这就是我所拥有的: login.php显示登录表单: <form method="post" action="login-check.php"> ... //input for username and password </form> 然后参数p被发送回login.

我一直在寻找一个解决方案,但不管我怎么努力,我似乎都不能把它做好

成功登录后,用户应该被重定向到他来自的页面,比如说,他正在浏览一篇文章并想登录,这样他就可以留下评论,所以他应该被重定向到他正在浏览的文章。这就是我所拥有的:

login.php显示登录表单:

<form method="post" action="login-check.php">
... //input for username and password
</form>
然后参数
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");
}
?>

您可能应该将要重定向到的url放在POST变量中

构造表单操作,通过向URL写入
returnurl=value
query string key/value对,使其“记住”或持久化上一页-这可以从重定向到登录的任何页面传递。

我想您可能需要$_服务器['REQUEST_URI'

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

这将获取他们所在的url,并在成功登录后重定向他们。

当用户进入登录页面时,使用此链接查看其来源

$_SERVER['HTTP_REFERER']

然后将该值设置到会话中,当他通过身份验证时,使用会话中的url将他重定向回会话。但是,如果url是您的站点,那么您应该先进行一些检查。可能他来自另一个站点直接登录:)

一种常见的方法是通过
$\u 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
现在应该检查是否填充了
$\u 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" />
Gotchas

在将用户发送到那里之前,应该对
$\u GET['location']
运行一些验证。例如,如果我告诉使用您的站点的用户单击此链接:
login.php?location=http%3A%2F%2Fmalice.com%2Fevilpage.php
。。。然后,它们将被发送到一个试图做坏事的外部URL


在将URL作为
$\u GET
参数传递时,始终确保使用
urlencode
。这会对特殊的URL字符进行编码(例如
&
,和
%
),这样它们就不会破坏您的URL(例如:
login.php?location=comment.php?id=17
),因为登录页面是一个单独的页面,所以我假设您希望重定向到用户从中访问登录页面的页面

$\u服务器['REQUEST\u URI']
将只保留当前页面。您要做的是使用
$\u服务器['HTTP\u REFERER']

因此,将HTTP_REFERER保存在表单的隐藏元素中

$_SERVER['HTTP_REFERER'];

如果登录成功,则显示一个链接,上面写着“单击此处返回”,并显示指向推荐人的链接,当页面加载时,使用一些javascript自动加载该页面(不要使用back()或者不管该功能是什么,因为它不会重新加载页面,并且看起来用户从未登录过。

您可以使用会话来存储登录后要返回的当前页面,如果您正确维护会话,这将适用于其他页面。这是一项非常有用的技术,因为您可以使用它开发面包屑。

您应该尝试类似于
$\u SERVER['HTTP\u REFERER']

这样的方法:javascript+php怎么样

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

它的工作原理与浏览器中的上一个按钮相同

您可以使用php保存页面,如下所示:

$_SESSION['current_page'] = $_SERVER['REQUEST_URI']
并返回页面,其中包含:

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

在登录页面中使用隐藏输入。 比如:


@philipobenito的回答最适合我。
我首先创建了一个包含用户HTTP引用的隐藏输入

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

另一种方法是使用会话

将当前URL分配给会话(在每个页面上使用)

在您的登录页面中,使用

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

您应该首先在登录页面中使用$_SERVER['HTTP_REFERER'];获取变量中的用户引用页面

比如:


现在,当用户单击登录时,将标题位置更改为用户引用页面

比如:


在这段时间里,您应该首先检查用户引用的页面是否为空,因为您的用户可以直接访问您的登录页面,然后您的$refPage变量将为空,所以单击后登录页面将停留在此处

比如:



或者您可以使用InputType hidden,您可以在其中设置值$\u SERVER['HTTP\u REFERER']

比如:


我创建了一个函数来存储上一页的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']);
            }

        } 
    }
}
?>
//login.php
您可以试试

echo“警报(\“登录成功重定向到上一页\”);history.go(-2)”;

echo“警报(\'Login Successful Redirecting To Previous Page\”);history.go(-1)”;

您可以使用以下方法:

$refererpage = $_SERVER['HTTP_REFERER']; //get referer stored in a variable
if (strpos($refererpage, $_SERVER['SERVER_NAME']) == TRUE) { //if the start position of the referer and the server name is equal
    $refvar= $refererpage; //create a mew variable to be used to locate header
} else { //if referer's address is not the same as server name
    $refvar= "index.php"; //set the variable to another direction for this request
}
并将标题添加到您想要的位置,如:

header('location: '. $refvr); //set the header location to the referer varaible

您应该将要重定向用户的页面作为查询参数传递回您的登录页面。如果我添加该参数,登录页面将显示一条错误消息:“您没有填写表单。”。就像没有会话一样…@AlejandraUzelac,例如,如果你要注销,看看这个问题,并尝试写一个答案,那么你会在页面底部看到一个
登录
链接。该链接指向此处:
http://stackoverflow.com/users/login?returnurl=%2fquestions%2f14523468%2fredirecting-至上一页后一页奥金-
if(isset($_SESSION['rdrurl']))
header('location: '.$_SESSION['rdrurl']);
else
header('location: http://example.com');
<?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
    }
}
?>
<input type="hidden" name="refPage" value="<?php echo $_SERVER['HTTP_REFERER']; ?>">
//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

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

        } 
    }
}
?>
$refererpage = $_SERVER['HTTP_REFERER']; //get referer stored in a variable
if (strpos($refererpage, $_SERVER['SERVER_NAME']) == TRUE) { //if the start position of the referer and the server name is equal
    $refvar= $refererpage; //create a mew variable to be used to locate header
} else { //if referer's address is not the same as server name
    $refvar= "index.php"; //set the variable to another direction for this request
}
header('location: '. $refvr); //set the header location to the referer varaible