使用织梦自带变量(最简单、推荐)
织梦系统已经预定义了获取HTTP请求头信息的变量,其中就包括来源地址,你不需要做任何额外的设置,直接在表单模板文件中使用即可。

核心变量:
{dede:global name='http_referer' /}
这个变量会直接输出用户访问当前页面之前的那个页面的完整URL。
使用场景:
假设你有一个自定义的表单,模板文件是 templets/default/feedback_form.htm,你可以在表单的 <input> 标签中添加一个隐藏域,用来接收来源地址。

示例代码:
在你的表单模板中,找到 <form> 标签,并在里面添加如下隐藏的输入框:
<form name="form1" action="/plus/diy.php" enctype="multipart/form-data" method="post">
<!-- 其他表单字段, -->
<input type="text" name="name" placeholder="您的姓名" />
<textarea name="message" placeholder="留言内容"></textarea>
<!-- 【关键部分】添加一个隐藏域来保存来源地址 -->
<input type="hidden" name="source_url" value="{dede:global name='http_referer' /}" />
<!-- 安全验证码 -->
<input type="hidden" name="dede_fields" value="name,text;message,text;source_url,text" />
<input type="hidden" name="dede_fieldshash" value="这里需要生成hash值" />
<button type="submit">提交</button>
</form>
说明:
-
<input type="hidden" name="source_url" value="{dede:global name='http_referer' /}" />:
(图片来源网络,侵删)name="source_url": 这个name值会对应到你后台数据表中的字段名。value="{dede:global name='http_referer' /}": 这里将来源地址的值赋给这个隐藏域。
-
dede_fields:- 你需要在这个字段中声明你新增加的
source_url字段,格式是字段名,字段类型,因为来源地址是文本,所以类型是text,用分号 分隔各个字段。
- 你需要在这个字段中声明你新增加的
-
dede_fieldshash:- 这个值是根据
dede_fields和你在后台添加的字段生成的,用于表单提交的安全验证。直接复制粘贴你原来的hash值是不行的,必须重新生成。 - 如何生成hash值?
- 先在后台添加好
source_url字段(类型为“单行文本”)。 - 不做任何修改,直接去前台提交一次表单(可以随便填)。
- 提交后会提示“字段验证失败”,并会显示一个正确的
hash值。 - 复制这个正确的
hash值,替换掉模板中的dede_fieldshash的值。
- 先在后台添加好
- 这个值是根据
使用JavaScript获取(更灵活,可处理特殊情况)
{dede:global name='http_referer' /} 可能为空,比如用户直接在浏览器地址栏输入表单地址,或者通过书签访问,这时,用JavaScript在前端获取会更可靠,因为它可以在表单提交前动态设置值。
示例代码:
在表单模板中,使用JavaScript来获取来源地址并填充到隐藏域。
<form name="form1" action="/plus/diy.php" enctype="multipart/form-data" method="post" onsubmit="return setSourceUrl()">
<!-- 其他表单字段 -->
<input type="text" name="name" placeholder="您的姓名" />
<textarea name="message" placeholder="留言内容"></textarea>
<!-- 【关键部分】一个空的隐藏域,由JS来填充 -->
<input type="hidden" name="source_url" id="source_url_input" value="" />
<!-- 安全验证码 -->
<input type="hidden" name="dede_fields" value="name,text;message,text;source_url,text" />
<input type="hidden" name="dede_fieldshash" value="这里需要生成hash值" />
<button type="submit">提交</button>
</form>
<script type="text/javascript">
// 在表单提交时执行此函数
function setSourceUrl() {
// 获取来源地址
var referer = document.referrer;
// 如果来源地址为空(比如直接访问),可以设置一个默认值
if (!referer) {
referer = "直接访问"; // 或者 window.location.href
}
// 将获取到的值填充到隐藏域中
document.getElementById('source_url_input').value = referer;
// 返回 true,让表单正常提交
return true;
}
</script>
JavaScript document.referrer 说明:
document.referrer 属性返回载入当前文档的文档的URL,如果用户从直接地址栏输入或使用书签进入,则 document.referrer 为空字符串。
这种方法的优点:
- 更可靠:即使织梦变量为空,JS也能尝试获取。
- 可自定义:可以对来源地址进行处理,比如只取域名,或者添加默认值。
修改PHP处理文件(最强大,但有一定风险)
如果你需要对来源地址进行更复杂的处理,或者想在PHP后端统一处理所有表单的来源地址,你可以修改织梦的核心处理文件 plus/diy.php。
⚠️ 警告: 修改核心文件意味着在下次织梦升级时,你的修改可能会被覆盖,请务必提前备份文件。
操作步骤:
- 备份文件:备份
plus/diy.php。 - 编辑文件:打开
plus/diy.php文件。 - 添加代码:找到处理表单数据的逻辑部分,通常在
if($dopost == 'send')这个判断语句内,在将数据插入数据库之前,添加获取来源地址并赋值的代码。
示例代码:
在 plus/diy.php 中找到类似下面的代码段:
// ... 前面的代码 ...
if($dopost == 'send')
{
// 获取表单提交的数据
$fieldarr = array();
$dtype = '';
$dede_fields = empty($dede_fields) ? '' : trim($dede_fields);
$dede_fieldshash = empty($dede_fieldshash) ? '' : trim($dede_fieldshash);
// ... 原有的字段处理逻辑 ...
// 【关键部分】在这里添加获取来源地址的代码
// 检查POST数据中是否已经包含了来源地址(由JS或方法一提供)
if(empty($source_url))
{
// 如果没有,则从HTTP头中获取
$source_url = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '直接访问';
}
// 将来源地址添加到要插入数据库的数据数组中
// 假设你的数据库字段名是 `source_url`
$fieldarr['source_url'] = $source_url;
// ... 后续将 $fieldarr 插入数据库的代码 ...
// $inquery = "INSERT INTO `{$diy->table}` (`{$inaddfield}`) VALUES (`${inaddvalue}`);";
// 你需要确保 $inaddfield 和 $inaddvalue 变量中包含了 `source_url` 字段。
// 这通常意味着你仍然需要在模板中通过隐藏域传递这个字段,或者在这里动态构建SQL语句。
}
这种方法的复杂性: 这种方法比较复杂,因为它不仅要获取数据,还要确保这个新字段能被正确地拼接到最终的SQL插入语句中,对于大多数用户来说,方法一和方法二已经足够,且更安全、更易于维护。
总结与推荐
| 方法 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
| 织梦自带变量 | 最简单,无需额外代码,直接调用。 | 依赖浏览器,可能为空(直接访问时)。 | ★★★★★ (首选) |
| JavaScript | 灵活可靠,可处理空值,前端可控。 | 需要一点JS知识,用户禁用JS则无效(概率极低)。 | ★★★★☆ (推荐备选) |
| 修改PHP文件 | 功能最强大,后端统一处理,逻辑最严谨。 | 有风险,升级会覆盖,修改复杂,需要PHP基础。 | ★★☆☆☆ (不推荐普通用户使用) |
对于绝大多数情况,强烈推荐使用方法一,如果发现方法一在某些情况下(如直接访问)无法获取到值,再考虑使用方法二,将两者结合使用可以达到最佳效果。
