Nginx域名跳转带有www前缀的配置写法

·Nginx ·重定向 ·域名

Nginx的配置文件,可以灵活配置域名访问时的处理请求如何转发和处理。我给我的网站配置了ssl,因此请求协议是带https的而不是http,输入example.com会自动走https://example.com的。早些时候,我没配置ssl,默认example.com会正确处理,但www.example.com会访问不到。因为server_name需要写上www.example.com,如:

server {
    server_name example.com www.example.com;
    listen               *:80;
    listen               [::]:80;
    .......
}
这样,example.com和带www的都会正常请求。刚刚,我配置了ssl,所以我的需求变成了:无论是带www前缀还是不带前缀的,都跳转成https://www.example.com。网上找了些答案,用各大桌面浏览器试试时以为可以了,但当我使用安卓版chrome时,example.com会正常跳转到https://www.example.com,而www.example.com却跳成了http://www.example.com,不走https。我找了许多答案,有用if判断是否$host是'www.example.com'是的话强制跳转,这在我这边是不行的。后来我用这样的方式解决了这个问题:不使用单独的server块而是定义多个server,看下面的配置内容吧。
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name www.example.com example.com;
    return 301 https://www.example.com$request_uri; 
    .......
}
server {
    listen 443 ssl;
    server_name example.com;
    return 301 https://www.example.com$request_uri;
 
    ssl_certificate   /..../xx.crt;
    ssl_certificate_key  /.../xx.key;
    ......
}
server {
    listen 443 ssl;
    server_name www.example.com;
    ssl_certificate   /..../xx.crt;
    ssl_certificate_key  /.../xx.key;
    ......
}
此处我们先看80的http端口,无论带www还是不带www的都会请求到,接着再重定向到443,强制为https://www.example.com$request_uri,这样请求地址便会成为https://www.example.com了,非常棒~接着,还有一种情况,那就是不带www的请求是直接443的,这样有可能走https但不包含www,所以为此再独立定义一个server,处理443的example.com,然后也给它直接重定向到https://www.example.com$request_uri,因此到此,所有服务端可能处理到的请求都会最终走443的带www的地址,不信大家用多个浏览器试试!
可以参见以下文档以提供更多帮助:
Nginx no-www to www and www to no-www

来自:计算机系统与软件工具
更新于2022-03-14 08:55:05 发表于2022-03-10 17:31:12


此内容暂不允许评论



公元2024年甲辰龍年,平安健康、龍行天下!