一,首先购买SSL证书
阿里云腾讯云这些大公司的云平台都有提供免费的SSL证书,对于百度来说,免费证书和付费证书有没有什么区别,不是很了解。我的思路是,个人网站,经济不宽裕的,用免费证书,公司网站,尽量用付费证书,买一个通配符域名证书,一年1200元左右。
在阿里云申请证书,然后绑定域名申请签发,会审核个几十分钟就下来了。
二,下载SSL证书
在阿里云SSL证书列表,每个证书后面都有一个下载按钮,点击后根据服务器类型选择对应的证书。常见的web服务器类型有Tomcat,Apache,Nginx,IIS。这里我们选择Nginx的证书,下载后解压,得到2个文件,类似:3029185__xxoo.com.key
,3029185__xxoo.com.pem
.
三,上传SSL证书
1,把.key和.pem2个证书文件放在一个cert文件夹里
2,上传cert文件夹到Linux服务器Nginx的conf目录下。我用lnmp套件搭建的环境,具体路径是/usr/local/nginx/conf/
四,Nginx虚拟主机配置SSL证书
1,我的每个网站都单独生成了一个虚拟主机配置文件.conf,参考:nginx的虚拟主机配置的有序管理
2,打开对应网站虚拟主机配置文件,你会看到如下代码,这说明网站启用了80端口,且开通了http访问
server {
listen 80;
server_name www.xxoo.com;
index index.html index.php;
root /home/wwwroot/www.xxoo.com;
......
}
3,再加一段server,启用443端口,且启用https访问的代码,如下:
server {
listen 443;
server_name www.xxoo.com;
ssl on;
root /home/wwwroot/www.xxoo.com;
index index.html index.php;
ssl_certificate cert/3029185__xxoo.com.pem;
ssl_certificate_key cert/3029185__xxoo.com.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
}
最好要能明白上面每一行代码:
A,listen 443;表示监听443端口
B,server_name www.xxoo.com;表示启用域名www.xxoo.com
C,ssl on;启用SSL
D,root /home/wwwroot/www.xxoo.com;网站在服务器上的目录路径
E,index index.html index.php;默认首页文件,先找index.html,再找index.php,2个文件都找不到的话,就会返回403之类的错误。
F,ssl_certificate和ssl_certificate_key,这两行指定证书位置,我们第三步的操作和这里对应的,注意相对路径和文件名不要出错
G,ssl_session_timeout、ssl_ciphers、ssl_protocols、ssl_prefer_server_ciphers这四行就按上面代码设置即可。
五,让HTTPS生效
1,上传第四点修改的虚拟主机配置文件.conf,重启Ningx服务
2,浏览器访问https://www.xxoo.com
,看是不是可以访问了
3,如果不能访问,看看你的服务器是不是开放了443端口访问(很多人忘记了这一步)。阿里云服务器是在安全组配置。
到这里,你网站http和https两个协议都可以访问了,属于共存的。当然,这肯定不符合百度SEO的规范,百度会当成2个站进行收录,造成镜像站。所以要进行下一步。
六,让HTTP301重定向到HTTPS
1,让http://www.xxoo.com
301重定向到https://www.xxoo.com
,把原来80端口的server代码段精简成下面:
server {
listen 80;
server_name www.xxoo.com;
return 301 https://www.xxoo.com$request_uri;
}
2,让http://xxoo.com
301重定向到https://www.xxoo.com
,新增下面server代码段:
server {
listen 80;
server_name xxoo.com;
return 301 https://www.xxoo.com$request_uri;
}
3,让https://xxoo.com
301重定向到https://www.xxoo.com
,新增下面server代码段:
server {
listen 443;
server_name xxoo.com;
return 301 https://www.xxoo.com$request_uri;
}
当然熟悉这个配置的同学,可以把上面的四个server代码合并,但这样写出来更井井有条。这样就实现了:
访问http://www.xxoo.com/
首页及其下面任何页面,都会301到https://www.xxoo.com
对应的页面
访问http://xxoo.com/
首页及其下面任何页面,都会301到https://www.xxoo.com
对应的页面
访问https://xxoo.com/
首页及其下面任何页面,都会301到https://www.xxoo.com
对应的页面
真正实现了网站域名的统一和权重的集中。
七,虚拟主机配置的完善
1,https网站的一些静态资源比如css/js/png/jpg这些文件设置一些缓存时间。
2,http的301跳转以及https的一些访问要记录到日志log文件里。
3,其他相关配置
八,用https://myssl.com
测试你网站SSL配置是否正确。
九,奉上我整个网站的配置代码:
server {
listen 443;
server_name www.xxoo.com;
ssl on;
root /home/wwwroot/www.xxoo.com;
index index.html index.php;
access_log /home/wwwlogs/www.xxoo.com.log access;
ssl_certificate cert/2550234__xxoo.com.pem;
ssl_certificate_key cert/2550234__xxoo.com.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location ~ [^/]\.php(/|$)
{
try_files $uri =404;
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
access_log off;
}
location ~ .*\.(js|css)?$
{
expires 12h;
access_log off;
}
}
server {
listen 443;
server_name xxoo.com;
return 301 https://www.xxoo.com$request_uri;
access_log /home/wwwlogs/www.xxoo.com.log access;
}
server {
listen 80;
server_name xxoo.com;
return 301 https://www.xxoo.com$request_uri;
access_log /home/wwwlogs/www.xxoo.com.log access;
}
server {
listen 80;
server_name www.xxoo.com;
return 301 https://www.xxoo.com$request_uri;
access_log /home/wwwlogs/www.xxoo.com.log access;
}