先上正确答案:
return 301 https://$host$request_uri;
上边这一行加入到nginx配置文件中监听80端口的server中即可。
再来说说我遇到的错误答案。这些方法不一定总是错误,但是会在某些情况下出错。
rewrite ^(.*)$ https://$host$1 permanent;
上边这是一种早期写法,还有一种返回301重定向的新写法:
return 301 https://$server_name$request_uri;
这两种写法在我使用通配符域名、监听主域名和通配符域名的时候出现了问题,通配符域名的请求会跳转到主域名,例如a.blog.idealsan.com/post/2019/ 会重定向到 blog.idealsan.com/post/2019/ 这显然是错误的,会导致404。
我猜测$server_name只会使用第一个域名,常常是主域名作为参数,所以出现错误。当我换成$host之后,参数变成了请求中的主机名,而不是从配置文件中寻找主机名参数,于是不会错误的改变请求的主机。