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

时间:2018-02-28 22:21:31

标签: redirect nginx

我想要访问以下服务器名称, 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的完整域(包含子域)。

1 个答案:

答案 0 :(得分:2)

有多种方法可以执行此操作,但如果此服务器仅处理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