У меня есть простой файловый сервер (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:
sestatus
для проверки статуса и режима)ls -lZ
и или ls -lRZ
ls -ldZ
)ps -axZ | grep httpd
)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 может сгенерировать список содержимого каталога.