RewriteEngine On
# ============================================================================
# Security Headers
# ============================================================================
# Basic Security Headers
Header set X-Content-Type-Options "nosniff"
Header set X-Frame-Options "DENY"
Header set X-XSS-Protection "1; mode=block"
Header set Referrer-Policy "strict-origin-when-cross-origin"
# Content Security Policy
Header set Content-Security-Policy "\
default-src 'self' https:; \
script-src 'self' https: 'unsafe-inline' 'unsafe-eval' blob:; \
style-src 'self' https: 'unsafe-inline'; \
img-src 'self' data: https:; \
connect-src 'self' https: ws: wss:; \
form-action 'self'; \
object-src 'none';"
# HSTS (Important for HTTPS)
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
# Permissions Policy (Good to have)
Header set Permissions-Policy "geolocation=(), microphone=(), camera=(), autoplay=()"
# ============================================================================
# Content-Type with Charset (Prevents encoding attacks)
# ============================================================================
# HTML
Header set Content-Type "text/html; charset=UTF-8"
# CSS
Header set Content-Type "text/css; charset=UTF-8"
# JS
Header set Content-Type "application/javascript; charset=UTF-8"
# ============================================================================
# File Security (Enhanced)
# ============================================================================
Require all denied
Order allow,deny
Deny from all
# ============================================================================
# Application Routing
# ============================================================================
# Handle OPTIONS requests
RewriteCond %{REQUEST_METHOD} =OPTIONS
RewriteRule ^ index.php [QSA,L]
# Route non-static files to index.php
RewriteCond %{REQUEST_URI} !\.(css|js|png|jpe?g|gif|svg|webp|woff2?|ttf|eot|ico|pdf|mp4|webm|mp3|ogg)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]