最常用且最可靠的方法是利用 HTML 表单的 hidden(隐藏域)字段,下面我将为你提供详细的步骤、代码示例和一些高级用法。

(图片来源网络,侵删)
核心方法:使用隐藏域
这种方法的基本原理是:在来源页面的表单中,添加一个隐藏的输入框,其值就是当前页面的 URL,当表单提交时,这个 URL 值会一起被发送到服务器,然后在接收页面的 PHP 代码中就可以轻松获取它。
详细步骤
第一步:在来源页面的表单中添加隐藏域
假设你的来源页面是 article_add.php,里面有一个提交到 save.php 的表单。
来源页面代码 (article_add.php) 示例:
<form name="myform" action="/plus/diy.php" method="post" enctype="multipart/form-data">
<!-- 这是表单原有的字段 -->
<input type="text" name="title" placeholder="请输入标题" />
<textarea name="content" placeholder="请输入内容"></textarea>
<!-- ======================================================= -->
<!-- 【核心】在这里添加隐藏域来记录来源页面链接 -->
<!-- name="来源页面" 是一个自定义的名称,在接收页面会用它来取值 -->
<!-- value="<?php echo GetCurUrl(); ?>" 获取当前页面的完整URL -->
<input type="hidden" name="来源页面" value="<?php echo GetCurUrl(); ?>" />
<!-- ======================================================= -->
<!-- DedeCMS DIY表单必须的隐藏字段,用于指定数据表 -->
<input type="hidden" name="dede_fields" value="title,text;content,textarea" />
<input type="hidden" name="dede_fieldshash" value="<?php echo md5('titlecontent'.$cfg_cookie_encode);?>" />
<button type="submit">提交</button>
</form>
代码解释:

