Apache 目录索引在子目录中不起作用

Apache 目录索引在子目录中不起作用

我有一个简单的文件服务器(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

答案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 可以生成目录内容的列表。

相关内容