Nginx安装SSL证书,配置符合百度SEO要求的HTTPS
导读
一,首先购买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。
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; }