# AppForge - Static SPA Configuration for cPanel/Apache # This file handles routing for a React Single Page Application # Enable RewriteEngine RewriteEngine On RewriteBase / # Don't rewrite files or directories that exist RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] # Rewrite all other requests to index.html for SPA routing RewriteRule ^ index.html [L] # Disable directory browsing Options -Indexes # Set default charset AddDefaultCharset UTF-8 # Security Headers # CORS headers Header set Access-Control-Allow-Origin "*" Header set Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS" Header set Access-Control-Allow-Headers "Content-Type, Authorization" # Security headers Header set X-Content-Type-Options "nosniff" Header set X-Frame-Options "SAMEORIGIN" Header set X-XSS-Protection "1; mode=block" Header set Referrer-Policy "strict-origin-when-cross-origin" # Content Security Policy (CSP) - XSS Protection # Allows: self, Supabase APIs, Google Fonts, inline styles (required for React) Header set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.supabase.co https://cdn.gpteng.co; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: blob: https://*.supabase.co https://*.unsplash.com https://*.githubusercontent.com; connect-src 'self' https://*.supabase.co wss://*.supabase.co https://api.openai.com https://generativelanguage.googleapis.com https://api.elevenlabs.io; frame-src 'self' https://appetize.io; media-src 'self' blob: https://*.supabase.co; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'self';" # Permissions Policy (formerly Feature Policy) Header set Permissions-Policy "accelerometer=(), camera=(self), geolocation=(self), gyroscope=(), magnetometer=(), microphone=(self), payment=(), usb=()" # Strict Transport Security (HTTPS only) Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" # Prevent MIME type sniffing attacks Header set X-Permitted-Cross-Domain-Policies "none" # Control DNS prefetching Header set X-DNS-Prefetch-Control "on" # Compression for better performance AddOutputFilterByType DEFLATE text/html text/plain text/css application/json application/javascript text/xml application/xml application/xhtml+xml text/javascript # Cache static assets ExpiresActive On # HTML - no cache (always get fresh for SPA) ExpiresByType text/html "access plus 0 seconds" # Images - cache for 1 month ExpiresByType image/png "access plus 1 month" ExpiresByType image/jpg "access plus 1 month" ExpiresByType image/jpeg "access plus 1 month" ExpiresByType image/gif "access plus 1 month" ExpiresByType image/svg+xml "access plus 1 month" ExpiresByType image/webp "access plus 1 month" ExpiresByType image/x-icon "access plus 1 month" # CSS/JS - cache for 1 year (Vite adds hashes to filenames) ExpiresByType text/css "access plus 1 year" ExpiresByType application/javascript "access plus 1 year" ExpiresByType text/javascript "access plus 1 year" # Fonts ExpiresByType font/woff "access plus 1 year" ExpiresByType font/woff2 "access plus 1 year" ExpiresByType application/font-woff "access plus 1 year" ExpiresByType application/font-woff2 "access plus 1 year" # Handle 404 errors - redirect to index.html for SPA ErrorDocument 404 /index.html # MIME Types AddType application/javascript .js AddType text/css .css AddType image/svg+xml .svg AddType application/json .json AddType font/woff .woff AddType font/woff2 .woff2