# Trajektur — Server-Konfiguration für lima-city (Apache)
# In dasselbe Verzeichnis wie index.html legen.

# ---------------------------------------------------------------
# HTTPS erzwingen. Erst aktivieren, wenn das Zertifikat läuft,
# sonst ist die Seite nicht erreichbar.
# ---------------------------------------------------------------
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTPS} !=on
  RewriteCond %{HTTP:X-Forwarded-Proto} !https
  RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

  # www auf die Hauptdomain vereinheitlichen (eine kanonische Adresse)
  RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
  RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
</IfModule>

# ---------------------------------------------------------------
# Sicherheitskopfzeilen
# ---------------------------------------------------------------
<IfModule mod_headers.c>

  # Content-Security-Policy: erlaubt ausschließlich eigene Ressourcen.
  # Die beiden Hashes decken den eingebetteten Style- und Script-Block ab.
  # Ändert sich auch nur ein Zeichen darin, muss der Hash neu berechnet werden
  # (Anleitung siehe SICHERHEIT.md), sonst blockiert der Browser den Block.
  Header always set Content-Security-Policy "default-src 'none'; \
base-uri 'none'; \
form-action 'self'; \
frame-ancestors 'none'; \
img-src 'self' data:; \
font-src 'self'; \
connect-src 'self'; \
script-src 'sha256-I9NZlUxYbm9lg4Zu1xJE7EnSfxdaSW9OPUE0EkmXztw='; \
style-src 'sha256-bibR4V6ruCK1ApDn7/RMhlP9Eb6s1eH/Nar0z+StIn8='; \
upgrade-insecure-requests"

  # Nur setzen, wenn HTTPS dauerhaft läuft. Zwei Jahre Bindung.
  Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"

  # Verhindert, dass der Browser Dateitypen errät
  Header always set X-Content-Type-Options "nosniff"

  # Keine Einbettung in fremde Rahmen (Clickjacking)
  Header always set X-Frame-Options "DENY"

  # Beim Verlassen der Seite nur die Domain übertragen, nicht den Pfad
  Header always set Referrer-Policy "strict-origin-when-cross-origin"

  # Browserfunktionen abschalten, die diese Seite nicht braucht
  Header always set Permissions-Policy "camera=(), microphone=(), geolocation=(), \
payment=(), usb=(), magnetometer=(), gyroscope=(), interest-cohort=()"

  Header always set Cross-Origin-Opener-Policy "same-origin"
  Header always set Cross-Origin-Resource-Policy "same-origin"

  # Serverkennung reduzieren
  # Hoster-Cookie um das Secure-Flag ergaenzen (lima-city setzt es ohne)
  Header always edit Set-Cookie ^(.*)$ "$1; Secure"

  Header unset X-Powered-By
  Header always unset Server
</IfModule>

# ---------------------------------------------------------------
# Verzeichnisse nicht auflisten
# ---------------------------------------------------------------
Options -Indexes

# ---------------------------------------------------------------
# Interne Dateien sperren, falls sie versehentlich hochgeladen werden
# ---------------------------------------------------------------
# Zugangsdaten und interne Dateien niemals ausliefern
<FilesMatch "^(zugang|smtp)\.php$">
  Require all denied
</FilesMatch>
<FilesMatch "\.(md|json|log|bak|sql|zip|py|ini|yml|yaml)$">
  Require all denied
</FilesMatch>
<FilesMatch "^\.">
  Require all denied
</FilesMatch>

# ---------------------------------------------------------------
# Zwischenspeicher: Schriften und Bilder lange, HTML gar nicht
# ---------------------------------------------------------------
<IfModule mod_expires.c>
  ExpiresActive On
  ExpiresByType font/woff2  "access plus 1 year"
  ExpiresByType image/png   "access plus 1 month"
  ExpiresByType image/svg+xml "access plus 1 month"
  ExpiresByType text/html   "access plus 0 seconds"
</IfModule>

<IfModule mod_deflate.c>
  AddOutputFilterByType DEFLATE text/html text/css application/javascript image/svg+xml
</IfModule>

# Zeichensatz festlegen
AddDefaultCharset UTF-8
