Nginx中的顺序是否重要?

我有这样的服务器文件

server { listen 80; server_name subdomain.example.com; return 301 https://$server_name$request_uri; location /.well-known/acme-challenge { root /var/www/letsencrypt; } } 

现在当我尝试sudo letsencrypt renew 。 它抛出和错误说无法find。 .well-known/acme-challenge 。 但一旦我评论了return 301行重新启动服务器,它的工作。

现在我想重新testing它把位置放在第一位,而不是评论返回301声明,但它说certificate not due for renewal 。所以问题是文件读取的顺序,这是否重要? 而且不会因为这个原因而自动续约,那些续约的人又是如何处理这种情况的呢?

在这种情况下,它不是那么多的顺序(一个很好的解释如何评估位置和正则expression式可以在这里find: https : //www.digitalocean.com/community/tutorials/understanding-nginx-server-and-位置块selectalgorithm )。

对于像位置块这样的东西,短版本是最好的匹配胜,而不是第一个匹配。

然而,在你的情况下,顺序是因为你使用了return 。 根据https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#return

停止处理并将指定的代码返回给客户端。 非标准代码444在不发送响应报头的情况下closures连接。

这里的关键是一个return立即停止处理/评估,所以发生的事情是nginx没有看任何低于return

所以你只需要在你的位置块下面移动那个return子句。

至于testing,我会尝试将--test-cert添加到您的命令行中(请参阅https://certbot.eff.org/docs/using.html#certbot-command-line-options )。

这应该避免尝试使用其生产服务器时遇到的“问题”,该问题报告您拥有有效的证书,并且现在不需要新的证书。

您应该将您的return指令包含在一个location块中,然后使用正常的location块匹配规则:

 server { listen 80; server_name subdomain.example.com; location / { return 301 https://$server_name$request_uri; } location /.well-known/acme-challenge { root /var/www/letsencrypt; } }