网站升级https的注意事项-细节决定成败

http vs https

现在网站很多都是https的了,那么它和http有什么区别呢?为什么越来越多的网站采用https呢?

首先,http是文本传输形式,是不加密的,不安全的,而https是加密的,采用的是对称加密和非对称加密结合方式,相对于http,https会有一定的时间损耗,但是由于增加了安全性,因此,已经越来越成为现在网站主流的传输形式。

https证书

因为非对称加密存在公钥不一定是服务器的可能,因此我们引入了证书,证书就是颁给服务器的一个证明,用来告诉我们某个证书是某个服务器的。

所以我们要想把网站升级为https,首先我们就需要有自己的https证书,庆幸的是,现在又很多免费的证书提供给我们使用,比如letsencrypt等。

服务器配置https

服务器都是支持https,比如apache和nginx都是支持https功能。我们只需要配置好密钥,就可以实现网站的https传输。

nginx有nginx.conf配置文件来配置https,apache有.htaccess可以配置https.

下面我们就简单看下nginx和apache关于https的配置。

server {
        listen       443 ssl;
        server_name  www.80shihua.com;

        ssl_certificate      cert/www.80shihua.com_xxx.pem;
        ssl_certificate_key  cert/2www.80shihua.com_xxx.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            proxy_pass http://127.0.0.1:8886;
        }
    }
Listen 443
<VirtualHost *:443>
    DocumentRoot "/www/wwwroot/www.80shihua.com"
    ServerName www.80shihua.com
    SSLEngine on
    SSLCertificateFile "etc/www.80shihua.com_xxx.cert"
    SSLCertificateKeyFile  "etc/www.80shihua.com_xxx.key"
</VirtualHost>

经过上面的配置,我们的网站就可以支持https访问了,但是你会发现,http访问也是可以的,这个时候我们就需要强制把http转向https。

server {
    listen 80;
    server_name  xxx.com;
    rewrite ^(.*)$   https://$host$1 permanent;
}
RewriteCond %{HTTP_HOST} ^localhost [NC]
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

遇到的坑

因为网站做了多个二级域名的https升级,所以这个时候对于强制跳转需要格外注意,否则就会导致所有的http都跳转到了一个域名上,或者是一个域名的https起作用,而另一个不起作用。

<IfModule mod_rewrite.c>
Options +FollowSymlinks -Multiviews

RewriteEngine on

RewriteCond %{SERVER_PORT} 80
RewriteCond %{HTTP_HOST} ^test.80shihua.com$ 
RewriteRule ^(.*)$ https://test.80shihua.com/$1 [L,R=301]

#RewriteCond %{HTTP_HOST} ^test.80shihua.com$ 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)?$ index.php  [E=PATH_INFO:$1,QSA,PT,L]

RewriteCond %{SERVER_PORT} 80
RewriteCond %{HTTP_HOST} ^www.80shihua.com$ 
RewriteRule ^(.*)$ https://www.80shihua.com/$1 [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1  [QSA,PT,L]

</IfModule>

上面的配置,是笔者的.htaccess的配置,目的是为了实现两个域名分别实现https加密,但是实际测试的时候却发现 www.80shihua.com 这个域名跳转的时候,http链接全部跳转到了首页,而不是对应的页面。

后来仔细检查调试才发现,少了注释掉的那行导致的,RewriteCond是条件跳转,少了这句话,所有非文件和路径都会执行

RewriteRule ^(.*)?$ index.php  [E=PATH_INFO:$1,QSA,PT,L]

细节决定成败

当一个程序你感觉有问题的时候,那么它就一定会出现问题。

我们平时写的程序,一定要较真,不能马虎大意,因为你欺骗了程序,程序不会欺骗你。你越是害怕出问题的地方,它就越会出问题。

所以平时我们写程序的时候,一定要写测试用例,一方面是可以检查程序的正确性,另一方面是可以在程序升级的时候,校验是否影响了原有功能。

细节决定成败,同样都是写程序的人,为什么有些人能够不断提升自己,这是因为他们时刻注重细节,因为成功离不开每一个细节。