Apache - fancyindexing

Problem

Es soll erreicht werden, dass der Apache Webserver (hier auf Debian Buster) die Verzeichnisinhalte bestimmter Ordner/ aller Ordner anzeigt.
Hintergrund ist, dass die betreffenden Verzeichnisse eines Windows Dateiservers in das Verzeichnis des Apache gemountet sind (andere Anleitung). Anwenderinnen und Anwender der Windows-Umgebung haben Änderungsrecht für die Ordner auf dem Dateiserver. Diese Änderungen sollen dann immer auch im Intranet sichtbar sein.
Natürlich kann man die Dateien auch lediglich in das betreffende Verzeichnis des Apache kopieren und die Aktion sich mit dem Mounten sparen.
Eine automatische Synchronisation mit rsync (andere Anleitung) ist auch vorstellbar.

Durchführung Variante 1

In diesem Beispiel ist der Apache installiert und die gesamte Website läuft. Sie ist in html statisch erstellt. Die Dateien für die Website liegen aus der Sicht des Servers in diesem Ordner

/var/www/html

Darin befinden sind die weiteren Dateien und Verzeichnisse

Datei .htaccess
Datei index.html
Datei 404.html
Ordner css
Ordner de
Ordner icons
Ordner pics
Ordner scripts
Ordner videos

/etc/apache2/apache2.conf

Bearbeitet wird die Datei

/etc/apache2/apache2.conf

In diesem Beispiel wird angenomen, dass fancyindexing für alle Verzeichnisse genutzt werden soll. Darum wird fancyindexing ab der Ebene '/var/www/' aktiviert. Dazu erfolgen die Einträge unter 'Directory /var/www/'.
Der Platz für Dateinamen ist auf 80 Zeichen eingestellt.
IndexIgnore markiert, dass die Einträge danach/ bestimme Dateitypen nicht angezeigt werden sollen. Die Liste kann erweitert werden.

Diese Einstellung erlaubt dann das Durchsuchen aller Unterordner. Will man auf einfache Art verhindern, dass die Inhalte eines Ordners angezeigt werden, speichert man in dem betreffenden Ordner eine leere Datei mit dem Namen 'index.html'. Wenn dann jemand weiß, dass es den betreffenden Ordner gibt und dahin navigiert, wird eine leere Seite angezeigt.

Inhalt (Auszug)

<Directory />
	Options FollowSymLinks
	AllowOverride None
	Require all denied
</Directory>

<Directory /usr/share>
	AllowOverride None
	Require all granted
</Directory>

<Directory /var/www/>
	Options Indexes FollowSymLinks
	AllowOverride None
	Require all granted
IndexOptions FancyIndexing
IndexOptions NameWidth=80 DescriptionWidth=450 IconHeight=16 IconWidth=16 SuppressHTMLPreamble FoldersFirst ScanHTMLTitles
IndexIgnore cgi-bin error includes pics programme css *.php *.ico *.db
</Directory>

Änderungen wirksam werden lassen

# service apache2 reload

Durchführung Variante 2

Die Ansicht ist zwar aufgehübscht und es gibt mehr Platz für die Dateinamen. Jedoch ist das gewohnte Layout der Website weg, das über die CSS-Datei zugesteuert wird.

Damit das Layout angewendet wird, müssen zwei Dateien erstellt werden, eine für den Kopfbereich, die auch die CSS-Einstellungen enthält und eine für den Fußbereich, auf die werden die CSS-Einstellungen der ersten Datei dann übernommen.

Die Konfigurationsdatei wird dann leicht geändert. Der Pfad zu den Dateien für Kopf- und Fußzeile wird eingetragen.

Inhalt (Auszug)

<Directory />
	Options FollowSymLinks
	AllowOverride None
	Require all denied
</Directory>

<Directory /usr/share>
	AllowOverride None
	Require all granted
</Directory>

<Directory /var/www/>
	Options Indexes FollowSymLinks
	AllowOverride None
	Require all granted
