nginx:如何重写网址以使用www和https

时间:2014-10-27 19:58:59

标签: nginx

如何重写网址以便始终使用www和https?

// The url can have https but not www
https://example.com
// The url can have www but not https
http://www.example.com
// The url can have neither https, neither www
http://example.com 

=> rewrite to https://www.example.com

我已经使用以下内容将https添加到所有请求,但http怎么办?是否有一种有效的添加方式?

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

由于

2 个答案:

答案 0 :(得分:2)

创建2个服务器块来处理异常,并创建1个服务器块来处理常见的事情。

server {
    listen         80;
    server_name    www.domain.com
                   domain.com;
    return         301 https://www.domain.com$request_uri;
}
server {
    listen         443 ssl;
    server_name    domain.com;
    return         301 https://www.domain.com$request_uri;
}
server {
    listen         443 ssl;
    server_name    www.domain.com;

    #
    # The usual stuff..
    # 
}

答案 1 :(得分:0)

TanHongTat答案很好,但您必须考虑nginx的默认服务器行为。如果没有服务器块匹配,即使您定义了server_name,它也会占用第一个。

此外,不要忘记添加ssl证书和密钥,即使只有返回的块。

我最终做了以下事情:

# Default server for http
server {
    listen 80;
    listen [::]:80;
    return 301 https://www.domain.com$request_uri;
}

# Default server for https
server {
    listen 443;
    return 301 https://www.domain.com$request_uri;

    ssl on;
    ssl_certificate /..../ssl_certificate.crt;
    ssl_certificate_key /..../ssl_certificate.key;

    # Disable SSLv3 vulnerability
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
}

server {

    listen 443;
    server_name www.domain.com;

    ssl on;
    ssl_certificate /..../ssl_certificate.crt;
    ssl_certificate_key /..../ssl_certificate.key;

    # Disable SSLv3 vulnerability
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    #
    # The usual stuff..
    # 
}