Nginx 禁用 .htaccess 和隐藏文件但允许 .well-known 目录

Jan*_*hou 24 nginx virtualhost lets-encrypt

我有一个 Nginx 服务器,并禁用了隐藏文件 nginx_vhost.conf

## Disable .htaccess and other hidden files
    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }
Run Code Online (Sandbox Code Playgroud)

但是 LetsEncrypt 需要访问该 .well-known目录。

如何允许.well-known目录并拒绝其他隐藏文件?

the*_*arv 30

其他解决方案对我没有帮助。

我的解决方案是包括负正则表达式.well-known。您的代码块应如下所示:

## Disable .htaccess and other hidden files
location ~ /\.(?!well-known).* {
    deny all;
    access_log off;
    log_not_found off;
}
Run Code Online (Sandbox Code Playgroud)

它将阻止除以开头的文件之外的每个点文件 .well-known

PS:我也会添加return 404;到块中。

  • 不,完全不一样。`/\.(?!well-known\/)` 不像我的正则表达式那样具有表现力(因为我阻止了所有点文件,除了定义众所周知的)。也许最好的组合是像 `location ~ /\.(?!well-known\/).*` 这样的组合,它只解锁众所周知的目录,而不是理论上的 `.well-known-blabla`。但我认为不阻止理论上的 .well-known-blabla 文件并没有真正的危险。 (3认同)
  • 是的,你是对的@webwoman,但有时会有混合环境。除非确实需要,否则我认为不应提供任何点文件(安全性或不需要的历史暴露,例如 .git)。 (3认同)

Wei*_*dei 24

Nginx 按照它们在配置文件中出现的顺序使用正则表达式应用位置。

因此,您当前位置之前添加这样的条目会对您有所帮助。

location ~ /\.well-known { 
    allow all;
}
Run Code Online (Sandbox Code Playgroud)


Tim*_*Tim 9

我已经在我的网站上提供了关于如何在 NGINX 中使用 Let's Encrypt的完整分步教程。

关键部分是:

  • 官方客户端还可以,在亚马逊Linux上真的很差。我推荐一个不同的客户端ACME
  • 将此位置用于 webroot 方法,以及我推荐的客户端。请注意,请求是通过 http 而不是 https 提供的。

您的 https 块中根本不需要侦听器,这一切都在 https 上完成。这只是为了证明您控制了域,它不提供任何私人或秘密的服务。

# Answer let's encrypt requests, but forward everything else to https
server {
  listen       80;
  server_name  example.com www.example.com
  access_log  /var/log/nginx/access.log main;

  # Let's Encrypt certificates with Acmetool
  location /.well-known/acme-challenge/ {
    alias /var/www/.well-known/acme-challenge/;
  }

  location / {
    return       301 https://www.example.com$request_uri;
  }
}
Run Code Online (Sandbox Code Playgroud)

上面链接的完整分步指南。