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

修改 member 目录下的核心文件(推荐)
这是最标准、最推荐的方法,修改后逻辑清晰,不易出错。
修改步骤:
-
找到并打开文件 在您的网站根目录下,找到并编辑以下文件:
/member/index_do.php -
定位关键代码 打开
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'; // 这里是默认的跳转逻辑,我们不需要修改它,而是在其后添加我们的逻辑 // ... 其他处理代码 ... } // ... 其他代码 ... } // ... 其他代码 ... -
添加跳转逻辑 在
// === 这是关键部分 ===的注释下方,在$gourl = 'index.php';这行代码之前,插入我们自定义的跳转逻辑。
(图片来源网络,侵删)修改后的代码块应该是这样的:
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'; } // === 修改结束 === // ... 其他处理代码 ... } // ... 其他代码 ... }
逻辑解释:
-
$gourl = empty($comeback) ? 'index.php' : $comeback;- 我们首先检查 URL 中是否带有一个名为
comeback的参数。 - 登录链接可以是
member/index_do.php?dopost=login&comeback=/a/123.html。 comeback参数存在,就跳转到它指定的页面,这个方法更可控,适合在模板中直接指定。
- 我们首先检查 URL 中是否带有一个名为
-
if(empty($gourl) && isset($_SERVER['HTTP_REFERER']))comeback参数不存在,我们就检查$_SERVER['HTTP_REFERER']。HTTP_REFERER记录了用户是通过点击哪个链接来到当前登录页面的,也就是“登录前的页面”。- 只有当
comeback不存在时,我们才使用HTTP_REFERER,保证了comeback参数的优先级。
-
安全检查
(图片来源网络,侵删)preg_replace("#(http://|https://){1}[^/]+#i", '', $_SERVER['HTTP_REFERER']);这行代码是为了提取出HTTP_REFERER中本站路径部分,防止恶意的外部链接。strpos($referer, '..') === false && strpos($referer, 'config') === false是为了防止路径遍历攻击,确保跳转的路径是安全的。
修改登录模板文件(简单但不完全可靠)
这个方法更简单,但存在一个缺陷:如果用户直接在浏览器地址栏输入登录地址,HTTP_REFERER 会是空的,导致登录后还是会跳转到默认页面。
修改步骤:
-
找到并打开模板文件 在您的网站模板目录下,找到会员登录的模板文件,通常是:
/templets/default/login.htm(如果你的网站使用了其他模板,请找到对应的路径,/templets/你的模板名/login.htm) -
修改登录表单 在登录表单
<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 为空,会失效,不够健壮。 |
⭐⭐ |
最佳实践(完美解决方案):
-
使用方法一,修改
/member/index_do.php文件,实现基于comeback参数和HTTP_REFERER的智能跳转。 -
在需要显示登录链接的模板文件中(如文章页
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 会员登录后自动返回到登录前页面的功能了。