(图片来源网络,侵删)
<input type="hidden" ...>:定义一个隐藏的输入框,用户在页面上看不到它。name="来源页面":给这个隐藏域起一个名字,这个名字是自定义的,我们将在后续的 PHP 代码中使用它来获取值。强烈建议使用中文或不易与系统变量冲突的名称。value="<?php echo GetCurUrl(); ?>":设置隐藏域的值。GetCurUrl()是 DedeCMS 内置的一个非常有用的函数,它可以获取当前页面的完整 URL(包括http://和查询参数)。- 如果你想获取不含查询参数的 URL,可以使用
preg_replace('/\?.*$/i', '', GetCurUrl())。 - 如果你想获取上一页的 URL(用户点击链接前所在的页面),可以使用
$_SERVER['HTTP_REFERER'],但请注意,HTTP_REFERER不是 100% 可靠的,因为它可能被浏览器禁用或不发送。对于表单来源,推荐使用GetCurUrl()来记录表单所在的页面。
第二步:在接收页面获取来源链接
当表单提交后,数据会发送到 action 指定的页面(plus/diy.php 或你自定义的 save.php),你可以通过 $_POST 全局变量来获取隐藏域的值。
接收页面代码 (save.php 或 plus/diy.php 的处理逻辑) 示例:
<?php
require_once(dirname(__FILE__)."/../include/common.inc.php");
// 判断是否是 POST 提交
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// =======================================================
// 【核心】从 $_POST 数组中获取来源页面的链接
// $_POST['来源页面'] 中的 '来源页面' 必须和表单中隐藏域的 name 属性完全一致
$source_url = isset($_POST['来源页面']) ? $_POST['来源页面'] : '未知来源';
// 现在你就可以使用 $source_url 变量了
echo "表单提交成功!<br/>";
echo "您是从以下页面提交的:<br/>";
echo "<a href='{$source_url}' target='_blank'>{$source_url}</a>";
// =======================================================
// --- DedeCMS DIY 表单数据处理示例 ---
// 假设你的数据表是 `dede_diyform1`
$diy = new Diyform('dede_diyform1'); // 替换成你的数据表名称
if($diy->makePost($_POST))
{
// 获取表单提交的所有数据,包括我们添加的来源页面
$data = $diy->getFieldList(); // $data 是一个数组,包含了所有字段
// 打印所有提交的数据,你可以看到 '来源页面' 也在其中
// print_r($data);
// 将来源页面也保存到数据库(可选)
// 假设你的数据表里有一个字段 source_url
// $inquery = "INSERT INTO `dede_diyform1` (`title`, `content`, `source_url`, `ip`, `dede_addtime`) VALUES ('{$data['title']}', '{$data['content']}', '{$source_url}', '{$_SERVER['REMOTE_ADDR']}', '".time()."');";
// $dsql->ExecuteNoneQuery($inquery);
// 跳转回来源页面,并显示成功提示
ShowMsg("添加成功!", $source_url, 0, 2000);
exit();
}
else
{
ShowMsg("表单验证失败,请返回重试!", $source_url, 0, 2000);
exit();
}
}
?>
代码解释:
-
$source_url = isset($_POST['来源页面']) ? $_POST['来源页面'] : '未知来源';
(图片来源网络,侵删)$_POST['来源页面']:通过name属性来源页面来获取提交过来的值。isset(...):做一个安全的判断,防止该值不存在时导致 PHP 警告。'未知来源':如果获取不到,则给一个默认值。
-
与 DedeCMS DIY 表单结合:
- DedeCMS 的 DIY 表单(
/plus/diy.php)在处理数据时,会将所有$_POST的数据都存入你指定的数据表中。 - 你只需要确保你的数据表中有对应的字段(
source_urlvarchar(255)),dede_fields参数中也定义了这个字段,那么来源链接就会自动被保存。
- DedeCMS 的 DIY 表单(
高级用法与注意事项
获取“上一页”链接 (HTTP_REFERER)
如前所述,如果你想知道用户在点击提交按钮之前所在的页面,可以使用 $_SERVER['HTTP_REFERER']。
在接收页面获取:
$referer_url = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '直接访问';
echo "您是从上一页:{$referer_url} 跳转过来的。";
使用场景:
- 分析用户行为路径。
- 实现常见的“返回上一页”功能。
缺点:
- 不可靠:如果用户直接在浏览器地址栏输入提交地址,或者禁用了浏览器发送
Referer的功能,这个值就是空的。 - 不安全:
Referer可以被轻易伪造,不适合用于安全验证。
使用 JavaScript 动态设置来源
有时候来源页面可能不是一个固定的表单页面,而是由某个动态链接生成的,这时可以用 JavaScript 来动态设置隐藏域的值。
来源页面代码示例:
<form name="myform" action="/plus/diy.php" method="post">
<input type="text" name="title" placeholder="请输入标题" />
<!-- 隐藏域初始可以为空 -->
<input type="hidden" id="source_url_input" name="来源页面" value="" />
<button type="submit">提交</button>
</form>
<script>
// 在表单提交前,用 JS 动态设置隐藏域的值
document.querySelector('form[name="myform"]').addEventListener('submit', function() {
// 获取当前页面的 URL
var currentUrl = window.location.href;
// 设置到隐藏域中
document.getElementById('source_url_input').value = currentUrl;
// 可以在这里打印出来确认
console.log('来源页面已设置为: ' + currentUrl);
});
</script>
这种方法非常灵活,可以根据你的业务逻辑在 JavaScript 中计算出任何你想要的“来源”URL。
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 隐藏域 (推荐) | 可靠、可控、安全 | 需要手动在每个表单中添加 | 绝大多数情况,特别是需要准确知道表单所在页面时。 |
| HTTP_REFERER | 简单,无需修改表单 | 不可靠、可伪造 | 分析用户行为、简单的“返回上一页”功能,不用于关键逻辑。 |
| JavaScript | 极其灵活 | 依赖客户端,可能被禁用或覆盖 | 来源需要根据复杂逻辑动态计算时。 |
对于你的问题“dede 获取提交来源页面链接”,使用 GetCurUrl() 函数结合表单隐藏域是最标准、最可靠的解决方案。
