这几天在折腾HDwiki+discuz,系统环境是FreeBSD 10.4, PHP 5.6(HDwiki要求),PHP-PDO_MYSQL,PHP-GD,PHP-XML等,MYSQL 5.7

HDwiki 5.1(6.0安装成功后打开前台,提示http 500错误,找不到原因)
discuz X3.4

因为宽带运营商关闭了80端口,443端口有开,所以就直接用上https,结果问题一大堆。

首先,discuz和ucenter在https下通信失败,后来找到修改方法:

DISCUZ 开启https后ucenter通信失败解决方法,一般是做完301重定向https后通信失败的,下面是具体解决方法:

打开目录 uc_server/model/misc.php 文件;找到69行,插入下面代码:

......
$port = !empty($matches['port']) ? $matches['port'] : ($matches['scheme'] == 'https' ? 443 : 80);//以下为插入代码
if(substr($url,0,5)=='https'){
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if($post){
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
}
if($cookie){
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
}
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
return curl_exec($ch);
}
//插入代码结束if($post) {$out = "POST $path HTTP/1.0\r\n";
......

接下来设置HDwiki和ucenter,问题比较多了。
一开始,只要设置https,就提示“您输入的URL地址不正确!”
网上也没有任何资料,经过调试,发现要修改HDwiki目录下的control/admin_setting.php的659行

原来长这样:

