dede会员登录后如何自动返回登录前页面?

99ANYc3cd6
预计阅读时长 22 分钟
位置: 首页 DEDE建站 正文

这里为您提供两种最常用和稳定的方法,强烈推荐使用方法一(修改核心文件),因为它最稳定、最规范。

dede 会员登陆回到登录前的页面
(图片来源网络,侵删)

修改 member 目录下的核心文件(推荐)

这是最标准、最推荐的方法,修改后逻辑清晰,不易出错。

修改步骤:

  1. 找到并打开文件 在您的网站根目录下,找到并编辑以下文件: /member/index_do.php

  2. 定位关键代码 打开 index_do.php 文件,找到处理登录逻辑的 else if ($dopost == 'login') 部分,您会看到类似下面这样的代码:

    // ... 其他代码 ...
    else if ($dopost == 'login')
    {
        // ... 一系列验证用户名密码的代码 ...
        if($rs != '')
        {
            // 登录成功后的处理
            $dsql->Execute('me', "UPDATE `#@__member` SET `logintime`='".time()."', `loginip`='".GetIP()."' WHERE `mid`='".$uid."' ");
            $safecode = '';
            // === 这是关键部分 ===
            // 默认是跳转到会员中心首页
            $gourl = 'index.php';
            // 这里是默认的跳转逻辑,我们不需要修改它,而是在其后添加我们的逻辑
            // ... 其他处理代码 ...
        }
        // ... 其他代码 ...
    }
    // ... 其他代码 ...
  3. 添加跳转逻辑// === 这是关键部分 === 的注释下方,$gourl = 'index.php'; 这行代码之前,插入我们自定义的跳转逻辑。

    dede 会员登陆回到登录前的页面
    (图片来源网络,侵删)

    修改后的代码块应该是这样的:

    else if ($dopost == 'login')
    {
        // ... 一系列验证用户名密码的代码 ...
        if($rs != '')
        {
            // 登录成功后的处理
            $dsql->Execute('me', "UPDATE `#@__member` SET `logintime`='".time()."', `loginip`='".GetIP()."' WHERE `mid`='".$uid."' ");
            $safecode = '';
            // === 修改开始 ===
            // 1. 首先检查是否有 comeback 参数
            $gourl = empty($comeback) ? 'index.php' : $comeback;
            // 2. 如果没有 comeback 参数,再检查 HTTP_REFERER,即从哪个页面跳转过来的
            //    empty($gourl) 确保 comeback 参数为空时才执行
            if(empty($gourl) && isset($_SERVER['HTTP_REFERER']))
            {
                // 防止跨站攻击,确保来源是本站
                $referer = preg_replace("#(http://|https://){1}[^/]+#i", '', $_SERVER['HTTP_REFERER']);
                if (strpos($referer, '..') === false && strpos($referer, 'config') === false)
                {
                    $gourl = $_SERVER['HTTP_REFERER'];
                }
                else
                {
                    $gourl = 'index.php'; // 如果来源不合法,则跳转到默认页面
                }
            }
            // 如果以上都没有,则使用默认的会员中心首页
            if(empty($gourl))
            {
                $gourl = 'index.php';
            }
            // === 修改结束 ===
            // ... 其他处理代码 ...
        }
        // ... 其他代码 ...
    }

逻辑解释:

  1. $gourl = empty($comeback) ? 'index.php' : $comeback;

    • 我们首先检查 URL 中是否带有一个名为 comeback 的参数。
    • 登录链接可以是 member/index_do.php?dopost=login&comeback=/a/123.html
    • comeback 参数存在,就跳转到它指定的页面,这个方法更可控,适合在模板中直接指定。
  2. if(empty($gourl) && isset($_SERVER['HTTP_REFERER']))

    • comeback 参数不存在,我们就检查 $_SERVER['HTTP_REFERER']
    • HTTP_REFERER 记录了用户是通过点击哪个链接来到当前登录页面的,也就是“登录前的页面”。
    • 只有当 comeback 不存在时,我们才使用 HTTP_REFERER,保证了 comeback 参数的优先级。
  3. 安全检查

    dede 会员登陆回到登录前的页面
    (图片来源网络,侵删)
    • preg_replace("#(http://|https://){1}[^/]+#i", '', $_SERVER['HTTP_REFERER']); 这行代码是为了提取出 HTTP_REFERER 中本站路径部分,防止恶意的外部链接。
    • strpos($referer, '..') === false && strpos($referer, 'config') === false 是为了防止路径遍历攻击,确保跳转的路径是安全的。

