nginx环境wordpress全站开启https

  • A+
所属分类:刘志强

nginx环境wordpress全站开启https

前几天,无意中用谷歌访问我的博客,发现地址栏有个“不安全”标志,我知道是http浏览模式导致的,但心里就是不舒服,于是决定把全站启用https浏览模式,过程分享如下。

搭建环境:win2008+nginx+mysql

第一步:申请SSL证书

现在可以申请SSL证书的网站很多,但是个人建议用阿里云,速度快,基本30分钟搞定。

流程:在阿里云控制台-产品与服务-安全(云盾)-CA证书服务(数据安全),点击购买证书。购买过程按照阿里云提示一步步进行即可,因为申请的是开发版免费证书,所以一个证书仅支持一个域名认证,不支持通配符。

nginx环境wordpress全站开启https

第二步:安装证书以及配置NGINX

解压申请好的证书包,会有两个文件,一个.pem文件,一个是.key文件。

1)进入nginx的安装目录,增加cert文件夹,把刚刚下载的两个文件上传到cert文件夹中。

2)打开 Nginx 安装目录下 conf 目录中的 nginx.conf 文件,写入如下代码。

server {
        listen       80;        方法一:适应于http和https共存
	listen       443 ssl;   方法一:适应于http和https共存
        listen       443 ;      方法二:只允许https
	ssl on;                 方法二:只允许https
        server_name  liuzhiqiang.net alias www.liuzhiqiang.net;
	ssl_certificate 盘符:/路径/Nginx/cert/文件名.pem;
        ssl_certificate_key 盘符:/路径/Nginx/cert/文件名.key;
        ssl_session_timeout  5m;
        ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers   on;
        location / {
        root html;
        index index.html index.htm;
       ......
                  }
}
网上有的是相对路径,但是实测,一定要绝对路径才行。
这里一定要注意,如果服务器有多个网站,部分需要用80访问,个别的用https访问,那一定要用方法一,并把方法二的代码删除。同理,如果服务器网站都用https访问,就用方法二,把方法一的代码删除。

 

配置完毕后,重启nginx,做一个单纯的静态页面,测试一下,如果出现绿色小锁,证明证书配置没有问题。效果如下图

nginx环境wordpress全站开启https

第三步:设置禁止未绑定的域名访问80和443端口

server {
    listen       80  default_server;
    server_name  _;
    return       444;
}
#上面是禁止80的
server {
     listen 443 default_server;
     server_name _ ;
     ssl_certificate        盘符:/路径/Nginx/cert/文件名.pem;           
     ssl_certificate_key    盘符:/路径/Nginx/cert/文件名.key;
     return 444;
}
#此段是禁止443的

禁止未绑定的域名访问443,这块最坑,你不能想当然跟禁止80端口设置的一样,一定要给弄个证书,自己去网上随便生成一个,或者就用自己那个证书也行。顺便说下,这块我折腾时间最长,网上有很多教程都是错误的,比如下图坚决不能开启ssl on;(也许80和443不共存是正确的)。

nginx环境wordpress全站开启https

第四步:wordpress开启https

方法一:传统方式将 WordPress 开启整站 HTTPS 协议,一共两步。

1)登录和后台强制开启 SSL,可以通过修改 wp-config.php 文件,直接在文件末尾加入以下两行代码:

define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);

或者在确认 WordPress 站点已经开启 https 协议并可以通过 https 访问,那么可以直接登陆后台,通过“设置”中“常规”里面把“WordPress 地址(URL)”、“站点地址(URL)”两个地址的 http 修改为 https 并保存。

nginx环境wordpress全站开启https

2)修改mysql数据库,把数据库中所有http://的地址都改成https://,命令如下:

update 表名 set 字段名 = replace(字段名,'旧网址','新网址')

不过上述方法要直接修改数据库,对于Mysql数据库命令不熟悉的朋友,个人不推荐,搞不好网站直接被毁也是可能的。

方法二:编辑当前主题下的 functions.php 文件,加入以下代码的任意一种:

代码一:HTTPS 绝对链接替换

add_filter('get_header', 'fanly_ssl');
function fanly_ssl(){
	if( is_ssl() ){
		function fanly_ssl_main ($content){
			$siteurl = get_option('siteurl');
			$upload_dir = wp_upload_dir();
			$content = str_replace( 'http:'.strstr($siteurl, '//'), 'https:'.strstr($siteurl, '//'), $content);
			$content = str_replace( 'http:'.strstr($upload_dir['baseurl'], '//'), 'https:'.strstr($upload_dir['baseurl'], '//'), $content);
			return $content;
		}
		ob_start("fanly_ssl_main");
	}
}

代码二:HTTPS 相对链接替换

add_filter('get_header', 'fanly_ssl');
function fanly_ssl(){
	if( is_ssl() ){
		function fanly_ssl_main ($content){
			$siteurl = get_option('siteurl');
			$upload_dir = wp_upload_dir();
			$content = str_replace( 'http:'.strstr($siteurl, '//'), strstr($siteurl, '//'), $content);
			$content = str_replace( 'http:'.strstr($upload_dir['baseurl'], '//'), strstr($upload_dir['baseurl'], '//'), $content);
			return $content;
		}
		ob_start("fanly_ssl_main");
	}
}

到这里其实基本完工了,不过在检查网站的时候发现一个小问题,就是百度分享不能用了,原因是因为百度不支持https,解决办法如下

代码点击下载,解压得到static文件夹(解压密码:liuzhiqiang.net),上传到网站根目录,把调用百度分享js里边的http://bdimg.share.baidu.com改成https://你得网站。

window._bd_share_config = {
	"common": {
		"bdSnsKey": {},
		"bdText": "",
		"bdMini": "2",
		"bdMiniList": false,
		"bdPic": "",
		"bdStyle": "1",
		"bdSize": "16"
	},
	"share": {
		"bdSize": 16
	}
};
with(document) 0[(getElementsByTagName('head')[0] || body).appendChild(createElement('script')).src = 'http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion=' + ~ ( - new Date() / 36e5)];

最后别忘了做301永久指向

if ($scheme = http) {
return 301 https://$host$request_uri;
}
nginx环境wordpress全站开启https

 

至此应该说大功告成了,效果如下↓

 

nginx环境wordpress全站开启https

nginx环境wordpress全站开启https

如果在浏览器打开地址栏,未显示绿色小锁图标,那么说明你的网站加载了非SSL引入的资源,比如调用了http://的图片,js等等,请仔细排查。

总结:其实对于个人网站开启https没什么意义,因为增加一个验证证书的环节,反而会导致网页打开变慢,而且部分cdn服务商对https加速是收费的,但是没办法大势所趋,不过我是一个完美主义者,浏览器前面的绿色小锁看着让人还是蛮舒服的。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: