Назад | Перейти на главную страницу

Что противоположно [F] (т.е. запретить) в синтаксисе Apache .htaccess?

У меня есть правило, которое применяется к моей конфигурации Apache httpd.conf, которое выглядит так:

<DirectoryMatch "^/.*/\..*/">
    Order deny,allow    
    Deny from all
</DirectoryMatch>

Он блокирует доступ к скрытым каталогам, таким как .git, в нашем корневом веб-каталоге. Однако используемое нами веб-приложение (Magento) использует подкаталог .thumbs в каталоге мультимедиа, который должен быть общедоступным.

У меня есть правило, которое работает в .htaccess и явно запрещает доступ к скрытым каталогам:

RewriteRule (^\.|/\.) - [F]

Но я не могу найти позволяет версия указанной выше строки.

Контекст: причина, по которой мы не изменяем файл конфигурации Apache httpd.conf, заключается в том, что мы надеемся решить эту проблему с помощью только развертывания на основе кода и побочного шага к необходимости перезагружать конфигурацию веб-сервера в каждой среде жизненного цикла.

... не изменять Apache httpd.conf Файл конфигурации

tl; dr Добавьте следующее в .htaccess файл в каталоге, к которому вы хотите разрешить доступ, т.е. /media/.thumbs/.htaccess:

<Files "*">
    Order deny,allow    
    Allow from all
</Files>

Что противоположно [F] (т.е. запретить) ...

Кажется, вы задаете неправильный вопрос. Вам нужна противоположность Deny (mod_authz_host) - именно это нужно переопределить. (Однако существуют дополнительные сложности с порядком, в котором обрабатываются директивы, поэтому читайте дальше ...)

(В стороне: В F flag - это способ mod_rewrite для отправки ответа 403 Forbidden, на самом деле нет напротив этого, кроме как избежать отправки 403 Forbidden! Если запрос уже заблокирован с помощью mod_authz_host (т.е. Deny), то вы не можете "отменить" это с помощью mod_rewrite.)

Противоположно Deny является Allow в mod_authz_host. Например, в /media/.thumbs/.htaccess файл, вы можете сделать это:

Order deny,allow    
Allow from all

Однако это не отменяет <DirectoryMatch> контейнер в конфигурации сервера, потому что <DirectoryMatch> контейнеры обрабатываются после .htaccess. Если, однако, вы использовали (не регулярное выражение) <Directory> контейнер в конфигурации сервера вместо <DirectoryMatch>, то это переопределило бы конфигурацию сервера, потому что <Directory> контейнеры и .htaccess обрабатываются на то же время с участием .htaccess преобладающий <Directory> контейнеры.

ОДНАКО вы все равно можете разрешить доступ ко всем файлы в пределах /media/.thumbs подкаталог, обернув указанное выше Allow директивы в <Files> контейнер (в том же .htaccess файл). Например:

<Files "*">
    Order deny,allow    
    Allow from all
</Files>

Обернув эти директивы в <Files> контейнер вы меняете порядок обработки. Важно то, что <Files> контейнеры обрабатываются после <DirectoryMatch> контейнеров (несмотря на то, что он появился в .htaccess файл), поэтому теперь он отменяет <DirectoryMatch> контейнер в конфигурации сервера.

Из документы Apache 2.2 о том, как объединяются разделы:

Порядок объединения:

  1. <Directory> (кроме регулярных выражений) и .htaccess выполняется одновременно (с .htaccess, если разрешено, переопределение <Directory>)
  2. <DirectoryMatch><Directory ~>)
  3. <Files> и <FilesMatch> сделано одновременно
  4. <Location> и <LocationMatch> сделано одновременно

Вы можете попробовать это:

RewriteCond %{REQUEST_FILENAME} !"path to.thumbs sub-directory"
RewriteRule (^\.|/\.) - [F]

Чтобы заблокировать доступ ко всем папкам, кроме указанной папки.

1º Не используйте .htaccess

2º Добавьте регулярное выражение «отрицательный просмотр вперед» перед фактическим шаблоном, чтобы сделать исключение:

<DirectoryMatch ^/(?!\.thumbs).*/\..*/>
    Order deny,allow    
    Deny from all
</DirectoryMatch>