- New Express + TypeScript backend (server/) with pg, Better Auth, local file storage - De-Supabased Postgres schema (server/db) and TS reimplementations of DB functions - Frontend data layer rewired to REST (rest-client + backend-client compat shim) - Removed all Supabase references (code, config, deps, docs) - New brand assets: gradient favicon/app icons + dark/white wordmark logos Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
99 lines
4.0 KiB
ApacheConf
99 lines
4.0 KiB
ApacheConf
# AppForge - Static SPA Configuration for cPanel/Apache
|
|
# This file handles routing for a React Single Page Application
|
|
|
|
# Enable RewriteEngine
|
|
<IfModule mod_rewrite.c>
|
|
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]
|
|
</IfModule>
|
|
|
|
# Disable directory browsing
|
|
Options -Indexes
|
|
|
|
# Set default charset
|
|
AddDefaultCharset UTF-8
|
|
|
|
# Security Headers
|
|
<IfModule mod_headers.c>
|
|
# 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"
|
|
</IfModule>
|
|
|
|
# Compression for better performance
|
|
<IfModule mod_deflate.c>
|
|
AddOutputFilterByType DEFLATE text/html text/plain text/css application/json application/javascript text/xml application/xml application/xhtml+xml text/javascript
|
|
</IfModule>
|
|
|
|
# Cache static assets
|
|
<IfModule mod_expires.c>
|
|
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"
|
|
</IfModule>
|
|
|
|
# Handle 404 errors - redirect to index.html for SPA
|
|
ErrorDocument 404 /index.html
|
|
|
|
# MIME Types
|
|
<IfModule mod_mime.c>
|
|
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
|
|
</IfModule>
|