在 nginx 上使用 webroot 和 SSL 重定向进行 Let's Encrypt

在 nginx 上使用 webroot 和 SSL 重定向进行 Let's Encrypt

我有一个网站,nginx其要求如下:

  1. 重定向所有 http -> https
  2. 零停机时间 Let's Encrypt 证书续订

为了满足 (1),我的nginx配置中有一个小型 http->https 重定向。为了满足 (2),我需要修改上述配置,以便我可以使用 webroot Let's Encrypt 身份验证方法。

我正在尝试找出能够满足这两个要求的最佳解决方案。我想出了以下可行的方法。

前:

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

后:

server {
    listen 80;
    server_name example.com;
    location ~ /\.well-known\/acme-challenge {
        root /usr/share/nginx/html;
        allow all;
    }
    if ($request_uri !~ /\.well-known) {
        return 301 https://example.com$request_uri;
    }
}

然而,我希望找到另一种方法。原因如下:

  1. if 是邪恶的。在这种情况下可能不是什么大问题,因为这只是 http->https 重定向,应该是非常低流量。

  2. 更重要的是,避免使用以下命令if可以更轻松地将 webroot 身份验证附加到我所有运行的站点上,nginx因为我只需将该location指令放入其中.conf,然后就可以随意将其包含在我所有的小 http->https 重定向块中。

这个问题,Alex 使用一个简单的语句给出了一个例子return,但这对我来说不起作用(nginx -t抱怨nginx: [emerg] invalid number of arguments in "return" directive in /etc/nginx/...)。

有没有更好的方法?或者我上面的解决方案已经是最好的了?

答案1

if您可以用正常位置替换:

server {
    listen 80;
    server_name example.com;
    location /.well-known/acme-challenge {
        root /usr/share/nginx/html;
        allow all;
    }
    location / {
        return 301 https://example.com$request_uri;
    }
}

原因:选择并记住具有最长匹配前缀的位置。

为了找到与给定请求匹配的位置,nginx 首先检查使用前缀字符串(前缀位置)定义的位置。其中,选择并记住具有最长匹配前缀的位置。然后按照正则表达式在配置文件中出现的顺序检查正则表达式。正则表达式的搜索在第一次匹配时终止,并使用相应的配置。如果没有找到与正则表达式匹配的,则使用先前记住的前缀位置的配置。

来源:Nginx 文档

相关内容