我有一个网站,nginx
其要求如下:
- 重定向所有 http -> https
- 零停机时间 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;
}
}
然而,我希望找到另一种方法。原因如下:
if 是邪恶的。在这种情况下可能不是什么大问题,因为这只是 http->https 重定向,应该是非常低流量。
更重要的是,避免使用以下命令
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 文档