if(empty($ucapi) || !preg_match("/^(http:\/\/)/i", $ucapi)) {

修改成这样:

if(empty($ucapi) || !preg_match("/^((http:|https:)\/\/)/i", $ucapi)) {

这个问题解决后,出现的是“uc_url_unreachable”错误。走了不少弯路后,发现还是https的问题。
admin_setting.php调用了api/uc_client/client.php里的uc_fopen(),而这个函数使用fsockopen模拟浏览器进行访问。
并且只有拼接了http协议的情况。对这个接口文件的分析,见这篇文章http://blog.csdn.net/yanhui_wei/article/details/17919645

综合这些分析,比较一下discuz的uc_server/model/misc.php和HDwiki下的api/uc_client/client.php,会发现:

discuz的uc_server/model/misc.php里的function dfopen2()和 function dfopen()与HDwiki下的api/uc_client/client.php的uc_fopen2()和uc_fopen()基本上是类似的。

所以解决方法如下:
1、拷贝discuz下的uc_client目录,替换HDwiki下的api/uc_client目录
2、修改api/uc_client/client.php文件,重点在于用function dfopen2()和 function dfopen()的内容替换uc_fopen2()和uc_fopen(),修改完成的结果如下:

function uc_fopen2($url, $limit = 0, $post = '', $cookie = '', $bysocket = FALSE, $ip = '', $timeout = 15, $block = TRUE, $encodetype  = 'URLENCODE') {$__times__ = isset($_GET['__times__']) ? intval($_GET['__times__']) + 1 : 1;if($__times__ > 2) {return '';}$url .= (strpos($url, '?') === FALSE ? '?' : '&')."__times__=$__times__";return uc_fopen($url, $limit, $post, $cookie, $bysocket, $ip, $timeout, $block, $encodetype);}function uc_fopen($url, $limit = 0, $post = '', $cookie = '', $bysocket = FALSE    , $ip = '', $timeout = 15, $block = TRUE, $encodetype  = 'URLENCODE') {$return = '';$matches = parse_url($url);$scheme = $matches['scheme'];$host = $matches['host'];$path = $matches['path'] ? $matches['path'].($matches['query'] ? '?'.$matches['query'] : '') : '/';$port = !empty($matches['port']) ? $matches['port'] : ($matches['scheme'] == 'https' ? 443 : 80);/*//以下内容可以不需要if($scheme=='https'){$curl = curl_init();curl_setopt($curl, CURLOPT_URL, $url);curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);if($post) {curl_setopt($curl, CURLOPT_POST, 1);curl_setopt($curl, CURLOPT_POSTFIELDS, $post);}if($cookie) {curl_setopt($curl, CURLOPT_COOKIE, $cookie);}curl_setopt($curl, CURLOPT_TIMEOUT, $timeout);curl_setopt($curl, CURLOPT_HEADER, 0);curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);$return = curl_exec($curl);if (curl_errno($curl)) {echo '<pre><b>错误:</b><br />'.curl_error($curl); }curl_close($curl);return $return;}// 结束*/if($post) {$out = "POST $path HTTP/1.0\r\n";$header = "Accept: */*\r\n";$header .= "Accept-Language: zh-cn\r\n";$boundary = $encodetype == 'URLENCODE' ? '' : ';'.substr($post, 0, trim(strpos($post, "\n")));$header .= $encodetype == 'URLENCODE' ? "Content-Type: application/x-www-form-urlencoded\r\n" : "Content-Type: multipart/form-data$boundary\r\n";$header .= "User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n";$header .= "Host: $host:$port\r\n";$header .= 'Content-Length: '.strlen($post)."\r\n";$header .= "Connection: Close\r\n";$header .= "Cache-Control: no-cache\r\n";$header .= "Cookie: $cookie\r\n\r\n";$out .= $header.$post;} else {$out = "GET $path HTTP/1.0\r\n";$header = "Accept: */*\r\n";$header .= "Accept-Language: zh-cn\r\n";$header .= "User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n";$header .= "Host: $host:$port\r\n";$header .= "Connection: Close\r\n";$header .= "Cookie: $cookie\r\n\r\n";$out .= $header;}$fpflag = 0;if(!$fp = @fsocketopen(($scheme == 'https' ? 'ssl' : $scheme).'://'.($scheme == 'https' ? $host : ($ip ? $ip : $host)), $port, $errno, $errstr, $timeout)) {$context = array('http' => array('method' => $post ? 'POST' : 'GET','header' => $header,'content' => $post,'timeout' => $timeout,),);$context = stream_context_create($context);$fp = @fopen($scheme.'://'.($scheme == 'https' ? $host : ($ip ? $ip : $host)).':'.$port.$path, 'b', false, $context);$fpflag = 1;}if(!$fp) {return '';} else {stream_set_blocking($fp, $block);stream_set_timeout($fp, $timeout);@fwrite($fp, $out);$status = stream_get_meta_data($fp);if(!$status['timed_out']) {while (!feof($fp) && !$fpflag) {if(($header = @fgets($fp)) && ($header == "\r\n" ||  $header == "\n")) {break;}}$stop = false;while(!feof($fp) && !$stop) {$data = fread($fp, ($limit == 0 || $limit > 8192 ? 8192 : $limit));$return .= $data;if($limit) {$limit -= strlen($data);$stop = $limit <= 0;}}}@fclose($fp);return $return;}}
....
//找到同步登录登出代码,修改成以下内容
/*** 进入同步登录代码** @param int $uid        用户ID* @return string         HTML代码*/
function uc_user_synlogin($uid) {$uid = intval($uid);$return = uc_api_post('user', 'synlogin', array('uid'=>$uid));return $return;
}/*** 进入同步登出代码** @return string         HTML代码*/
function uc_user_synlogout() {$return = uc_api_post('user', 'synlogout', array());return $return;
}
....

然后就可以看到一切都正常了。
另外需要注意的是,必须保证ssl证书在有效期内,因为这个,浪费了2天的时间。

HDwiki+discuz在启用https下的整合问题相关推荐

  1. 纯内网环境中k8s下onlyOffice启用https

    其实本来onlyOffice启用https是个很简单的事情,参照官网配置进行启用即可.但是由于网络环境的特殊性我们只能使用自签证书来部署所有的系统服务.所以整个过程还是比较多坑需要踩. 开始时我想以往 ...

  2. 在express.js上启用HTTPS

    本文翻译自:Enabling HTTPS on express.js I'm trying to get HTTPS working on express.js for node, and I can ...

  3. EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器启用https服务申请免费证书...

    背景分析 目前想在 web 上使用 HTTPS 的话, 你需要获得一个证书文件, 该证书由一个受浏览器信任的公司所签署. 一旦你获得了它, 你就在你的 web 服务器上指定其所在的位置, 以及与你关联 ...

  4. 黄聪:WordPress 启用HTTPS设置(转)

    HTTPS已经成为网站的一种趋势,得益于数以万计的开发者和百万计的玩家,Wordpress启用HTTPS过程相当简单.下面就把Wordpress启用HTTPS访问的过程记录一下,以供参考. 一. 修改 ...

  5. Tomcat启用HTTPS协议配置过程

    Article1较为简洁,Article2较为详细,测试可行. Article1 概念简介 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问 ...

  6. 利用官方支持为基于GitHub Pages的Hexo博客启用HTTPS

    HTTP(超文本传输协议),是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据,互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准.设计HTTP的初衷是为 ...

  7. 如何免费的让网站启用HTTPS

    今天,我把CoolShell变成https的安全访问了.我承认这件事有点晚了,因为之前的HTTP的问题也有网友告诉我,被国内的电信运营商在访问我的网站时加入了一些弹窗广告.另外,HTTP的网站在搜索引 ...

  8. 记一次免费让网站启用HTTPS的过程

    写在前面 个人网站运行将近2个月了,期间根据酷壳的一篇教程如何免费的让网站启用HTTPS做了一次,中间遇到问题就放下了.昨天孙三苗问我网站地址说要添加友链,出于好奇想看他网站长什么样,顺道也加一下友链 ...

  9. typecho 全站ajax,Typecho全站启用HTTPS教程

    全站启用HTTPS已经成为趋势,搜索引擎也在不断重视,今天就分享下Typecho设置HTTPS的过程. 申请SSL证书 如果您还没有域名SSL证书,请自行申请沃通免费SSL证书和Let's Encry ...

最新文章

  1. Ueeidor 使用
  2. pythonspark集群模式运行_有关python numpy pandas scipy 等 能在YARN集群上 运行PySpark
  3. ThreadPool的使用
  4. 程序员过关斩将--解决分布式session问题
  5. 【VS开发】CTimeSpan类
  6. 金融科技:中国农行研发中心DevOps规划与实践
  7. Win7,Win8下多实例运行Excel2010
  8. Linux工作笔记032---Centos7.3 kill杀掉不用的进程_查看某个进程_某个进程占用的cpu,内存情况
  9. VB ListBox 添加不重复的值
  10. 【最新版win10 adb环境变量配置】
  11. 【科研记录】如何判断(你自己的)研究工作的价值
  12. 压缩图片和改变图片图形
  13. Frontiers in Nutrition专刊征稿(IF 6.59, 王进/刘连亮/Zhongbin Deng
  14. linux之上运行Vxworks,在MPSoC上能同时运行VxWorks和Linux吗?
  15. Android studio 更新aar库无效问题解决
  16. 目标跟踪:在视频序列中跟踪特定对象的位置和状态
  17. hp1015驱动64位_在win10/win7 64位系统上安装 hp laserjet 1015对应的打印机驱动
  18. Docker容器处于Removal in process 无法删除解决方案
  19. WIPS产品到底能不能堵上最强Wi-Fi 漏洞?这里有一场精彩的红蓝对抗
  20. 判断一个坐标点是否在不规则多边形内部的算法

热门文章

  1. How to reassign lifecycle in Windchill
  2. 数据科学与大数据技术和计算机科学与技术哪个好
  3. 官方发布!PMP证书正式纳入【北京市工作居住证】办理范围!
  4. LSVGlobal Mapper应用----地形下载
  5. 关于数学基础的研究现状
  6. Debian设置合上笔记本盖子不休眠
  7. has no attribute _TensorLike
  8. 常用快递API及快递在线下单API分享
  9. AI各领域产业发展现状
  10. [zz]2007年的152条牛人经典BT语录,强烈推荐!