在Nginx上配置重定向,统一网站URL中的HTTP与HTTPS,WWW与非WWW

Nginx的server block

在Nginx的配置文件中我们可以创建形如

server {
    listen 80 default_server;
    server_name example.com;
    ...
}

的代码来创建一个相应特定端口请求的服务器。

将http重定向到https

搭建Nginx环境时,我们利用默认给出的server block实现了example.com域名在80端口,即对http://example.com 的响应。
之后使用Nginx版的certbot自动配置了https
其实在利用Certbot启用https时,除了自动注册和下载SSL证书,Certbot还自动为我们修改了Nginx的配置文件。打开Nginx的配置文件,可以看到形如

server {
    server_name example.com;
    ...
    listen 443 default_server;
    ...
}

的代码,主要变化除了添加了SSL证书相关的配置文件,还将80端口改成了443端口,这样https://example.com 就能正确响应了。但是如果只是这样配置,使用http访问任何页面都会返回404,所以除此之外,certbot还在下面添加了一个server block,形如

server {
    listen 80 default_server;
    server_name example.com;
    ...
    location / {
      # Redirect all HTTP requests to HTTPS with a 301 Moved Permanently response.
      return 301 https://$host$request_uri;
    }
}

来把所有http:// 的url重定向到https://

将www域名重定向到裸域名

与将http重定向到https类似,通过增加名为www.example.com 的server block,然后将其重定向到裸域名url即可将域名统一到不含www的格式,反之亦然。

server {
    server_name www.example.com;
    return 301 $scheme://example.com$request_uri;
}

在这种配置下,如果用户访问了http://www.example.com 将会首先被www重定向server block 处理,把url重定向到http://example.com,
然后在被https重定向server block处理。最终所有形式的url都会被统一到https://example.com。
注意不要忘了在DNS记录中添加www版本的A类记录或CNAME

同时支持www与非www

如果不使用重定向,直接同时在www和非www域名上提供相同的服务技术上也是可以的,只要在server_name 后面添加www的版本。

server {
    ...
    server_name example.com www.example.com
    ...
}

但是在关于www和非www域名哪个更好的讨论中,我们的结论是用哪一种都可以,但是不要同时使用两个版本。

Related

细心的朋友可能会发现,现在互联网上网站的域名有些以www开头,有些则不是。两种域名究竟有哪些区别呢? 技术上的区别 网域名称(英语:Domain Name,简称:Domain),简称域名、网域,是由一串用点分隔的字符组成的互联网上某一台计[…]

因为这样会让搜索引擎认为是内容重复的两个独立网站,影响SEO,而且不利于网站形象与品牌的塑造。

Ads