DirectoryIndex index.php Options -Indexes -MultiViews # Alles, was keine Datei ist, beantwortet PHP. # # Die Zeile fuer index.php selbst ist kein Zierrat: Bei IONOS erkennt !-f die bereits # umgeschriebene index.php nicht als Datei, die Regel greift wieder und wieder, und Apache bricht # nach zehn Runden mit einem weissen 500er ab (huefner-gartenbau.de, 12.10.2026). Dieselbe # Absicherung steht in der .htaccess von WordPress. RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] # HTTPS erzwingen. Auskommentiert, weil diese Datei auch in Installationen ohne Zertifikat # liegt und eine Endlosschleife schlimmer waere als fehlendes HTTPS. Vor dem Livegang mit # Zertifikat: die drei Zeilen einschalten - und erst danach die HSTS-Zeile weiter unten, # denn HSTS laesst sich in einem Browser ein halbes Jahr lang nicht zuruecknehmen. #RewriteCond %{HTTPS} !=on #RewriteCond %{HTTP:X-Forwarded-Proto} !=https #RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] # Eine Domain, eine Adresse - mit oder ohne www. Das erledigt die Anwendung selbst nach der # Einstellung SITE_ORIGIN in .env: die jeweils andere Schreibweise antwortet mit 301 dorthin. # Hier braucht es dafuer keine Regel; eine zweite Stelle wuerde nur auseinanderlaufen. # Uebertragen wird komprimiert. HTML, CSS, JavaScript und XML schrumpfen dabei auf etwa ein # Viertel; Bilder und Schriften sind bereits komprimiert und bleiben aussen vor. AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css AddOutputFilterByType DEFLATE application/javascript application/json application/xml AddOutputFilterByType DEFLATE application/rss+xml image/svg+xml AddOutputFilterByType BROTLI_COMPRESS text/html text/css application/javascript image/svg+xml # Wie lange ein Browser eine Datei behalten darf. # # Bilder und Schriften tragen ihre Kennung im Namen: aendert sich der Inhalt, aendert sich die # Adresse. Sie duerfen deshalb ein Jahr bleiben. Stylesheets und Skripte tragen die Fassung als # Parameter, also ebenfalls ein Jahr. HTML wird nie zwischengespeichert - eine veroeffentlichte # Aenderung soll beim naechsten Aufruf sichtbar sein; die Seiten senden dafuer selbst no-store. ExpiresActive On ExpiresByType image/webp "access plus 1 year" ExpiresByType image/png "access plus 1 year" ExpiresByType image/jpeg "access plus 1 year" ExpiresByType image/svg+xml "access plus 1 year" ExpiresByType font/woff2 "access plus 1 year" ExpiresByType text/css "access plus 1 year" ExpiresByType application/javascript "access plus 1 year" Header set Cache-Control "public, max-age=31536000, immutable" # Schriften werden von derselben Adresse geladen; die Regel steht hier, damit sie auch dann # gilt, wenn eine Installation die Dateien ueber ein CDN spiegelt. Header set Access-Control-Allow-Origin "*" # Was der Server ueber sich selbst erzaehlt, geht niemanden etwas an: die genaue PHP-Fassung # ist fuer einen Besucher wertlos und fuer einen Scanner eine Einkaufsliste. Header always unset X-Powered-By Header always unset X-AspNet-Version # Erst einschalten, wenn HTTPS steht und bleiben soll (siehe oben). #Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains" # Nichts ausliefern, was nur intern gebraucht wird - falls jemand das Paket versehentlich # vollstaendig in den oeffentlichen Ordner legt statt nur public/. Require all denied # Eine Ausnahme mit Grund: der Editor liest die Liste der Gestaltungswerte als JSON. Require all granted