# SecureBit.chat - Apache Configuration # Comprehensive caching configuration for forced updates # Enable mod_rewrite RewriteEngine On RewriteBase / # ============================================ # CRITICAL FILES - NO CACHING # ============================================ # meta.json - versioning file (never cache) Header set Cache-Control "no-cache, no-store, must-revalidate, max-age=0" Header set Pragma "no-cache" Header set Expires "0" Header set X-Content-Type-Options "nosniff" # HTML files - always fresh Header set Cache-Control "no-cache, no-store, must-revalidate, max-age=0" Header set Pragma "no-cache" Header set Expires "0" # Remove ETag for validation Header unset ETag FileETag None # Service Worker - no cache Header set Cache-Control "no-cache, no-store, must-revalidate, max-age=0" Header set Pragma "no-cache" Header set Expires "0" Header set Service-Worker-Allowed "/" # manifest.json - no cache Header set Cache-Control "no-cache, no-store, must-revalidate, max-age=0" Header set Pragma "no-cache" Header set Expires "0" # ============================================ # STATIC RESOURCES - AGGRESSIVE CACHING # ============================================ # JavaScript files in dist/ - no cache (for updates) Header set Cache-Control "no-cache, no-store, must-revalidate, max-age=0" Header set Pragma "no-cache" Header set Expires "0" Header set X-Content-Type-Options "nosniff" # JavaScript files with hashes in other locations - long cache # Files with hashes in name - cache for one year Header set Cache-Control "public, max-age=31536000, immutable" Header set X-Content-Type-Options "nosniff" # CSS files - long cache Header set Cache-Control "public, max-age=31536000, immutable" # Images - long cache Header set Cache-Control "public, max-age=31536000, immutable" # Fonts - long cache Header set Cache-Control "public, max-age=31536000, immutable" Header set Access-Control-Allow-Origin "*" # Audio/Video - long cache Header set Cache-Control "public, max-age=31536000, immutable" # ============================================ # SECURITY # ============================================ # XSS Protection Header set X-XSS-Protection "1; mode=block" Header set X-Content-Type-Options "nosniff" Header set Referrer-Policy "strict-origin-when-cross-origin" Header set X-Frame-Options "DENY" # Content Security Policy (already configured in HTML, but can add header) # Header set Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline';" # ============================================ # GZIP COMPRESSION # ============================================ # Compress text files AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/json application/xml # Compress fonts AddOutputFilterByType DEFLATE font/woff font/woff2 application/font-woff application/font-woff2 # ============================================ # MIME TYPES # ============================================ # JavaScript modules AddType application/javascript .js .mjs AddType application/json .json # Fonts AddType font/woff .woff AddType font/woff2 .woff2 AddType application/font-woff .woff AddType application/font-woff2 .woff2 # Service Worker AddType application/javascript .js AddType application/manifest+json .webmanifest # ============================================ # CLOUDFLARE RULES # ============================================ # Cloudflare can cache static files, but should not cache: # - meta.json # - index.html # - sw.js # - manifest.json # These rules are applied at Cloudflare Page Rules level # (see CLOUDFLARE_SETUP.md documentation) # ============================================ # SPA FALLBACK # ============================================ # If file not found, redirect to index.html (for SPA routing) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} !^/meta\.json$ RewriteCond %{REQUEST_URI} !^/sw\.js$ RewriteCond %{REQUEST_URI} !^/manifest\.json$ RewriteRule ^(.*)$ /index.html [L] # ============================================ # LOGGING (optional) # ============================================ # Uncomment for debugging # LogLevel rewrite:trace3