我有一个简单的文件服务器(centos 7 上的 apache 2.4),其结构如下:/index.html - 一个页面,确保此处没有目录列表/upload - 用于上传的 php 脚本/storage - 文件的基本目录/storage/upload - 由 php 上传的文件/storage/public - 未受密码保护的文件
我无法使目录列表工作。例如,在 /storage/public 中,我看到 /index.html 页面。在 /storage/public 中没有 index.html。如果我删除此页面,我会在 / 页面中看到默认的 apache“testing 123”页面,并且目录列表在 /storage/public(以及所有其他具有 +Indexes 的地方)中工作。为什么 /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)
另一个虚拟主机存在以下问题:我使用的虚拟主机的根文件夹中有 index.html
Options -ExecCGI -Indexes
所以我有一个子目录 /test 并且我放了另一个 index.html,但是当我在浏览器中打开 /test/ 时,我看到的是 /index.html 而不是 /test/index.html
这个虚拟主机中根本没有 php。
答案1
问题是我已经将全局设置从:
DirectoryIndex index.php index.html
到:
DirectoryIndex /index.php index.php /index.html index.html
为了解决另一个问题- 我使用带有 ProxyPassMatch 指令的 php fpm 服务器,如下所示:
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
解决了该问题,但是当 index.php 丢失时,vhost apache 中的 ProxyPassMatch 不会回退到 index.html 时仍然存在问题。
现在我必须将赏金授予某人。如果我不能在两个答案之间分配它,我会将它授予 little_dog,因为我认为他更接近我的问题。
答案2
列出的问题给人的印象是所涉及的文件夹的权限存在问题。
需要检查以下几种权限:
处理httpd的用户/组:
- 使用
ps axo pid,user,group,comm
- 使用
文件系统权限:
- 用户、组、读取、写入、执行标志(使用
ls -l
与 或ls -lR
,ls -ld
)
- 用户、组、读取、写入、执行标志(使用
SELinux 权限:
- 它是否处于活动状态(在 CentOS 上可能如此)(用于
sestatus
验证状态和模式) - 文件权限上下文(使用
ls -lZ
与 或ls -lRZ
ls -ldZ
) - httpd SELinux 上下文(使用
ps -axZ | grep httpd
) - SELinux 布尔值(使用
getsebool -a | grep httpd
) - 在尝试生成目录列表时检查审计日志(使用
tail -f /var/log/audit/audit.log
)
- 它是否处于活动状态(在 CentOS 上可能如此)(用于
答案3
检查您是否已启用自动索引模块,方法为: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 可以生成目录内容的列表。