# Pagetal CMS – Zugriffsschutz: interne Dateien und Verzeichnisse werden
# nie ausgeliefert. Die Sperre steht VOR den Umschreibe-Regeln und besteht
# aus zwei unabhängigen Schichten: Abschnitt 1 per mod_rewrite, Abschnitt 2
# per mod_alias (RedirectMatch). Beide stehen in <IfModule>-Blöcken, gelten
# unverändert in Apache 2.2 und 2.4 und brauchen nur "AllowOverride
# FileInfo" (wie die Umschreibe-Regeln weiter unten). Bewusst ohne
# "Require"/"Order" und ohne "Options": diese Direktiven lösen bei
# eingeschränktem AllowOverride einen 500-Fehler aus.

# Abschnitt 1: Sperre per mod_rewrite
<IfModule mod_rewrite.c>
  RewriteEngine On

  # Punkt-Dateien und Punkt-Ordner (.git, .htaccess, .user.ini, .debug,
  # .gitignore, .DS_Store), ausgenommen /.well-known/.
  RewriteRule (^|/)\.(?!well-known(/|$)) - [F,L]

  # Dateitypen, die nie ausgeliefert werden: Datenbank-Exporte, Dokumentation,
  # Protokolle, Sicherungskopien, Shell-Skripte, Konfigurationsdateien,
  # Vorlagen, SQLite-Dateien; ausserdem das Änderungsprotokoll und der
  # Router des Entwicklungsservers. Andere .txt-Dateien (z.B. robots.txt)
  # bleiben erreichbar.
  RewriteRule \.(sql|md|log|bak|sh|ini|dist|sqlite|sqlite3|mmdb)$ - [F,L,NC]
  RewriteRule \.sql\.gz$ - [F,L,NC]
  RewriteRule (^|/)AENDERUNGEN[^/]*\.txt$ - [F,L,NC]
  RewriteRule ^router\.php$ - [F,L,NC]

  # Interne Verzeichnisse. Nur wenn der Pfad physisch existiert: gleichnamige
  # Seiten-Adressen ohne Verzeichnis laufen weiter über die Regeln unten.
  # Nicht gesperrt: admin/, assets/, uploads/ und install/ (der Installer
  # ruft install/actions per HTTP auf; install/schema.sql sperrt die
  # Dateityp-Regel oben).
  RewriteCond %{REQUEST_FILENAME} -f [OR]
  RewriteCond %{REQUEST_FILENAME} -d
  RewriteRule ^(backups|config|includes|partials|tests|cache|node_modules)(/|$) - [F,L,NC]
</IfModule>

# Abschnitt 2: Sperre per mod_alias (zweite Schicht, unabhängig von mod_rewrite)
<IfModule mod_alias.c>
  RedirectMatch 403 (?i)/\.(?!well-known(/|$))
  RedirectMatch 403 (?i)\.(sql|md|log|bak|sh|ini|dist|sqlite|sqlite3|mmdb)$
  RedirectMatch 403 (?i)\.sql\.gz$
  RedirectMatch 403 (?i)/AENDERUNGEN[^/]*\.txt$
  RedirectMatch 403 (?i)/router\.php$
</IfModule>

