很早之前就想把手头上几个phpcms网站改成https协议访问(也即是全站设置ssl),但一直都抽不时间,其实主要还是现在懒了。今天花了点时间在网上搜了些教程,操作中发现都不是太全,于是自己再补充了点分享出来给有需要的朋友吧。
这篇文章主要介绍“怎么让phpcms支持https”,在日常操作中,相信很多人在怎么让phpcms支持https问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么让phpcms支持https”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
一、站点设置部分。
如果要把现有的phpcms站点启用https协议,可登陆后台在“站点管理”和“基本设置”里修改,也可以直接对caches/configs/system.php中的配置选项做替换,将"http://"全部替换为"https://"。如有必要,数据库中已存在的链接也要完全替换为https开头。
另外如果PHPSSO通信不成功,一直先生通信中的话,检查下/phpso_server/caches/configs下的system.php文件,将"http://"全部替换为"https://"。
二、程序修改部分。
1、让站点域名支持https
(1)修改phpcms/modules/admin/site.php 大约45行和128行的正则
('/http://(.+)/$/i', $domain))
修改为
('/(http|https)://(.+)/$/i', $domain))
(2)修改phpcms/modules/admin/templates/setting.tpl.php 大约18行中的正则
http://(.+)[^/]$
修改为
http[s]?://(.+)[^/]$
(3)修改phpcms/modules/admin/templates/site_add.tpl.php 大约13行中的正则
http://(.+)/$
修改为
http[s]?://(.+)/$
(4)修改phpcms/modules/admin/templates/site_edit.tpl.php 大约11行中的正则
http://(.+)/$
修改为
http[s]?://(.+)/$
2、友链模块
(1)修改phpcms/modules/link/index.php 大约41行和51行中的正则
/^http://(.*)/i
修改为
/^http[s]?://(.*)/i
(2)修改phpcms/modules/link/templates/link_add.tpl.php 大约10行中的正则
^http://[A-Za-z0-9]+.[A-Za-z0-9]+[/=?%-&]*([^<>])*$
修改为
^http[s]?://[A-Za-z0-9]+.[A-Za-z0-9]+[/=?%-&]*([^<>])*$
(3)修改phpcms/modules/link/templates/link_edit.tpl.php 大约11行中的正则
^http://[A-Za-z0-9]+.[A-Za-z0-9]+[/=?%-&]*([^<>])*$
修改为
^http[s]?://[A-Za-z0-9]+.[A-Za-z0-9]+[/=?%-&]*([^<>])*$
3、扩展-来源
打开 phpcms/modules/admin/templates/copyfrom_add.tpl.php和copyfrom_edit.tpl.php
找到
^http://
改成
^http[s]?://
或改成
^(http(s)?:)?//(.+)/$
4、扩展-关联链接
打开 phpcms/modules/admin/templates/keylink_add.tpl.php和keylink_edit.tpl.php
找到
^http:
改成
^http[s]?:
或改成
^http(s)?://
经过上面修改后,出现后台文章列表分页以及文章URL会重复带有网站域名,我们继续修改。
5、后台文章列表分页URL
打开文件 phpcms/libs/functions/global.func.php,找到pageurl函数,没修改过的在784行,里面找到
$url = str_replace(array('http://','//','~'), array('~','/','http://'), $url);
改成
//增加判断是否https修改开始
if(substr($url,0,5)=="https"){
$url = str_replace(array('https://','//','~'), array('~','/','https://'), $url);
}
else{
$url = str_replace(array('http://','//','~'), array('~','/','http://'), $url);
}
//增加判断是否https修改结束
或是改成
$url = preg_replace(array('/^((w+):)?///', '//{2,}/', '/~/'), array('$1~', '/', '//'), $url);
6、后台文章URL
打开 /phpcms/modules/content/templates/content_list.tpl.php
97行找到
} elseif(strpos($r['url'],'http://')!==false) {
改成
} elseif(strpos($r['url'],'http://')!==false || strpos($r['url'],'https://')!==false) {
或是改成
} elseif(preg_match('/^(http(s)?:)?///', $r['url'])) {
打开 /phpcms/modules/content/templates/content_page.tpl.php
28行找到:
if(strpos($category['url'],'http://')===false)
改成
if(strpos($category['url'],'http://')===false || strpos($category['url'],'https://')===false)
或是改成
if(preg_match('/^(http(s)?:)?///', $category['url']))
7、修正重复上传图片及uploadfile生成空白目录
如上图,如果勾选了保存远程图片,则会在启用https后出现上述的重复上传附件的Bug问题,下面是修改方法。
打开 /phpcms/libs/classes/attachment.class.php文件中的function download()方法。
165行找到
if(strpos($file, '://') === false || strpos($file, $upload_url) !== false) continue;
改成
//判断是否同一域名,避免重复上传编辑器中的图片,修改开始
$filehost = parse_url(strtolower($file));
$uploadhost = parse_url(strtolower($upload_url));
if(strpos($file, '://') === false || strpos($file, $upload_url) !== false || $filehost['host'] == $uploadhost['host']) continue;
//判断是否同一域名,避免重复上传编辑器中的图片,修改结束
改了后我们发现已经不会重复保存图片,但在存放附件的uploadfile目录还是会生成空白的文件夹,我们再继续修改。
往上几行找到
if(strpos($matche, '://') === false) continue;
改成
//修复生成空白文件夹的Bug,修改开始
$filehost = parse_url(strtolower($matche));
$uploadhost = parse_url(strtolower($upload_url));
if(strpos($matche, '://') === false || $filehost['host'] == $uploadhost['host']) continue;
//修复生成空白文件夹的Bug,修改开始
严格按照以上步骤修改后,phpcms完美支持https,结合页面静态化和url伪静态规则,亲测静态页面也可用https,此时的网站实际上通过http和https都能访问。
注意:
a.如注册用户提示‘操作失败’,请在后台会员模块设置中关闭‘注册时可选会员模型’或者保证会员不少于两个会员模型
b.在PHP5.6或以上的PHP版本中会出现和PHPSSO无法正常通信的情况,因为PHP5.6及以上fsockopen和file_get_contents等函数openssl需要验证目标的SSL证书是否可信,需要安装openssl根证书才可以,否则openssl会报警告信息 证书验证失败!
如需在php5.6或以上版本中使用HTTPS的请参阅PHP官方有关php5.6和openssl的资料http://php.net/manual/en/migration56.openssl.php
补充:
经过以上所有步骤后,出现新的问题:通信正常但是无法注册会员账户及登陆。解决方法如下:
打开 /phpsso_server/api/uc_client/client.php
找到
$port = !empty($matches['port']) ? $matches['port'] : 80;
改成
$port = !empty($matches['port']) ? $matches['port'] : ($matches['scheme'] == 'https' ? 443 : 80);
打开 /phpsso_server/api/uc_client/model/misc.php
找到
$port = !empty($matches['port']) ? $matches['port'] : 80;
改成
$port = !empty($matches['port']) ? $matches['port'] : ($matches['scheme'] == 'https' ? 443 : 80);
打开 /phpcms/libs/classes/http.class.php
找到
$port = $matches['port'] ? $matches['port'] : 80;
改成
$port = !empty($matches['port']) ? $matches['port'] : ($matches['scheme']=='https' ? 443 : 80);
$protocol = ('https' == $matches['scheme']) ? 'ssl://' : '';
找到
$fp = @fsockopen($host, $port, $errno, $errstr, $timeout);
改成
$fp = @fsockopen($protocol.$host, $port, $errno, $errstr, $timeout);
打开 /phpsso_server/phpcms/libs/classes/http.class.php
找到
$port = $matches['port'] ? $matches['port'] : 80;
改成
$port = !empty($matches['port']) ? $matches['port'] : ($matches['scheme']=='https' ? 443 : 80);
$protocol = ('https' == $matches['scheme']) ? 'ssl://' : '';
打开 /phpcms/modules/member/classes/client.class.php里找到_ps_post函数
找到
$port = !empty($matches['port']) ? $matches['port'] : 80;
改成
$port = !empty($matches['port']) ? $matches['port'] : ($matches['scheme']=='https' ? 443 : 80);
到此,通过以上修改,基本解决了PHPCMCSV9兼容https的问题,至于为什么说基本,因为这里也有可能我尚未发现的地方,如果有可以在评论区告知一下,我更新上来。