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


16

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

## Disable .htaccess and other hidden files
    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }

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

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


注意:nginx不使用或没有.htaccess文件。它具有可配置的文件,但没有被称为.htaccess,它们也无法正常工作。
罗布

Answers:


17

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

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

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

它将阻止每个点文件,除了以 .well-known

PS:我也将添加return 404;到该块。


1
location ~* /\.(?!well-known\/) {因为在看到github.com/h5bp/server-configs-nginx/blob/master/h5bp/location/...等同于这个location ~ /\.(?!well-known).* {
专业备份

3
不,这不完全相同。/\.(?!well-known\/)不如我的regex富有表现力(因为我阻止了所有点文件,但众所周知的除外)。也许最好的办法是像location ~ /\.(?!well-known\/).*这样的组合,即仅解除对知名目录的阻止,而不是对理论上的阻止.well-known-blabla。但是,我认为不阻止理论上的.blank文件并不存在真正的危险。
therealmarv

为什么由于nginx无法处理htaccess而禁用htaccess?
Webwoman

3
是的,您说对了@webwoman,但有时存在混合环境。在我看来,除非确实需要,否则不应提供任何点文件(安全性或与.git一样的安全历史记录)。
therealmarv

16

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

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

location ~ /\.well-known { 
    allow all;
}

谢谢,这正是我所需要的!将其放在禁止访问所有点文件的规则之前。我唯一改变的是转义点,例如location ~ /\.well-known {。无论哪种方式,这都应该是公认的答案。
aexl

8

我已经在我的网站上提供了一个完整的分步教程,介绍如何使用NGINX进行Let's Encrypt

关键部分是:

  • 官方客户端还可以,并且在Amazon 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;
  }
}

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


3

添加此内容(之前或之后):

location ^~ /.well-known/ {
        log_not_found off;
     }

您也可以在底部添加它,因为匹配^~修饰符的优先级高于正则表达式。请参阅文档


0

如果您有很多配置文件,并且它们已经包含对.htaccess的拒绝,例如

location ~ /\.ht { deny all; }

然后,您无需忽略所有的点文件,而只需使用.git添加第二个忽略即可

sed -i '/location ~ \/\\.ht { deny all; }/a \  location ~ \/\\.git { deny all; }' /etc/nginx/*
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.