织梦跳转登录前页面,如何解决?

99ANYc3cd6
预计阅读时长 28 分钟
位置: 首页 织梦建站 正文

核心原理

这个功能的实现核心在于两点:

织梦跳转到登录前页面
(图片来源网络,侵删)
  1. 捕获目标URL:在用户点击“登录”按钮时,记录下当前页面的URL。
  2. 重定向:在用户成功登录后,系统不再跳转到默认页面,而是跳转到之前捕获的那个URL。

修改核心文件(最直接、最常用)

这是最经典且直接的方法,通过修改织梦的登录处理文件 member/index_do.php 来实现,这个方法适用于绝大多数织梦版本。

操作步骤:

  1. 找到并打开文件 使用FTP或文件管理器,登录您的网站服务器,找到并打开以下文件: /member/index_do.php

  2. 定位关键代码 在文件中找到处理登录成功后的重定向代码,通常在 if($dopost == 'login') 这个条件判断语句内,并且包含 ShowMsg() 函数的地方,代码看起来可能像这样:

    // ... 登录验证代码 ...
    if($cfg_ml->GetUserType() > 0 && $ml->GetUserType() > 0)
    {
        // 登录成功
        $uid = $ml->GetUserID();
        $pwd = $ml->GetUserPwd();
        $loginip = GetIP();
        $logintime = time();
        // ... 更新用户登录信息的代码 ...
        // >>>>>>>>>>>>>>>>>>>>>>>>> 关键部分 <<<<<<<<<<<<<<<<<<<<<<<<<<
        // 默认的跳转代码,通常是跳转到会员中心首页
        // ShowMsg('成功登录,正在进入...',$cfg_memberurl,0,2000);
        // >>>>>>>>>>>>>>>>>>>>>>>>> 关键部分 <<<<<<<<<<<<<<<<<<<<<<<<<<
    }
  3. 修改重定向代码 我们需要将这行默认的跳转代码替换为新的逻辑,完整的修改如下:

    织梦跳转到登录前页面
    (图片来源网络,侵删)
    if($dopost == 'login')
    {
        // ... 前面的用户名密码验证代码 ...
        if($cfg_ml->GetUserType() > 0 && $ml->GetUserType() > 0)
        {
            // ... 中间的用户信息更新代码 ...
            // >>>>>>>>>>>>>>>>>>>>>>>>> 开始修改 <<<<<<<<<<<<<<<<<<<<<<<<<<
            // 1. 检查是否有预先存储的跳转地址
            $gourl = isset($gourl) && !empty($gourl) ? $gourl : '';
            // 2. 如果没有,则跳转到会员中心首页(作为默认值)
            $loginpage = $cfg_memberurl;
            // 3. 如果有 gourl,则使用它作为跳转地址
            if (!empty($gourl)) {
                // 对URL进行一些安全检查,防止跳转到恶意网站
                if (preg_match("#^http\:\/\/#i", $gourl) && !preg_match("#^".$cfg_basehost."#i", $gourl)) {
                    // 如果是外部链接且不是本站域名,则跳转到会员中心首页,提高安全性
                    $loginpage = $cfg_memberurl;
                } else {
                    $loginpage = $gourl;
                }
            }
            // 4. 执行最终的跳转
            ShowMsg('成功登录,正在进入...', $loginpage, 0, 2000);
            // >>>>>>>>>>>>>>>>>>>>>>>>> 结束修改 <<<<<<<<<<<<<<<<<<<<<<<<<<
        }
        else
        {
            ShowMsg('登录失败,请检查您的用户名和密码!', '-1', 0, 2000);
        }
    }
  4. 如何传递 $gourl 参数 现在登录处理文件已经可以接收 $gourl 参数了,我们还需要在用户点击登录的地方,把当前页面的URL作为 gourl 参数传递过去。

    打开你的登录页面模板文件,通常是 /templets/default/login.htm

    找到登录表单 <form> 标签,确保它有一个 action 属性指向 index_do.php,并且有一个隐藏的 gourl 字段:

    <form name='userlogin' method='POST' action='{dede:global.cfg_memberurl/}/index_do.php'>
        <!-- ... 用户名、密码输入框 ... -->
        <!-- >>>>>>>>>>>>>>>>>>>>>>>>> 关键部分 <<<<<<<<<<<<<<<<<<<<<<<<<< -->
        <!-- 添加一个隐藏域,用于传递登录前的页面URL -->
        <input type="hidden" name="gourl" value="{dede:global.cfg_phpurl/}/member/index.php?uid={dede:global.userid/}" />
        <!-- 这里的 value 是默认值,但我们需要动态获取当前页URL,所以下面会用JS来动态设置它 -->
        <!-- >>>>>>>>>>>>>>>>>>>>>>>>> 关键部分 <<<<<<<<<<<<<<<<<<<<<<<<<< -->
        <button type="submit" class="btn btn-primary">登 录</button>
    </form>

    在登录页面的 <head> 部分或底部,添加以下 JavaScript 代码,用于在用户点击登录时,自动将当前页面的URL填充到 gourl 字段中:

    织梦跳转到登录前页面
    (图片来源网络,侵删)
    <script type="text/javascript">
    document.addEventListener("DOMContentLoaded", function() {
        // 获取登录表单
        var loginForm = document.querySelector('form[name="userlogin"]');
        if (loginForm) {
            // 获取隐藏的 gourl 输入框
            var gourlInput = loginForm.querySelector('input[name="gourl"]');
            if (gourlInput) {
                // 将当前页面的完整URL设置为 gourl 的值
                gourlInput.value = window.location.href;
            }
        }
    });
    </script>