# Pagetal CMS – die Sitemap (sitemap.xml, bei sehr vielen Adressen zusätzlich
# sitemap-1.xml, sitemap-2.xml ...) wird dynamisch von sitemap.php erzeugt
# (Backend: SEO → Sitemap). Eine echte Datei gleichen Namens im
# Hauptverzeichnis hat Vorrang. Nur mod_rewrite, im Stil der übrigen Regeln.
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^sitemap\.xml$ sitemap.php [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^sitemap-([0-9]+)\.xml$ sitemap.php?teil=$1 [L,QSA]
</IfModule>

# Pagetal CMS – die robots.txt wird, sobald der Generator eingeschaltet ist
# (Backend: SEO → robots.txt), dynamisch von robots.php erzeugt; solange er aus
# ist, antwortet die Adresse mit 404. Eine echte Datei robots.txt im
# Hauptverzeichnis hat Vorrang. Nur mod_rewrite, im Stil der übrigen Regeln.
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^robots\.txt$ robots.php [L]
</IfModule>

# Pagetal CMS – Verifizierungsdateien der Suchmaschinen und Schlüsseldatei von IndexNow (ab v1.19.211,
# Backend: SEO -> Webmaster-Tools). Die Namen googleXXXX.html, BingSiteAuth.xml, yandex_XXXX.html und
# <Schlüssel>.txt werden, sofern keine echte Datei gleichen Namens im Hauptverzeichnis liegt, an
# verifizierung.php übergeben. Dort wird nur ausgeliefert, was in der Datenbank gespeichert ist; jeder andere
# Name verhält sich wie bisher (Weiterleitungen, 404-Protokoll, 404-Seite). Nur mod_rewrite, im Stil der
# übrigen Regeln. Hinweis: Das ZIP-Update ersetzt diese Datei. Wurde sie von Hand angepasst, diesen Block
# nach dem Update wieder einfügen.
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^(google[A-Za-z0-9]{8,64}\.html|BingSiteAuth\.xml|yandex_[A-Za-z0-9]{8,64}\.html|[A-Za-z0-9-]{8,128}\.txt)$ verifizierung.php [L]
</IfModule>

# Pagetal CMS – optionale URL-Umschreibung für "einfache Seiten" und für
# Sammlungstypen-Einträge (siehe includes/sammlungen.php). Wandelt z.B.
# /ueber-uns in index.php?seite=ueber-uns bzw. /beitraege/mein-titel in
# index.php?sammlung=beitraege&sammlung_eintrag=mein-titel um, damit
# Besucher und Suchmaschinen kurze, hübsche URLs sehen. Rein optional:
# falls mod_rewrite auf dem Hosting nicht verfügbar ist, funktioniert
# die Website trotzdem über die entsprechende ?...-Variante.
<IfModule mod_rewrite.c>
  RewriteEngine On

  # Bestehende Dateien/Verzeichnisse (z.B. /admin/, /assets/, /install.php)
  # unverändert durchlassen. Eine RewriteCond gilt in Apache und LiteSpeed nur
  # für die direkt folgende RewriteRule: Darum stehen die zwei Bedingungen vor
  # JEDER der drei Regeln (ab v1.19.213; vorher galten sie nur für die erste,
  # und /admin/, /assets/ und /uploads/ landeten auf der 404-Seite).

  # Dreiteilige Kategorie-Archiv-URLs (z.B. /beitraege/kategorie/zubehoer/),
  # mehrstufige Kategorie-Archivseiten, siehe
  # partials/sammlung-taxonomie-archiv.php - MUSS vor der
  # zweiteiligen Regel unten stehen, sonst würde diese zuerst (fälschlich)
  # greifen.
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^([a-z0-9-]+)/([a-z0-9-]+)/([a-z0-9-]+)/?$ index.php?sammlung=$1&sammlung_taxonomie=$2&sammlung_begriff=$3 [L,QSA]

  # Zweiteilige Sammlungs-Detail-URLs (z.B. /beitraege/mein-titel/) - MUSS
  # vor der einteiligen Regel unten stehen, sonst würde diese zuerst
  # (fälschlich) greifen.
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^([a-z0-9-]+)/([a-z0-9-]+)/?$ index.php?sammlung=$1&sammlung_eintrag=$2 [L,QSA]

  # Einteilige Slugs umschreiben (a-z, 0-9, Bindestrich) - normale Seiten
  # UND Sammlungs-Archiv-URLs (z.B. /beitraege/) laufen beide hierüber,
  # siehe die Weiche in index.php.
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^([a-z0-9-]+)/?$ index.php?seite=$1 [L,QSA]
</IfModule>

# Pagetal CMS – Weiterleitungen und 404-Protokoll (ab v1.19.203, Backend: SEO -> Weiterleitungen).
# Adressen, die keine echte Datei und kein echter Ordner sind und von keiner der Regeln oben erfasst werden
# (zum Beispiel /alt/seite.html oder /a/b/c/d), landen in seiten-404.php: Dort greift eine passende
# Weiterleitung, sonst wird die Adresse im 404-Protokoll gezählt und die normale 404-Seite mit dem
# Statuscode 404 ausgeliefert. Nicht erfasst werden admin/, assets/, uploads/, install/, .well-known/ und
# Adressen der Form /datei.php/zusatz. Nur mod_rewrite, im Stil der übrigen Regeln.
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_URI} !\.php/
  RewriteRule !^(admin|assets|uploads|install|\.well-known)(/|$) seiten-404.php [L]
</IfModule>

# Erhöhtes Upload-Limit für Container-Hintergrundvideos (Page-Builder,
# Baustein "Container" -> Tab "Stil" -> Hintergrundtyp "Video" -> Quelle
# "Datei", siehe admin/actions/page-builder-container-medien.php). Der
# PHP-Standard (meist 2M/8M) reicht für Videos bis 40 MB nicht aus.
# "php_value" wirkt NUR, wenn PHP als Apache-Modul (mod_php) läuft UND
# "AllowOverride All"/"AllowOverride Options=... FileInfo" für dieses
# Verzeichnis erlaubt ist – auf vielen Shared-Hostings läuft PHP
# stattdessen über PHP-FPM/CGI, dort greift stattdessen die begleitende
# .user.ini (siehe dort). Läuft PHP über mod_php UND ist AllowOverride
# hier NICHT erlaubt, verursachen diese Zeilen einen Server-Fehler
# (500) – in diesem (seltenen) Fall diesen Block einfach löschen; die
# übrige Website/der Page-Builder funktionieren davon unabhängig
# unverändert weiter, nur Video-Uploads bleiben dann auf die
# Standard-Limits begrenzt.
<IfModule mod_php.c>
  php_value upload_max_filesize 45M
  php_value post_max_size 50M
</IfModule>
