Google对ssl加密的重视带动了https加密协议的利用,在面向国外站长中引起了风潮,我也想给baishujun.com加一个https加密访问,但是由于百度对这类网站非常不友好,这个我自己没有测试哈,是看到网站的资料这么说,所以我也就没有去尝试了。最近因为有客户需要在google推广,gogle硬性规定推广网站的用户登录页面和付款页面必须是https加密协议,需求这种环境,在架设的过程中顺便就记录了这个过程,记录在了《开启WDINLUX WDCP 双引擎系统网站的HTTPS访问支持》这篇文章中。架设好了https,那么我们就需要将以前的http的访问全部转向到https,这里我们可以只是启动部分是https访问,比如用户登录和付款页面,这个修改只需要修改网站中相关部分的代码就好了,href中带上https的地址就行。
但是既然google对https友好,那么我们也可以开启全站https访问,那么我们就需要对整个网站的http多301重定向到https。我们知道http访问默认端口是80端口,而ssl加密协议默认使用的是443端口。这种跳转在网站的伪静态中设置可能没有效果,比如.htaccess
我设置没有成功。那么我们可以从“根”来入手,我们来“治本”。
在WDCP系统中,每一个网站都有自己的配置文件,那么我们在配置文件中启动ssl监听就好了,WDCP的网站配置文件目录为/www/wdlinux/nginx/conf/vhost/
。以百蔬君网站为例,我们使用的是nginx+apache+mysql的环境系统,前台程序都是nginx来处理,处理静态文件是nginx的优势。那么开启https的功能就需要在nginx的配置中去修改,百蔬君的配置文件为/www/wdlinux/nginx/conf/vhost/
,在上文中已经介绍了怎么配置这个网址来支持https协议。代码如下
server { listen 80; listen 443 ssl; ssl_certificate /www/ssl/2_www.baishujun.com.key; ssl_certificate_key /www/ssl/1_www.baishujun.com_bundle.crt; ssl_session_timeout 5m; server_name baishujun.com www.baishujun.com; root /www/web/baishujun_com/public_html; index index.html index.php; error_page 400 /errpage/400.html; error_page 403 /errpage/403.html; error_page 404 /errpage/404.html; error_page 405 /errpage/405.html; location ~ \.php$ { proxy_pass http://127.0.0.1:88; include naproxy.conf; } location / { try_files $uri @apache; } location @apache { proxy_pass http://127.0.0.1:88; include naproxy.conf; } }
添加了listen 443 ssl这四行。那么全站跳转需要怎么做呢,我想到的办法是把监听80端口和443端口的配置分开。
server { listen 80; server_name www.www.baishujun.com www.baishujun.com; root /www/web/www.baishujun_com/public_html; index index.html index.php; error_page 400 /errpage/400.html; error_page 403 /errpage/403.html; error_page 404 /errpage/404.html; error_page 405 /errpage/405.html; location ~ \.php$ { proxy_pass http://127.0.0.1:88; include naproxy.conf; } location / { try_files $uri @apache; } location @apache { proxy_pass http://127.0.0.1:88; include naproxy.conf; } } server { listen 443 ssl; ssl_certificate /www/wdlinux/nginx/conf/ssl/AddTrustExternalCARoot.crt; ssl_certificate_key /www/wdlinux/nginx/conf/ssl/www.www.baishujun.com.nopass.key; ssl_session_timeout 5m; server_name www.baishujun.com baishujun.com; root /www/web/www_baishujun_com/public_html; index index.html index.php; error_page 400 /errpage/400.html; error_page 403 /errpage/403.html; error_page 404 /errpage/404.html; error_page 405 /errpage/405.html; location ~ \.php$ { proxy_pass http://127.0.0.1:88; include naproxy.conf; } location / { try_files $uri @apache; } location @apache { proxy_pass http://127.0.0.1:88; include naproxy.conf; } }
这样就完成了443端口和80端口分开的配置了。
之后在80端口的配置中加一个301跳转,
return 301 https://www.baishujun.com$request_uri;
或者
rewrite ^(.*)$ https://$host$1 permanent;
这样就将所有绑定的域名重定向到 https://www.baishujun.com去了,不管80端口绑定了什么,全部重定向走了。在这里提一个问题,如何将https://baishujun.com重定向到https://www.baishujun.com呢?在这里卖一个小小的关子了,欢迎讨论。
如果觉得有用,帮我点赞哦。
将所有子域名强制跳转到www的方法,这个关子卖的,差点自己都忘掉了,鄙视下自己。
方法有两个:
第一个方法是修改nginx的网站配置文件,比如百蔬君博客的配置文件/www/wdlinux/nginx/conf/vhost/baishujun.com.conf
在listen 443 ssl;
下面添加一个判断语句就可以了。
listen 443 ssl; server_name baishujun.com www.baishujun.com; if ($host != 'www.baishujun.com') {rewrite ^/(.*)$ https://www.baishujun.com/$1 permanent;}
第二个方法是修改伪静态文件,就是网站根目录的.htaccess
文件
RewriteEngine On RewriteCond %{HTTP_HOST} !^www\.baishujun\.com RewriteRule (.*) https://www.baishujun.com/$1 [R=301,L]
如果网站域名不是www.baishujun.com就跳转到https://www.baishujun.com,个人推荐第二种方法,在网站目录,更容易维护。网站配置文件,一般情况还是不动为好!
Updated:20170111
WDCP种http to https跳转的问题,及一个问题的修正
像上面的方法,http到https的跳转是没有问题的,但是就像我在 《开启WDINLUX WDCP 双引擎系统网站的HTTPS访问支持》文章说的一样,这样的修改之后,只要在wdcp后台对这个网站进行一次配置,那么这个所有手工修改的信息就没有了,所以我们把server{listen 443 ssl;.........}
这个语句块移动到nginx的配置文件中,不放在虚拟主机的配置文件中了。这样只是实现了https的搭建。我尝试将这个网站在80端口的监听也搬到nginx.inf的配置文件中去,没有成功,很显然对于同一个端口的监听是先按照虚拟主机的配置文件来执行,然后再按照nginx.inf的配置文件去去执行。在baishujun.com.conf端口已经执行80端口的配置了,在nginx.inf就没有执行,但是执行搬到了这里的对443端口的监听。
那么强制将http跳转到https的方法有2个方向。
第一个方向,在wdcp每次配置好网站之后,然后手动修改虚拟主机配置文件,比如在baishujun.com.conf,在这个文件里面按照上面介绍的方法,添加一条跳转或者是重写,将所有的80端口的访问转发到https去处理。
第二个方向,就是在网站程序里面进行检查,用php程序或者js程序来判断是否启用了SSL。
php判断语句
function is_HTTPS(){ if(!isset($_SERVER['HTTPS'])) return FALSE; if($_SERVER['HTTPS'] === 1){ //Apache return TRUE; }elseif($_SERVER['HTTPS'] === 'on'){ //IIS return TRUE; }elseif($_SERVER['SERVER_PORT'] == 443){ //其他 return TRUE; } return FALSE; }
js判断语句
var ishttps = 'https:' == document.location.protocol ? true: false; if(ishttps){ alert('https'); }else{ alert('http'); }
WDCP后台的301跳转要注意,在设置跳转到https方面来说,不建议使用。作者还要加油把这个更新好啊。
就算把他的这个 rewrite ^/(.*)$ https://$host$1 permanent;
语句修改正确,也是没法访问的。
慎用!
Updated:20170112