Files

99 lines
4.0 KiB
ApacheConf
Raw Permalink Normal View History

# 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>