Ein CSP-Header im Reverse-Proxy hat die Seite still zerlegt: Astro liefert seine Skripte als inline type=module aus, "script-src 'self'" blockiert die. Im Browser blieb data-reveal leer und das Mobilmenue reagierte nicht, ohne dass eine Fehlermeldung sichtbar war. Astro kennt die Hashes seiner eigenen Bundles, deshalb setzt jetzt der Build die Policy per <meta> (security.csp in astro.config.mjs). Damit die Policy auch fuer Styles streng bleiben kann, sind die letzten drei style-Attribute raus: sobald eine CSP Hashes fuer Styles enthaelt, ignorieren Browser 'unsafe-inline', inline gesetzte Farben waeren also ohnehin verloren. - Laserstrahlen im Hero: .beam-1 bis .beam-5 im <style>-Block - Genre-Akzentfarben: .accent-<name> statt berechnetem style-Attribut Geprueft im Browser hinter Caddy: Skripte laufen, Laser-Winkel und Akzentfarben stimmen, keine Verstoesse in der Konsole. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
48 lines
1.4 KiB
JavaScript
48 lines
1.4 KiB
JavaScript
// @ts-check
|
|
import { defineConfig } from 'astro/config';
|
|
import node from '@astrojs/node';
|
|
import sitemap from '@astrojs/sitemap';
|
|
import tailwindcss from '@tailwindcss/vite';
|
|
|
|
// https://astro.build/config
|
|
export default defineConfig({
|
|
// Muss mit SITE.url in src/data/site.ts uebereinstimmen.
|
|
site: 'https://djnizz.at',
|
|
|
|
// Alle Seiten werden beim Build vorgerendert (maximale Performance).
|
|
// Der Node-Adapter serviert sie und erlaubt es, spaeter einzelne Routen
|
|
// (z. B. /api/booking) mit `export const prerender = false` dynamisch zu machen.
|
|
adapter: node({ mode: 'standalone' }),
|
|
|
|
integrations: [sitemap()],
|
|
|
|
// Content-Security-Policy. Astro kennt seine eigenen gebuendelten Skripte und
|
|
// Styles und traegt deren SHA-256-Hashes automatisch nach - deshalb wird die
|
|
// Policy hier gesetzt und nicht im Reverse-Proxy: der weiss von den Hashes
|
|
// nichts und wuerde die Inline-Module blockieren.
|
|
security: {
|
|
csp: {
|
|
directives: [
|
|
"default-src 'self'",
|
|
"img-src 'self' data:",
|
|
"font-src 'self'",
|
|
"connect-src 'self'",
|
|
"form-action 'self'",
|
|
"base-uri 'self'",
|
|
"object-src 'none'",
|
|
],
|
|
scriptDirective: { resources: ["'self'"] },
|
|
styleDirective: { resources: ["'self'"] },
|
|
},
|
|
},
|
|
|
|
image: {
|
|
// Bilder werden beim Build zu AVIF/WebP konvertiert.
|
|
responsiveStyles: true,
|
|
},
|
|
|
|
vite: {
|
|
plugins: [tailwindcss()],
|
|
},
|
|
});
|