修改登录模板文件(简单但不完全可靠)

这个方法更简单,但存在一个缺陷:如果用户直接在浏览器地址栏输入登录地址,HTTP_REFERER 会是空的,导致登录后还是会跳转到默认页面。

修改步骤:

  1. 找到并打开模板文件 在您的网站模板目录下,找到会员登录的模板文件,通常是: /templets/default/login.htm (如果你的网站使用了其他模板,请找到对应的路径,/templets/你的模板名/login.htm)

  2. 修改登录表单 在登录表单 <form> 标签中,添加一个隐藏的 input 字段,用于传递来源地址。

    找到类似这样的表单:

    <form name='userlogin' method='POST' action='{dede:global.cfg_memberurl/}/index_do.php'>

    修改为:

    <form name='userlogin' method='POST' action='{dede:global.cfg_memberurl/}/index_do.php'>
        <input type="hidden" name="comeback" value="{dede:global.cfg_phpurl/}/index.php" />
        <!-- ... 其他表单元素 ... -->
    </form>

    问题在于,这里的 value 怎么动态获取?

    一个更巧妙的方法是在表单加载时,通过 JavaScript 来动态设置 comeback 的值。

    修改后的 login.htm 示例:

    <form name='userlogin' method='POST' action='{dede:global.cfg_memberurl/}/index_do.php'>
        <!-- 使用 JavaScript 动态设置来源地址 -->
        <input type="hidden" name="comeback" id="login-comeback" value="" />
        <div class="fb">
            <span>用户名:</span>
            <input type="text" name="userid" size="20" class="intxt" />
        </div>
        <div class="fb">
            <span>密码:</span>
            <input type="password" name="pwd" size="20" class="intxt" />
        </div>
        <!-- ... 其他登录项 ... -->
        <div class="fb">
            <button type="submit" class="btn-1">登 录</button>
        </div>
    </form>
    <script type="text/javascript">
        // 页面加载完成后执行
        window.onload = function() {
            // 获取来源地址
            var referer = document.referrer;
            // 如果存在来源地址,则赋值给隐藏的 input
            if (referer) {
                document.getElementById('login-comeback').value = referer;
            }
        };
    </script>

    你还需要确保方法一中的 index_do.php 文件能正确处理这个 comeback 参数。 即使使用方法二,也最好配合方法一的 index_do.php 修改。


总结与最佳实践

方法 优点 缺点 推荐度
方法一 (修改 index_do.php) 逻辑最完整、最安全、最稳定,同时支持 comeback 参数和 HTTP_REFERER,优先级明确,安全性高。 需要修改核心PHP文件,对新手来说可能需要FTP工具。 ⭐⭐⭐⭐⭐ (强烈推荐)
方法二 (修改模板) 简单,只需要修改HTML模板文件。 依赖 HTTP_REFERER,如果用户直接访问登录页,referer 为空,会失效,不够健壮。 ⭐⭐

最佳实践(完美解决方案):

  1. 使用方法一,修改 /member/index_do.php 文件,实现基于 comeback 参数和 HTTP_REFERER 的智能跳转。

  2. 在需要显示登录链接的模板文件中(如文章页 article_article.htm),使用带 comeback 参数的链接,这样更可控。

    模板中生成登录链接的示例:

    {dede:geturl runphp='yes'}
        @me = urlencode(@me);
    {/dede:geturl}
    <a href="{dede:global.cfg_memberurl/}/index_do.php?dopost=login&comeback={dede:global.cfg_phpurl/}/index.php">会员登录</a>

    这里的 {dede:geturl} 是一个示例,你可以根据实际情况获取当前页面的URL,并 urlencode 后作为 comeback 的值。

通过以上步骤,您就可以完美地实现 DedeCMS 会员登录后自动返回到登录前页面的功能了。

-- 展开阅读全文 --
头像
织梦bootstrap模板下载哪里有?
« 上一篇 今天
dede自定义多张图片不显示,问题出在哪?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

目录[+]