Introduction
The default Directory Listing in Apache is pretty much awful, but I had a need to present some files through a web browser. Rather than produce something with PHP alone I decided to enhance the Apache FancyIndexing option as it is designed for exactly this purpose.
I came across a nice PHP enhancement (update to include link and credit) to the FancyIndexing that added guided navigation to the directory listing, as well as improve the default font and general styling thanks to effective use of CSS.
Instructions
1. Edit httpd.conf and add or modify the following
AccessFileName .htaccess
<Files ~ “^\.ht”>
Order allow,deny
Deny from all
</Files>
<Directory /your/directory>
AllowOverride all
</Directory>
2. In the directory you want the listing of add the following .htaccess file
Options +Indexes +FollowSymlinks IndexOptions FancyIndexing HTMLTable FoldersFirst SuppressRules SuppressDescription SuppressHTMLPreamble Charset=UTF-8 # # AddIcon* directives tell the server which icon to show for different# files or filename extensions. These are only displayed for # FancyIndexed directories. # AddIcon /autoindex/icons/application.png .exe .app AddIcon /autoindex/icons/type_binary.png .bin .hqx .uu AddIcon /autoindex/icons/type_box.png .tar .tgz .tbz .tbz2 bundle .rar AddIcon /autoindex/icons/type_code.png .html .htm .htx .htmls .dhtml .phtml .shtml .inc .ssi .c .cc .css .h .rb .js .rb .pl .py .sh .shar .csh .ksh .tcl .as AddIcon /autoindex/icons/type_database.png .db .sqlite .dat AddIcon /autoindex/icons/type_disc.png .iso .image AddIcon /autoindex/icons/type_document.png .ttf AddIcon /autoindex/icons/type_excel.png .xlsx .xls .xlm .xlt .xla .xlb .xld .xlk .xll .xlv .xlw AddIcon /autoindex/icons/type_flash.png .flv AddIcon /autoindex/icons/type_illustrator.png .ai .eps .epsf .epsi AddIcon /autoindex/icons/type_pdf.png .pdf AddIcon /autoindex/icons/type_php.png .php .phps .php5 .php3 .php4 .phtm AddIcon /autoindex/icons/type_photoshop.png .psd AddIcon /autoindex/icons/monitor.png .ps AddIcon /autoindex/icons/type_powerpoint.png .ppt .pptx .ppz .pot .pwz .ppa .pps .pow AddIcon /autoindex/icons/type_swf.png .swf AddIcon /autoindex/icons/type_text.png .tex .dvi AddIcon /autoindex/icons/type_vcf.png .vcf .vcard AddIcon /autoindex/icons/type_word.png .doc .docx AddIcon /autoindex/icons/type_zip.png .Z .z .tgz .gz .zip AddIcon /autoindex/icons/globe.png .wrl .wrl.gz .vrm .vrml .iv AddIcon /autoindex/icons/vector.png .plot AddIconByType (TXT,/autoindex/icons/type_text.png) text/* AddIconByType (IMG,/autoindex/icons/type_image.png) image/* AddIconByType (SND,/autoindex/icons/type_audio.png) audio/* AddIconByType (VID,/autoindex/icons/type_video.png) video/* AddIconByEncoding (CMP,/autoindex/icons/type_box.png) x-compress x-gzip AddIcon /autoindex/icons/back.png .. AddIcon /autoindex/icons/information.png README INSTALL AddIcon /autoindex/icons/type_folder.png ^^DIRECTORY^^ AddIcon /autoindex/icons/blank.png ^^BLANKICON^^ # # DefaultIcon is which icon to show for files which do not have an icon# explicitly set. # DefaultIcon /autoindex/icons/type_document.png # # Enables PHP to be used in our header file # AddHandler application/x-httpd-php .php AddType text/html .php .html # # ReadmeName is the name of the README file the server will look for by # default, and append to directory listings. # # HeaderName is the name of a file which should be prepended to # directory indexes. ReadmeName /autoindex/footer.php HeaderName /autoindex/header.php # # IndexIgnore is a set of filenames which directory indexing should ignore # and not include in the listing. Shell-style wildcarding is permitted. # IndexIgnore autoindex .??* *~ *# RCS CVS *,v *,t *.dat .. IndexOptions +NameWidth=42 AddDescription "PNG images" *.png
Warning for PHP 5.3 and higher
I originally had this running with PHP 5.1 and it was working great. I upgraded to PHP 5.3.3 (latest at the time of writing) and it refused to parse the PHP, despite the PHP working if I called the Header and Footer PHP pages directly.
It turned out to be the directive XHTML in the IndexOptions line. Remove this and it will parse. XHTML says:
TheXHTML keyword forces mod_autoindex to emit XHTML 1.0 code instead of HTML 3.2.
Whereas the same pages says that a Header/Readme filename “must resolve to a document with a major content type of text/* (e.g., text/html, text/plain, etc.).”