Nginx отключает .htaccess и скрытые файлы, но разрешает .well-известный каталог

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каталог и запретить другие скрытые файлы?

Janghou
источник
Примечание: nginx не использует или не имеет .htaccessфайлов. У него есть файлы конфигурации, но они не вызываются .htaccessи не работают одинаково.
Роб

Ответы:

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;в блок.

therealmarv
источник
1
Как location ~* /\.(?!well-known\/) {видно на github.com/h5bp/server-configs-nginx/blob/master/h5bp/location/… идентично этому location ~ /\.(?!well-known).* { ?
Pro Backup
3
нет это не то же самое точно. /\.(?!well-known\/)не так выразительно, как мое регулярное выражение (потому что я блокирую все точечные файлы, кроме хорошо известных по определению). Возможно, лучшим будет комбинация, подобная location ~ /\.(?!well-known\/).*которой, которая разблокирует только известный каталог, а также теоретический .well-known-blabla. Но я думаю, что нет реальной опасности не блокировать теоретический файл .well-known-blabla.
Therealmarv
зачем отключать htaccess, так как в любом случае Nginx не справляется с этим?
Веб-леди
3
Да, вы правы @webwoman, но иногда бывают смешанные среды. По моему мнению, любые точечные файлы не должны обслуживаться (безопасность или нежелательное раскрытие истории, как с .git), за исключением случаев, когда это действительно необходимо.
Theremarmar
16

Nginx применяет местоположения с регулярными выражениями в порядке их появления в файле конфигурации.

Поэтому добавление такой записи перед вашим текущим местоположением поможет вам.

location ~ /\.well-known { 
    allow all;
}
Weirdei
источник
Спасибо, это именно то, что мне было нужно! Поместил это перед правилом, запрещающим доступ ко всем точечным файлам. Единственное, что я изменил, это избежать точки, например location ~ /\.well-known {. В любом случае, это должен быть принятый ответ.
18:30
8

Я предоставил полное пошаговое руководство по использованию Let's Encrypt с NGINX на моем веб-сайте.

Ключевые части:

  • Официальный клиент только в порядке, и на 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;
     }

Вы также можете добавить это внизу, потому что ^~модификатор соответствия имеет приоритет над регулярными выражениями. Смотрите документы .

Janghou
источник
0

Если у вас есть много конфигурационных файлов, и они уже содержат запрет на .htaccess, как

location ~ /\.ht { deny all; }

тогда вместо того, чтобы игнорировать все точечные файлы , вы можете просто добавить второе игнорирование для .git с

sed -i '/location ~ \/\\.ht { deny all; }/a \  location ~ \/\\.git { deny all; }' /etc/nginx/*
rubo77
источник