Nginx将所有[http / www / https www]重定向到[https non-www]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx将所有[http / www / https www]重定向到[https non-www]相关的知识,希望对你有一定的参考价值。

我在https上有以下要访问的服务器名称:

example.com
test.example.com
api.example.com
api.test.example.com

# And I might add more, all on example.com of course
# ...

我想将所有httphttp://wwwhttps://www重定向到https://non-www

喜欢:

http://example.com               => https://example.com
http://test.example.com          => https://test.example.com
http://api.example.com           => https://api.example.com
http://api.test.example.com      => https://api.test.example.com

http://www.example.com           => https://example.com
http://www.test.example.com      => https://test.example.com
http://www.api.example.com       => https://api.example.com
http://www.api.test.example.com  => https://api.test.example.com

https://www.example.com          => https://example.com
https://www.test.example.com     => https://test.example.com
https://www.api.example.com      => https://api.example.com
https://www.api.test.example.com => https://api.test.example.com

看一下我在网上发现的一个简单例子,我尝试了以下方法:

server {
    listen 80;
    server_name example.com test.example.com www.example.com www.test.example.com api.example.com api.test.example.com www.api.example.com www.api.test.example.com;

    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443;
    server_name www.example.com www.test.example.com www.api.example.com www.api.test.example.com;

    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443;
    server_name example.com test.example.com api.example.com api.test.example.com;
    # 
    # The rest of the config that that follows is indeed for the names
    # that I want to redirect everything to
    # ...
}

我认为$host意味着在/和没有www之前的网址的一部分。就像我访问www.api.test.example.com然后$ host将是api.test.example.com。等等。

但是,在注意到它的行为方式和检查nginx变量后,似乎我认为错了。虽然它没有非常清楚地解释并且没有提供示例,但它们也没有说明使用哪个变量来获得没有www的完整域(子域包括)。

答案

有多种方法可以做到这一点,但如果此服务器只处理example.com的子域,则可以使用正则表达式和默认服务器进行简化,而不是为server_name指令指定长列表。

例如:

server {
    listen 80;
    listen 443 ssl;

    server_name ~^www.(?<domain>.+)$;

    return 301 https://$domain$request_uri;        
}

server {
    listen 80 default_server;
    return 301 https://$host$request_uri;        
}

server {
    listen 443 ssl default_server;
    ...
}

第一个server块仅匹配以www.开头的主机名。第二个服务器块使用http匹配其他所有内容。第三个server区块使用https匹配其他所有区域。

假设此服务器具有通配符证书,对所有子域都是通用的。有关更多信息,请参阅this document

以上是关于Nginx将所有[http / www / https www]重定向到[https non-www]的主要内容,如果未能解决你的问题,请参考以下文章

NGINX 将 http 重定向到 https,将非 www 重定向到 ww

lnmp搭建

nginx配置https,重定向后https变成了http

ELB Nginx 将 http 重定向到 https

Nginx+Tomcat动静分离及Nginx优化

Nginx:将非www重定向到www https