IndexOptions FancyIndexing
IndexOptions NameWidth=80 DescriptionWidth=450 IconHeight=16 IconWidth=16 SuppressHTMLPreamble FoldersFirst ScanHTMLTitles
HeaderName ../de/headline-de-listing.html
ReadmeName ../de/footer-de-listing.html
IndexIgnore cgi-bin error includes pics programme css *.php *.ico *.db
</Directory>

Diese beiden Dateien müssen natürlich auf dem System vorhanden sein/ noch eingerichtet werden.

Für Ordner die in diesem Beispiel aus der Sicht des Servers auf dieser Ebene liegen, also zum Beispiel...

/var/www/download/
/var/www/weitere-dateien/

...ist kein zusätzlichen Eintrag in /etc/apache2/apache2.conf und sind keine gesonderten Kopf- und Fußzeilendateien erforderlich.

Leider ist es so, dass es nicht für Unterordner funktioniert. Also...

/var/www/download/unterordner
/var/www/weitere-dateien/noch-ein-ordner

...werden zwar nach den Einstellungen in /etc/apache2/apache2.conf mit mehr Platz angezeigt. Damit für diese Unterordner das aufgehübschte Layout genutzt wird, muss in '/etc/apache2/apache2.conf' der komplette Pfad aus Serversicht angegeben werden. Weiter müssen die Kopf- und Fußzeilendatei mit in dem Ordner vorhanden sein. Das klappt jedoch lediglich bis zu dieser Ebene. Bei tiefer liegenden Verzeichnissen werden die Pfadangaben ignoriert.
Die Pfadangabe ist also so zu ändern, dass die in eine andere Ebene verweist, in der Kopf- und Fußzeilendatei liegen, war nicht erfolgreich.

Also: Kopf- und Fußzeilendatei mit kopieren und in '/etc/apache2/apache2.conf' Pfad so ändern, dass auf eben diesen Ordner verwiesen wird. Wenn man mag, kann man den Namen gleich lassen und jeweils eine individuelle Überschrift in den Quellcode eintragen.

Inhalt (Auszug) mit Unterordnern

<Directory />
	Options FollowSymLinks
	AllowOverride None
	Require all denied
</Directory>

<Directory /usr/share>
	AllowOverride None
	Require all granted
</Directory>

<Directory /var/www/>
	Options Indexes FollowSymLinks
	AllowOverride None
	Require all granted
IndexOptions FancyIndexing
IndexOptions NameWidth=80 DescriptionWidth=450 IconHeight=16 IconWidth=16 SuppressHTMLPreamble FoldersFirst ScanHTMLTitles
HeaderName ../de/headline-de-listing.html
ReadmeName ../de/footer-de-listing.html
IndexIgnore cgi-bin error includes pics programme css *.php *.ico *.db *.htm *.html
</Directory>

<Directory /var/www/download/unterordner/>
	Options Indexes FollowSymLinks
	AllowOverride None
	Require all granted
IndexOptions FancyIndexing
IndexOptions NameWidth=80 DescriptionWidth=450 IconHeight=16 IconWidth=16 SuppressHTMLPreamble FoldersFirst ScanHTMLTitles
# Kopf- und Fusszeilendatei mit in den Ordner kopieren.
# Also keine weitere Pfadangabe zu diesen Dateien angeben.
# Die sind ja in dem Ordner bei den Dateien, die gelistet werden.
HeaderName headline-de-listing.html
ReadmeName footer-de-listing.html
IndexIgnore cgi-bin error includes pics programme css *.php *.ico *.db *.htm *.html
</Directory>

html-Dateien ausblenden

Es ist ratsam, die html-Dateien im Ordnerlisting nicht anzeigen zu lassen, darum: '*.html'.

In dem speziellen Fall ist es so, dass ein Windowsordner in Linux gemountet ist, der weitere Unterordner enthält (andere Anleitung, also Linux mountet freigegebene Windows-Ordner und zeigt deren Inhalte nun an). Da werden nun leider die html-Dateien mit dem Windows Dateiexplorer im Windows-Verzeichnis anzeigt, wenn User den Weg mit dem Windows-Dateiexplorer klicken.
Das fange ich so ab, dass die Kopf- und Fußzeilendatei im Windows-Verzeichnis über das Kontextmenü als versteckte Datei markiert sind.

