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

Индексирование каталогов Apache не работает в подкаталоге

У меня есть простой файловый сервер (apache 2.4 на centos 7) со следующей структурой: /index.html - страница, чтобы убедиться, что здесь нет списка каталогов / upload - скрипты php для загрузки / хранения - базовый каталог для файлов / хранилища / upload - файлы, загруженные php / storage / public - файлы, не защищенные паролем

Я не могу заставить работать список каталогов. Например, в / storage / public я вижу страницу /index.html. В / storage / public нет index.html. Если я удалю эту страницу, я увижу страницу apache "testing 123" по умолчанию в / page, а список каталогов работает в / storage / public (и во всех других местах, где есть + Index). Почему /index.html отображается в / storage / public /

<IfModule mod_ssl.c>
<VirtualHost *:443>
  DocumentRoot "/home/webroot/www"
  ServerName subdomain.example.com

  ErrorLog "/home/rootdir/log/subdomain.error.log"
  CustomLog "/home/rootdir/log/subdomain.access.log" common

  SuexecUserGroup user apache

#Set caching on image files for 11 months
<filesMatch "\.(ico|gif|jpg|png|js|css)$">
  #ExpiresActive On
  #ExpiresDefault "access plus 11 month"
  Header append Cache-Control "public"
</filesMatch>

  <Directory "/home/webroot/www" >
    AllowOverride None
    Options -ExecCGI -Indexes +Includes +SymLinksIfOwnerMatch +MultiViews

    Require all granted
  </Directory>
  <Directory "/home/webroot/www/storage/upload" >
    AllowOverride None
    AuthType Basic
    AuthName "Restricted Content"
    AuthUserFile /home/rootdir/.htpasswd
    Require valid-user
    <FilesMatch "\.php$">
      SetHandler "proxy:unix:/usr/local/php73/var/run/php-fpm.sock|fcgi://localhost/"
    </FilesMatch>

  </Directory>
  <Directory "/home/webroot/www/storage/" >
    AllowOverride None
    Options +Indexes +SymLinksIfOwnerMatch +MultiViews

    AuthType Basic
    AuthName "Restricted Content"
    AuthUserFile /home/rootdir/.htpasswd
    Require valid-user
    #Require all granted
    RemoveType .php

    Order allow,deny
    Allow from all
  </Directory>

  <Directory "/home/webroot/www/storage/public" >
    Options +Indexes +SymLinksIfOwnerMatch +MultiViews
    AuthType None
    Require all granted
    Satisfy Any
  </Directory>

  <Directory "/home/webroot/www/.well-known" >
    AuthType None
    Require all granted
    Satisfy Any
    Allow from all
  </Directory>

  <Directory "/home/webroot/www/storage/upload" >
    AuthType Basic
    AuthName "Restricted Content"
    AuthUserFile /home/rootdir/.htpasswd
    Require valid-user
  </Directory>

  <IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/text text/html text/plain text/xml text/css text/javascript application/x-javascript application/javascript
  </IfModule>


Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/subdomain.example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/subdomain.example.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/subdomain.example.com/chain.pem

</VirtualHost>
</IfModule>

Обновить:

# apachectl -M|grep autoindex
 autoindex_module (shared)

Другой vhost имеет следующую проблему: в корневой папке vhost, который я использую, есть index.html.

Options -ExecCGI -Indexes

Итак, у меня есть подкаталог / test, и я помещаю еще один index.html, но когда я открываю / test / в моем браузере, я вижу /index.html вместо /test/index.html

В этом хосте вообще нет php.

Проблема заключалась в том, что я изменил глобальную настройку с:

DirectoryIndex index.php index.html

к:

DirectoryIndex /index.php index.php /index.html index.html

в попытке решить другую проблему - Я использую сервер php fpm с директивой ProxyPassMatch следующим образом:

ProxyPassMatch ^/(.*.php(/.*)?)$ unix:/path/to/php-fpm.sock|fcgi://localhost/home/userdir/www/$1

Как я читал на apache.org. Проблема в том, что при использовании ProxyPassMatch и отсутствии index.php apache не загружает index.html (другая похожая проблема)

Восстановление глобальной директивы на:

DirectoryIndex index.php index.html

исправил проблему, но у меня все еще есть проблема, когда ProxyPassMatch в vhost apache не возвращается к index.html, когда index.php отсутствует.

Теперь мне нужно наградить кого-нибудь. Если я не могу разделить его между двумя ответами, я награжу его little_dog, потому что я думаю, что он немного ближе к моей проблеме.

Перечисленная проблема создает впечатление, что есть проблемы с разрешениями в задействованных папках.

Есть несколько видов разрешений, которые нужно проверить:

  • обработать пользователя / группу httpd:

    • использовать ps axo pid,user,group,comm
  • разрешения файловой системы:

    • пользователи, группы, флаги чтения, записи, выполнения (используйте ls -l и или ls -lR, ls -ld)
  • Разрешения SELinux:

    • если он активен, что вероятно на CentOS (используйте sestatus для проверки статуса и режима)
    • Контексты прав доступа к файлам (используйте ls -lZ и или ls -lRZ ls -ldZ)
    • httpd SELinux context (используйте ps -axZ | grep httpd)
    • Логические значения SELinux (используйте getsebool -a | grep httpd)
    • проверять журналы аудита при попытке создать список каталогов (используйте tail -f /var/log/audit/audit.log)

проверьте, включен ли у вас модуль автоиндекса: apachectl -M должно быть:

Loaded Modules:
...
autoindex_module (shared)
...

если его нет, вам необходимо включить его, в Centos обратитесь к: https://unix.stackexchange.com/questions/258854/disable-and-enable-modules-in-apache-centos7

обновление # 1

для работы со списком каталогов у вас не может быть index.html в вашем каталоге, проверьте: https://cwiki.apache.org/confluence/display/httpd/DirectoryListings

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