我认为这是一个有必要整理的问题,因为nginx这种配置文件改好一次后就一般不会再改了,这导致这种简单的流程我都没记住,每次搭建环境都需要去百度。而另一个方面,百度查出来的教程也很杂乱,要么就是教其中一个,要么就是代码都有问题,根本不适合nginx的最新版本,或者就是干脆全部都是错的,严重浪费我的时间,所以我为啥不自己整理一下?
环境为lnmp的最新稳定版,代码是正确的,但是请根据实际情况禁止放置。
不过请注意,在之前一定要打开443端口。
过程如下:
1.在按照lnmp官方的办法,创建一个网站,并且绑定两个域名(带www,和不带www),还设置ssl证书的时候
,nginx的配置文件可以看到如下的代码。有两个server,一个是监听80,一个是监听443。
下面是80的:
listen 80;
#listen [::]:80;
server_name xxxx.com www.xxx.com;
还有443的:
listen 443 ssl http2;
#listen [::]:443 ssl http2;
server_name xxxx.com www.xxxx.com;
你会发现这两个就是后面监听的端口不一样,但是却在配置文件分出了两个server方法来,在这种默认模式下,http和https都可以访问,不带www和带www也可以访问,可以说比较混乱了。
2.所以该配置跳转了,可以一个一个来,其实lnmp的分开也有好处,不需要进行太复杂的判断。
首先是强制ssl,在监听80的server方法内,建议在root目录申明之后,添加一句如下代码(含义是,识别所有域名的访问并跳转到https网址
):
rewrite ^(.*)$ https://$host$1 permanent;
然后是强制www,根据之前的逻辑,网址都会自动https,所以在监听80端口的方法里写是无效的,会生效前面一条,所以应该在监听443的方法里面写
,也就是ssl配置的下面,加上如下代码(含义是判断访问的域名是是否带www的,如果不是,就跳转到带www的地址):
if ($http_host !~ "^www.xxxx.com") {
rewrite /.* https://www.xxxx.com$uri permanent;
}
反过来说,如果是强制不带www,就这样写:
if ($http_host !~ "^xxxx.com") {
rewrite /.* http://xxxx.com$uri permanent;
}
以上配置完成后,访问http地址自动跳转到https,且访问不带www网址,自动到带www,两个会同时生效,这样就避免了创建两个网站,或者其它复杂配置的麻烦。当然,可能根据环境的不同,在实际情况下要进行变通,如果出现错误的话也可以在博客评论进行留言。
规则之树版权所有,转载请注明来源,标明作者及原文链接