Rückmeldung der Turnabteilung: Step Aerobic findet nicht mehr statt. Wichtig war der Befund vor der Änderung: die Seite bündelt DREI Angebote — Pilates, Fitness & Stretching und Step-Aerobic. Ein pauschales "die Card raus" hätte Pilates und Fitness mitgenommen. Entfernt ist deshalb nur die eine Gruppe (Donnerstag 19:30, Heike Wahler); Pilates und Fitness & Stretching bei Karola Lorz laufen unverändert weiter. Heike Wahler stand nur in dieser Gruppe und erscheint damit nicht mehr auf der Website — das ist die einzige Nebenwirkung, die jemandem auffallen könnte. Umbenannt in "Fitness & Pilates" an allen zehn Fundstellen: navigation.json, turnen.json (Disziplin-Schlüssel, Hero-Titel, drei Übersichtstexte), ansprechpartner.json, news.json, turnen.php (Karte, Alt-Text, Meta) und die Seiten-Datei selbst. URL mitgezogen wie besprochen: turnen/step-aerobic-fitness-pilates → turnen/fitness-pilates, samt Seiten-Datei und den drei Bilddateien (git mv, Historie bleibt). Der alte Slug war in der Sitemap und ist indexiert, deshalb eine 301 in public/.htaccess — VOR dem Front Controller, sonst würde index.php den Pfad als unbekannten Slug abfangen und 404 rendern. Geprüft: /turnen/fitness-pilates liefert 200 mit nur noch zwei Gruppen, Sitemap führt ausschließlich den neuen Slug, Navigation, Übersichtskarte und der News-Artikel verweisen darauf, keine Referenz auf die alten Bildnamen mehr. Der alte Slug gibt lokal 404, weil php -S keine .htaccess liest; die 301 greift auf Apache. Nicht geändert: das Wort "Step-Aerobic" in der CLAUDE.md-Sprachregel. Dort ist es ein Beispiel für orthografisch nötige Bindestriche und bleibt als solches richtig, auch ohne den Kurs. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NzeVVgMCrzCDJAKeLEdKr7
68 lines
3.1 KiB
ApacheConf
68 lines
3.1 KiB
ApacheConf
RewriteEngine On
|
|
|
|
# --- Kanonische Adresse: HTTPS erzwingen, nackte Domain auf www ---
|
|
# Die Formulare übertragen Name, Adresse und Geburtsdatum — nie über http.
|
|
# Der HTTPS-Redirect ist bewusst host-neutral (funktioniert auch auf einer
|
|
# Test-/Preview-Domain); nur tsv08kulmbach.de wird hart auf www gezogen.
|
|
# Drei unabhängige TLS-Indikatoren, damit kein Redirect-Loop entsteht, falls der
|
|
# Hoster die Verschlüsselung anders durchreicht als erwartet.
|
|
RewriteCond %{HTTPS} !=on
|
|
RewriteCond %{HTTP:X-Forwarded-Proto} !=https
|
|
RewriteCond %{SERVER_PORT} !=443
|
|
RewriteCond %{HTTP_HOST} !^(localhost|127\.0\.0\.1)(:[0-9]+)?$ [NC]
|
|
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
|
|
|
|
RewriteCond %{HTTP_HOST} ^tsv08kulmbach\.de$ [NC]
|
|
RewriteRule ^ https://www.tsv08kulmbach.de%{REQUEST_URI} [R=301,L]
|
|
|
|
# --- Umbenannte Seiten (301) ---
|
|
# Step Aerobic findet nicht mehr statt (31.07.2026), die Seite heißt jetzt
|
|
# „Fitness & Pilates" und liegt unter turnen/fitness-pilates. Der alte Slug war
|
|
# in der Sitemap und ist von Google indexiert, deshalb 301 statt 404 — sonst
|
|
# verliert die Seite ihre Position und alte Links laufen ins Leere.
|
|
# Steht VOR dem Front Controller, sonst würde index.php den Pfad zuerst als
|
|
# unbekannten Slug abfangen und einen 404 rendern.
|
|
RewriteRule ^turnen/step-aerobic-fitness-pilates/?$ /turnen/fitness-pilates [R=301,L]
|
|
|
|
# --- Front Controller ---
|
|
RewriteCond %{REQUEST_FILENAME} !-f
|
|
RewriteCond %{REQUEST_FILENAME} !-d
|
|
RewriteRule ^ index.php [L]
|
|
|
|
# --- Security-Header ---
|
|
<IfModule mod_headers.c>
|
|
Header always set X-Content-Type-Options "nosniff"
|
|
Header always set Referrer-Policy "strict-origin-when-cross-origin"
|
|
Header always set X-Frame-Options "SAMEORIGIN"
|
|
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"
|
|
# HSTS nur über HTTPS ausliefern (1 Jahr, ohne includeSubDomains — Subdomains
|
|
# wie Webmail liegen nicht in unserer Hand).
|
|
Header always set Strict-Transport-Security "max-age=31536000" env=HTTPS
|
|
# Streng möglich, weil ausnahmslos alles self-hosted ist (CLAUDE.md Regel 1).
|
|
Header always set Content-Security-Policy "default-src 'self'; img-src 'self' data:; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'self'"
|
|
</IfModule>
|
|
|
|
# --- Kompression ---
|
|
<IfModule mod_deflate.c>
|
|
AddOutputFilterByType DEFLATE text/html text/css text/javascript application/javascript application/json image/svg+xml
|
|
</IfModule>
|
|
|
|
# --- Caching: Assets 1 Jahr (Busting via ?v=filemtime), HTML nie ---
|
|
<IfModule mod_expires.c>
|
|
ExpiresActive On
|
|
ExpiresByType text/css "access plus 1 year"
|
|
ExpiresByType application/javascript "access plus 1 year"
|
|
ExpiresByType font/woff2 "access plus 1 year"
|
|
ExpiresByType image/jpeg "access plus 1 year"
|
|
ExpiresByType image/png "access plus 1 year"
|
|
ExpiresByType image/webp "access plus 1 year"
|
|
ExpiresByType image/svg+xml "access plus 1 year"
|
|
ExpiresByType image/x-icon "access plus 1 year"
|
|
ExpiresByType video/mp4 "access plus 1 year"
|
|
ExpiresByType text/html "access plus 0 seconds"
|
|
</IfModule>
|
|
|
|
AddType font/woff2 .woff2
|
|
AddDefaultCharset utf-8
|
|
Options -Indexes
|