Linux

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

  • January 5, 2020

我有一個簡單的文件伺服器(centos 7 上的 apache 2.4),其結構如下: /index.html - 一個確保此處沒有目錄列表的頁面 /upload - 用於上傳的 php 腳本 /storage - 文件的基本目錄 /storage/ upload - 由 php 上傳的文件 /storage/public - 不受密碼保護的文件

我無法使目錄列表工作。例如在 /storage/public 我看到 /index.html 頁面。/storage/public 中沒有 index.html。如果我刪除此頁面,我會在 /page 中看到預設的 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。

問題是我更改了全域設置

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,因為我認為他更接近我的問題。

列出的問題給人的印像是所涉及的文件夾中的權限存在問題。

有幾種權限需要檢查:

  • 處理 httpd 的使用者/組:

    • 採用ps axo pid,user,group,comm
  • 文件系統權限:

    • 使用者、組、讀、寫、執行標誌(使用ls -l和或ls -lRls -ld
  • SELinux 權限:

    • 如果它處於活動狀態,這可能在 CentOS 上(用於sestatus驗證狀態和模式)
    • 文件權限上下文(使用ls -lZand or ls -lRZ ls -ldZ
    • httpd SELinux 上下文(使用ps -axZ | grep httpd
    • SELinux 布爾值(使用getsebool -a | grep httpd
    • 在嘗試生成目錄列表時檢查審計日誌(使用tail -f /var/log/audit/audit.log

引用自:https://serverfault.com/questions/996948