# Zugriffsschutz fuer den gesamten Web-Root.
#
# restricted/.htaccess schuetzt nur ein Verzeichnis. Die Regeln hier greifen
# fuer den ganzen Baum und fangen ab, was ausserhalb davon liegt - allen voran
# das Git-Verzeichnis, ueber das sich sonst der komplette Quellcode samt
# Historie herunterladen laesst.

# --- Punkt-Verzeichnisse und -Dateien: .git, .claude, .gitignore ---
# .well-known bleibt frei, das brauchen Zertifikatsausstellungen.
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule (^|/)\.(?!well-known/) - [F,L]
</IfModule>
<IfModule !mod_rewrite.c>
    <IfModule mod_alias.c>
        RedirectMatch 404 (^|/)\.(?!well-known/)
    </IfModule>
</IfModule>

# --- Dateitypen, die der Browser nie anfordert ---
# Konfiguration, Python-Skripte, Datenhaltung, Vorlagen und Archive. Die
# Seite laedt ausschliesslich .php, .css, .js, Bilder und Schriften.
<FilesMatch "\.(ini|py|pyc|json|md|log|bak|example|sql|sqlite|db|tgz|gz|zip|yml|yaml|pack|idx)$">
    <IfModule mod_authz_core.c>
        Require all denied
    </IfModule>
    <IfModule !mod_authz_core.c>
        Order allow,deny
        Deny from all
    </IfModule>
</FilesMatch>

# --- Notbremse ohne Modulabhaengigkeit ---
# Die Punkt-Regel oben braucht mod_rewrite oder mod_alias. Fehlen beide, faellt
# sie ersatzlos und ohne Fehlermeldung aus - und .git waere wieder abrufbar.
# FilesMatch gehoert zum Kern und ist immer verfuegbar. Es passt allerdings nur
# auf Dateinamen, nicht auf Pfadbestandteile, kann .git also nicht vollstaendig
# sperren. Es nimmt den ueblichen Auslesewerkzeugen aber den Einstieg: ohne
# HEAD, config, index und packed-refs laesst sich das Verzeichnis nicht
# aufrollen, weil die Objektdateien hexadezimale Namen tragen.
#
# Belastbar waere nur, .git und restricted/ ausserhalb des Dokumentenbaums zu
# legen. Diese Regeln sind Schadensbegrenzung, keine Grenze.
<FilesMatch "^(HEAD|ORIG_HEAD|FETCH_HEAD|MERGE_HEAD|COMMIT_EDITMSG|config|index|packed-refs|description|shallow|gitattributes|gitignore|gitmodules)$">
    <IfModule mod_authz_core.c>
        Require all denied
    </IfModule>
    <IfModule !mod_authz_core.c>
        Order allow,deny
        Deny from all
    </IfModule>
</FilesMatch>