Änderungen wirksam werden lassen

# service apache2 reload

Datei für Kopfzeile

<style>
[Hier hinein die Inhalte des HTML-Head und der CSS-Datei kopieren.]
</style>
[Hier den HTML-Quelltext einfügen, der über den gelisteten Dateien 
angezeigt werden soll, eventuell auch eine individuelle Überschrift 
une ein Hinweistest, wie alles funktioniert.]

Datei für Fußzeile

[Hier den HTML-Quelltext einfügen.]
[Dieses Beispiel setzt voraus, dass es eine entsprechende
Definition in der CSS-Datei und den Anker 'top' gibt.]
<div class="footer">
  <a title="Zum Seitenanfang / top of page" href="#top">↑↑↑</a> | Domainname |  <a title="Zum Seitenanfang / top of page" href="#top">↑↑↑</a>
</div>

Wenn die Verzeichnisinhalte angezeigt werden, kommt man über einen Klick auf 'parent directory' immer eine Ebene höher und am Ende dann wieder zur 'index.html' im Hauptverzeichnis. Dann wird die 'Home'-Page angezeigt.

Nachtrag

In dem obigen Beispiel werden die Icons genutzt, die der Apache mitbringt. Dabei zu bleiben, hat den Vorteil, dass man an dieser Stelle nichts ändern muss, wenn die Website mal umziehen sollte.

In anderen Anleitungen habe ich gelesen, dass die Einstellungen über eine .htaccess-Datei vorgenommen werden. Das hat bei mir mit Debian nicht geklappt.

Der Vollständigkeit halber gebe ich hier den Inhalt wieder. Dies hier hat unter Windows 10 und xampp funktioniert. Hier sind auch Pfade zu Icons hinterlegt, die gesondert beschafft werden müssen.

# Verzeichnisinhalte anzeigen
Options +Indexes
IndexOptions FancyIndexing
IndexOptions NameWidth=80 DescriptionWidth=450 IconHeight=16 IconWidth=16 SuppressHTMLPreamble FoldersFirst ScanHTMLTitles
HeaderName ../de/headline-de-listing.html
ReadmeName ../de/footer-de-listing.html
AddIcon ../icons/16px/avi.png *.avi
AddIcon ../icons/16px/bmp.png *.bmp
AddIcon ../icons/16px/csv.png *.csv
AddIcon ../icons/16px/_page.png *.doc *dot
AddIcon ../icons/16px/html.png *.html *.shtml
AddIcon ../icons/16px/jpg.png *.jpg *.jpeg
AddIcon ../icons/16px/odt.png *.odt
AddIcon ../icons/16px/ott.png *.ott
AddIcon ../icons/16px/pdf.png *.pdf
AddIcon ../icons/16px/png.png *.png
AddIcon ../icons/16px/rtf.png *.rtf
AddIcon ../icons/16px/tiff.png *.tif
AddIcon ../icons/16px/txt.png *.txt
AddIcon ../icons/16px/zip.png *.zip
IndexIgnore cgi-bin error includes pics programme css *.php *.ico *.db
# Fehler 404-Meldung
ErrorDocument 404 /404.html

Insgesamt dauert es schon einen Moment, die Strukturen einzurichten und die Dateien bereit zu stellen. Dann hat man eine Struktur, die geänderte Inhalte dynamisch anzeigt, wenn man die Version mit den gemounteten Windowsordnern nutzt. Da spielt es dann (beinahe) keine Rolle, wo im Netzwerk die Dateien gespeichert sind. Hauptsache, der Ordner kann gemountet werden. Verteilt gespeicherte Inhalte lassen sich so 'nahe beieinander' darstellen.

Quellen:
http://michael-puff.de/Programmierung/Artikel/FancyIndexing.shtml
https://httpd.apache.org/docs/2.4/mod/mod_autoindex.html