总结方法一

  1. 修改 /member/index_do.php,使其能接收并安全处理 gourl 参数。
  2. 修改登录模板 /templets/default/login.htm,在表单中添加一个隐藏的 gourl 字段。
  3. 用JavaScript动态设置 gourl 字段的值为当前页URL。

使用织梦的钩子机制(更高级、更推荐)

如果你的织梦版本是 DedeCMS V5.7 或更高版本,官方提供了更规范的“钩子”(Hook)机制来实现功能扩展,这比直接修改核心文件更安全、更易于升级。

操作步骤:

  1. 创建钩子文件/member/ 目录下创建一个名为 login.inc.php 的文件,这个文件会在用户登录成功后被自动调用。

    // /member/login.inc.php
    <?php
    if (!defined('DEDEMEMBER'))
    {
        die('Request Error!');
    }
    // 获取传递过来的跳转URL
    $gourl = isset($gourl) && !empty($gourl) ? $gourl : '';
    // 定义登录后的跳转页面
    $loginpage = '';
    if (!empty($gourl)) {
        // 安全检查:确保是本站链接
        if (preg_match("#^http\:\/\/#i", $gourl) && !preg_match("#^" . $cfg_basehost . "#i", $gourl)) {
            $loginpage = $cfg_memberurl; // 非本站链接,跳转到会员中心
        } else {
            $loginpage = $gourl; // 是本站链接,跳转到目标页面
        }
    } else {
        $loginpage = $cfg_memberurl; // 如果没有 gourl,则默认跳转到会员中心
    }
    // 将跳转信息存入 session,供 index_do.php 使用
    $_SESSION['login_redirect_url'] = $loginpage;
    ?>
  2. 修改登录处理文件 打开 /member/index_do.php,找到登录成功后的 ShowMsg() 调用处,将其修改为从 session 中读取我们设置的URL。

    // 在 /member/index_do.php 中修改
    // ... 登录成功后的代码 ...
    if($cfg_ml->GetUserType() > 0 && $ml->GetUserType() > 0)
    {
        // ... 更新用户信息的代码 ...
        // >>>>>>>>>>>>>>>>>>>>>>>>> 开始修改 <<<<<<<<<<<<<<<<<<<<<<<<<<
        // 检查 session 中是否有我们预设的跳转URL
        if (isset($_SESSION['login_redirect_url']) && !empty($_SESSION['login_redirect_url'])) {
            $redirect_url = $_SESSION['login_redirect_url'];
            // 用完后立即清除,避免影响其他操作
            unset($_SESSION['login_redirect_url']);
            ShowMsg('成功登录,正在进入...', $redirect_url, 0, 2000);
        } else {
            // 如果没有,则使用默认的会员中心首页
            ShowMsg('成功登录,正在进入...', $cfg_memberurl, 0, 2000);
        }
        // >>>>>>>>>>>>>>>>>>>>>>>>> 结束修改 <<<<<<<<<<<<<<<<<<<<<<<<<<
    }
  3. 传递 $gourl 参数 这一步和方法一完全相同,你需要修改登录模板 /templets/default/login.htm,添加隐藏的 gourl 字段,并用JavaScript动态设置其值为当前页URL。

总结方法二

  1. 创建钩子文件 /member/login.inc.php,在登录成功时捕获并安全地存储跳转URL。
  2. 修改 /member/index_do.php,使其从session中读取钩子文件设置的URL并进行跳转。
  3. 修改登录模板,传递 gourl 参数。

常见问题与注意事项 (FAQ)

  • Q: 修改后不生效怎么办?

    • A: 首先检查缓存,织梦有模板缓存和数据缓存,请清空后台的“系统” -> “一键更新缓存”。
    • A: 确认文件路径和文件名是否正确。
    • A: 检查JavaScript代码是否被正确加载,浏览器开发者工具(F12)的Console面板是否有报错。
    • A: 确保PHP代码没有语法错误。
  • Q: 登录后跳转到空白页或404?

    • A: 这很可能是 $gourl 传递的URL有问题,请检查JavaScript获取的 window.location.href 是否是您期望的页面,有时候URL中包含特殊字符,可能需要 encodeURIComponent() 进行编码。
  • Q: 这个方法对注册后跳转也有效吗?

    • A: 不完全一样,注册的处理逻辑在 index_do.php$dopost == 'regnew' 分支,你可以参考上述方法,找到注册成功后的 ShowMsg() 位置,做类似的修改即可。
  • Q: 哪种方法更好?

    • A: 对于普通用户,方法一 更简单直接,对于有一定开发经验、追求代码规范和未来升级便利性的用户,方法二(钩子机制) 是更好的选择,因为它不直接修改核心逻辑,织梦未来升级时覆盖掉 index_do.php 的风险较小(但钩子文件也可能被覆盖,需要自己留意)。

希望以上详细的步骤能帮助您成功实现织梦的登录跳转功能!

-- 展开阅读全文 --
头像
织梦仿站企业地址信息如何正确获取与优化?
« 上一篇 昨天
Linux下最常用的C语言编程软件是哪一款?
下一篇 » 昨天

相关文章

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

目录[+]