【问题标题】:Redirect www and http requests to https://, catching all domains, in nginx在 nginx 中将 www 和 http 请求重定向到 https://,捕获所有域
【发布时间】:2015-04-27 10:56:10
【问题描述】:

在 nginx 中,我们希望将所有发送的请求重定向到:

https://www.<domain>
http://www.<domain>
http://<domain>

收件人:

https://<domain> 

即 SSL,没有 www 前缀,作为一个包罗万象,没有单独指定每个域。

我们提出的配置几乎有效:

server {
        server_name "~^www\.(.*)$" ;
        return 301 https://$1$request_uri ;
}

server {
        listen                  80 default;
        client_max_body_size    10m;
        client_body_buffer_size 128k;
        return                  301 https://$host$request_uri;
}

server {
        listen                  443;
        ssl                     on;
        ..... etc ......

...但是第一个服务器块(www 捕获)似乎匹配所有请求,而不仅仅是 www.*

【问题讨论】:

    标签: redirect nginx configuration no-www


    【解决方案1】:

    nginx manual: A redirect to a main site

    server {
        listen   80;
        listen   [::]:80;
    
        server_name www.example.com;
    
        return 301 https://example.com$request_uri;
    }
    server {
        listen   443 default_server ssl;
    
        server_name www.example.com example.org;
    
        ssl_certificate        /path/to/my/cert;
        ssl_certificate_key  /path/to/my/key;
    }
    

    不要失去“其他一切”:

    server {
        listen       80 default_server;
        server_name  _;
        return       301 http://example.com$request_uri;
    }
    

    更高效,通过仅在 http 协议上运行重写,它避免了在每个请求上检查 $scheme 变量 (IfIsEvil)

    也许你可以尝试在一个地方使用 80/443:

    server {
        listen   80;
        listen   [::]:80;
        listen   443 default ssl;
    
        server_name www.example.com;
    
        ssl_certificate        /path/to/my/cert;
        ssl_certificate_key  /path/to/my/key;
    
        if ($ssl_protocol = "") {
           rewrite ^   https://$server_name$request_uri? permanent;
        }
    }
    

    【讨论】:

    • 谢谢,瓦莱里。你知道如何应用它来捕获所有域吗?
    • 空服务器其实就是catch all服务器
    • @ValeriySolovyov 为什么在最后一个 sn-p 中出现 if 条件?
    • @Mohammad AbuShady 如果不是 https -> 重定向。 nginx.org/en/docs/http/ngx_http_ssl_module.html $ssl_protocol — 返回已建立的 SSL 连接的协议;
    • 好吧,我会尽量避免ifs,第一个解决方案对我来说似乎更好,3 个服务器块和 nginx 将匹配正确的一个。 wiki.nginx.org/IfIsEvil
    猜你喜欢
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 2015-04-26
    • 2015-04-20
    • 2017-09-03
    • 1970-01-01
    • 2018-02-02
    相关资源
    最近更新 更多