Nginx域名跳转带有www前缀的配置写法
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
更新于2022-03-14 08:55:05 发表于2022-03-10 17:31:12
此内容暂不允许评论