解决 Discuz! X3.* “允许发表的域名列表”中的域名在非http协议头时无效的问题
分类 网站技术/村民张先生 发布于 2016-04-22 19:35
BUG描述:
在 “后台”-“全局”-“注册与访问控制”-“访问控制”-“允许发表的域名列表” 中添加域名后,只有发布该域名http协议头的网址时才有效,https / ftp / mms 等其他协议头仍然被禁止。例如,普通用户组1已被设置禁止发布URL链接,我们在“允许发表的域名列表”中添加 xxx.com 后,xxx.com / *.xxx.com / http://xxx.com / http://*.xxx.com 均可以正常发出,但其它协议头下,例如 https://www.xxx.com 仍然被禁止发出。
BUG修复:
打开 source/class/helper/helper_form.php 文件,查找:
if(!preg_match('/^http:\/\//is', $val)) $val = 'http://'.$val;
替换为(也就是删除其中的 ^http):
if(!preg_match('/:\/\//is', $val)) $val = 'http://'.$val;
上传覆盖即可。
原理分析:
该行代码原本的目的,是在链接不带协议头的情况下,自动添加 http:// ,以便后面的 parse_url 提取链接的 host 部分。
但该行代码忽略了链接在带有 https:// 等其他协议头的情况,导致其它协议头的链接也被添加 http:// ,例如 http://https://www.xxx.com ,最后 parse_url 提取到的 host 为 协议头 https 。
我们去掉 ^http ,当连接中不存在 :// 时,则自动添加 http:// ,这样带有其它协议头的链接就会保持原样,后面的 parse_url 也就能正常获取到 host 部分了。
/2017-09-29 06:59测试有效,谢谢