让我们通过 SSL 重定向在 nginx 上使用 webroot 进行加密

mga*_*lgs 4 nginx lets-encrypt

我有一个nginx符合以下要求的网站:

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

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

我试图找出满足这两个要求的最佳解决方案。我想出了以下方法,这很有效。

前:

server {
    listen 80;
    server_name example.com;
    return 301 https://example.com$request_uri;
}
Run Code Online (Sandbox Code Playgroud)

后:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

  2. 更重要的是,避免if将更容易将 webroot 身份验证绑定到我后面运行的所有站点,nginx因为我可以将该location指令放入 a 中.conf,然后我可以在我所有的 http->https 重定向块中随意包含。

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

有没有更好的方法来做到这一点?或者我上面的解决方案是否已经足够好?

Phi*_*ann 6

您可以将 替换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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

来源:Nginx 文档


归档时间:

查看次数:

1430 次

最近记录:

8 年,10 月 前