关于词语过滤的问题
板块和用户组都设置发帖不审核,设置了过滤词语并且设置为 审核关键字
这个时候发帖,前台会提示
抱歉,您填写的内容包含敏感词而无法提交[ 点击这里返回上一页 ]
然后就会导致用户一直在发帖,其实第一次提示的时候已经创建帖子并且在审核列表里了。
————
我本地又起了一个项目,因为本地没法完全还原线上的情况,所以是纯3.5的一次测试。
发现是完全正常的。发帖后会提示
新主题需要审核,您的帖子通过审核后才能显示
————
这种情况我该怎么办呢,有什么方式能知道是什么原因导致的么
根据你描述的问题现象,结合Discuz!的过滤词工作机制,我们从技术角度分析可能的原因和解决方案如下:
一、核心排查步骤:
1. 敏感词模式检查
- 通过数据库执行SQL查询(注意备份):
SELECT * FROM pre_common_setting WHERE skey IN ('censoremail','censorusername','censorpost');
确认:
- `censorpost`的status字段是否为1(启用状态)
- `modtype`字段值是否为2(审核模式)
2. 缓存更新检测
在网站后台执行:
【后台】->【工具】->【更新缓存】,勾选「模板缓存」和「数据缓存」后更新
3. 冲突检测方法
临时修改网站配置文件:
/config/config_global.php 末尾添加:
$_config['plugindeveloper'] = 2;
$_config['hookscript']['forum']['post'] = '';
这会强制关闭所有插件钩子
二、高级诊断方案:
1. 流程追踪调试
修改以下文件添加日志记录:
/source/module/forum/forum_post.php
在约第680行(提交处理逻辑处)添加:
$censored = censormod($message);
if($censored) {
require_once libfile('function/misc');
$censormodmessage = getcensormod($censored);
log_message(' '.var_export($censormodmessage, true), 'mod');
}
2. 数据库触发器监控(需MySQL 5.7+)
创建监控表:
CREATE TABLE censor_log (
id INT AUTO_INCREMENT PRIMARY KEY,
log_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
post_data TEXT,
filter_result TEXT
);
创建触发器:
DELIMITER $$
CREATE TRIGGER trg_censor_check
BEFORE INSERT ON pre_forum_post
FOR EACH ROW
BEGIN
IF NEW.invisible = 2 THEN
INSERT INTO censor_log(post_data, filter_result)
VALUES (NEW.message, (SELECT value FROM pre_common_setting WHERE skey='censorpost'));
END IF;
END$$
DELIMITER ;
三、已知常见问题解决方案:
1. 混合过滤规则冲突
当同时存在以下规则时会引发异常:
- 全站级过滤(pre_common_setting)
- 板块级过滤(pre_forum_forum.censorwords字段)
- 用户组过滤(pre_common_usergroup.censorwords字段)
建议使用统一过滤层级,推荐仅保留全站级过滤规则
2. 特殊编码干扰
使用十六进制检测工具检查敏感词:
// 检测示例
$str = '敏感词测试';
echo bin2hex($str)."\n";
// 输出:e6958fe6849fe8af8de6b58be8af95
3. 第三方插件干扰排查
在/source/plugin/目录下创建空文件:
find . -name 'hook.class.php' -exec grep -l 'filter_modpost' {} \;
该命令可列出所有涉及发帖过滤的插件
四、终极解决方案建议:
若仍无法定位问题,可采用模块替换法:
1. 备份原文件:
cp -r source/module/forum/ source/module/forum_bak
2. 从官方完整包提取以下文件覆盖:
- /source/module/forum/forum_post.php
- /source/class/helper/helper_censor.php
- /source/function/function_post.php
3. 清除opcode缓存:
// 在网站根目录创建clean.php
<?php
if(function_exists('opcache_reset')) opcache_reset();
if(function_exists('apc_clear_cache')) apc_clear_cache();
echo "缓存已清除";
通过以上技术方案,可系统性地定位和解决过滤词机制异常的问题。建议先进行非破坏性的日志记录式排查,再逐步进行模块替换。如果问题依然存在,可通过DZ插件网的技术支持通道提交调试日志。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。 根据你描述的情况,这个问题可能与Discuz的词语过滤机制和审核流程有关。以下是一些可能的原因和解决方案:
### 1. **检查词语过滤设置**
- 确保在后台的“词语过滤”设置中,敏感词被正确设置为“审核关键字”。如果设置为“禁止关键字”,则会导致帖子直接被拦截,而不是进入审核流程。
- 检查是否有其他全局设置或插件影响了词语过滤的行为。
### 2. **检查用户组和板块权限**
- 确保用户组和板块的权限设置正确,特别是发帖权限和审核权限。如果用户组或板块的权限设置不一致,可能会导致帖子被直接拦截而不是进入审核流程。
- 检查是否有其他插件或自定义代码修改了用户组或板块的权限逻辑。
### 3. **检查插件冲突**
- 如果你在线上环境中使用了插件,可能是某个插件与词语过滤功能产生了冲突。尝试禁用所有插件,看看问题是否依然存在。如果问题解决,逐步启用插件,找出导致问题的插件。
- 检查是否有插件修改了发帖流程或审核流程的逻辑。
### 4. **检查模板文件**
- 检查模板文件中是否有自定义的JavaScript代码或逻辑,可能会影响发帖时的提示信息。特别是检查`template/default/forum/post.htm`文件,确保没有自定义代码修改了发帖流程。
### 5. **检查日志和错误信息**
- 查看Discuz的系统日志和PHP错误日志,看看是否有相关的错误信息。可能会发现一些线索,帮助你定位问题。
- 如果你有权限,可以启用Discuz的调试模式,查看发帖时的详细流程和变量值。
### 6. **对比线上和本地环境**
- 由于你在本地测试时没有问题,说明问题可能与线上环境的配置或数据有关。尝试对比线上和本地的数据库、配置文件、插件、模板等,找出差异。
- 特别是检查线上环境的`config/config_global.php`和`config/config_ucenter.php`文件,确保没有特殊的配置项影响了发帖流程。
### 7. **手动调试**
- 如果你有开发经验,可以尝试在发帖流程中插入调试代码,输出相关变量和流程信息,帮助你定位问题。特别是检查`source/module/forum/forum_post.php`文件,看看发帖时的逻辑是否有异常。
### 8. **更新Discuz版本**
- 如果你使用的是较旧的Discuz版本,尝试更新到最新版本,看看问题是否得到解决。新版本可能修复了相关的Bug。
### 9. **联系技术支持**
- 如果以上方法都无法解决问题,建议联系DZ插件网的技术支持团队,提供详细的错误信息和环境信息,他们可能会提供更专业的帮助。
### 总结
这个问题可能是由于词语过滤设置、用户组权限、插件冲突或模板文件修改导致的。通过逐步排查这些可能性,你应该能够找到问题的根源并解决它。如果问题依然存在,建议联系DZ插件网的技术支持团队获取进一步的帮助。
希望这些建议对你有所帮助!如果还有其他问题,欢迎继续提问。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页:
[1]