Php 成功登录后如何重定向到引用页面/url?

Php 成功登录后如何重定向到引用页面/url?,php,session,redirect,login,Php,Session,Redirect,Login,我知道这个主题以前在Stack上已经讨论过了,我已经看过了一些答案,但是我还是有点卡住了,因为我对PHP还比较陌生。我网站上的每个页面都需要登录,因此用户在页面加载时会被重定向到登录页面。在每一页的顶部,我有: <? require("log.php"); include_once("config.php"); include_once("functions.php"); ?> 在页面顶部(在“require”(“log.php”);)添加以下内容: if(isset($_SE

我知道这个主题以前在Stack上已经讨论过了,我已经看过了一些答案,但是我还是有点卡住了,因为我对PHP还比较陌生。我网站上的每个页面都需要登录,因此用户在页面加载时会被重定向到登录页面。在每一页的顶部,我有:

<?
require("log.php");
include_once("config.php"); 
include_once("functions.php"); 
?>
在页面顶部(在“require”(“log.php”);)添加以下内容:

if(isset($_SESSION['url'])) 
   $url = $_SESSION['url']; // holds url for last page visited.
else 
   $url = "index.php"; // default page for
转到我的登录页面,并在成功登录时使用以下URL进行重定向:

header("Location: http://example.com/$url"); // perform correct redirect.
我不是100%存储引用URL的代码应该放在log.php或login.php的顶部

我尝试将其添加到这两个页面中,但登录页面只是在我输入用户名和密码后循环

我想知道是否有人能帮我把这件事做好

谢谢


尼克

看来我没有权利对你的帖子发表评论,所以我会尽我所能回答。我为所有的情况道歉,我只是一时兴起,尽我所能回答

情景1: 如果您真的没有在代码中选择数据库(如本文所示),这可能是您的问题吗?请注意,下面的代码就是您发布的代码

$db = mysql_select_db(""); //put your database name in here 
情景2: 下面的代码不是我在构建的任何东西中使用过的代码,我是否可以建议您尝试用下面的代码行替换该代码行

if(session_is_registered("name") == false) { // Current
if(isset($_SESSION['name']) == false) { // Potential Replacement
情景3: 如果您对以下内容感兴趣,则login.php文件中也存在该逻辑。。。这可能是你的问题。在访问您的站点时,我注意到您的表单出现在login.php上,而您的逻辑是发布到log.php。我希望这段代码有助于排除“跳转”,因为login.php可能会保存自己并覆盖您建立的$\u会话变量

session_start(); // starts the session
$_SESSION['url'] = $_SERVER['REQUEST_URI'];
如果它太复杂而无法从login.php文件中删除,那么如果您已经有了它,我已经整理了一些代码,您可以使用这些代码创建“内部”面包屑,这样您就可以返回历史记录中的两页

    if(!isset($_SESSION['internal_breadcrumbs']))
        $_SESSION['internal_breadcrumbs'] = array();

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

    $max_breadcrumbs = 5;

    while(count($_SESSION['internal_breadcrumbs']) > $max_breadcrumbs)
        array_shift($_SESSION['internal_breadcrumbs']);
这将创建一个最大值为$max_breadcrumbs元素的数组,最后是您最近的页面,如下所示

Array
(
    [internal_breadcrumbs] => Array
        (
            [0] => /other_page.php
            [1] => /other_page.php
            [2] => /other_page.php
            [3] => /user_page.php <-- desired page
            [4] => /login.php <-- most recent page
        )

)
祝您一切顺利,我当然希望这在某种程度上有所帮助。

在场景4中

从客户端测试ajax XMLHttpRequest使用javascript代码要求的登录名/密码到专用脚本进行验证(在https模式下进行验证以确保安全)

如果响应正确,请将登录密码发送到脚本服务器

Stips:编码密码更安全

使用header()函数是个坏主意

说明书说明说

记住,必须在调用任何实际输出之前调用header() 通过普通HTML标记、文件中的空行或PHP发送。 使用include或require读取代码是非常常见的错误, 函数或其他文件访问函数,并具有空格或空 在调用header()之前输出的行。同样的问题 使用单个PHP/HTML文件时存在

因此,在您的情况下,我建议只在会话中使用ID为generate的cookie,在第一次连接时,它会生成cookie,cookie的持续时间可能只有2到10分钟

每次调用loging.PHP时重新生成cookie


祝您有愉快的一天

FYI,您对SQL注入非常开放,如果您还没有被注入,您将被黑客攻击。学习使用PDO进行准备好的查询以完全避免此问题。为什么在其他页面中需要log.php?我相信请求URI看起来类似于
/page.php
,因此您可能需要调整
标题
字符串。尝试执行
die(print$\u SERVER['REQUEST\u URI'];
以查看它得到的值。另外,执行
die(print\r($\u SESSION));
以查看会话的外观like@manyxcxi谢谢。REQUEST\u URI确实返回/page.php,因此我相应地调整了标题。
$\u SERVER['REQUEST\u URI']
返回上一页,在本例中为
/2011.php
打印($\u SESSION)
返回
数组([url]=>/2011.php)
。但是,我仍然得到循环。在所有
SESSION\u启动()之前,您是否有
SESSION\u名称(“MyLogin”)
calls?谢谢Bryan。我已将login.PHP中的所有PHP代码添加到原始问题中,以防有助于排除故障。我现在不在家,无法正确更改任何代码和测试,但今天晚些时候会这样做。没问题!我所有的场景都是基于我从代码中得出的假设,我真的希望是这样其中一项将帮助您解决问题:)
if(session_is_registered("name") == false) { // Current
if(isset($_SESSION['name']) == false) { // Potential Replacement
session_start(); // starts the session
$_SESSION['url'] = $_SERVER['REQUEST_URI'];
    if(!isset($_SESSION['internal_breadcrumbs']))
        $_SESSION['internal_breadcrumbs'] = array();

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

    $max_breadcrumbs = 5;

    while(count($_SESSION['internal_breadcrumbs']) > $max_breadcrumbs)
        array_shift($_SESSION['internal_breadcrumbs']);
Array
(
    [internal_breadcrumbs] => Array
        (
            [0] => /other_page.php
            [1] => /other_page.php
            [2] => /other_page.php
            [3] => /user_page.php <-- desired page
            [4] => /login.php <-- most recent page
        )

)
// I'm doing - 2 to accommodate for zero indexing, to get 1 from the current page
if(isset($_SESSION['internal_breadcrumbs'])) 
    $url = $_SESSION['internal_breadcrumbs'][count($_SESSION['internal_breadcrumbs']) - 2];
else 
   $url = "index.php"; // default page for