# .htaccess for Laravel on cPanel - Root Directory
# This file should be placed in your root directory (public_html)
RewriteEngine On
# CRITICAL: Handle assets FIRST - Direct access to public/assets/
RewriteCond %{REQUEST_URI} ^/assets/(.*)$
RewriteCond %{DOCUMENT_ROOT}/public/assets/%1 -f
RewriteRule ^assets/(.*)$ public/assets/$1 [L]
# Handle favicon and robots.txt
RewriteCond %{REQUEST_URI} ^/(favicon\.ico|robots\.txt)$
RewriteCond %{DOCUMENT_ROOT}/public/$1 -f
RewriteRule ^(.*)$ public/$1 [L]
# Handle root requests - redirect to public/index.php
RewriteCond %{REQUEST_URI} ^/$
RewriteRule ^(.*)$ public/index.php [L]
# Handle Laravel routes (everything else)
RewriteCond %{REQUEST_URI} !^/public/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ public/index.php [QSA,L]
# Set correct MIME types for assets
AddType text/css .css
AddType application/javascript .js
AddType image/png .png
AddType image/jpeg .jpg
AddType image/jpeg .jpeg
AddType image/gif .gif
AddType image/svg+xml .svg
AddType font/woff .woff
AddType font/woff2 .woff2
AddType image/x-icon .ico
# Prevent direct access to Laravel directories
RedirectMatch 403 ^/app/
RedirectMatch 403 ^/bootstrap/
RedirectMatch 403 ^/config/
RedirectMatch 403 ^/database/
RedirectMatch 403 ^/resources/
RedirectMatch 403 ^/routes/
RedirectMatch 403 ^/storage/
RedirectMatch 403 ^/tests/
RedirectMatch 403 ^/vendor/
# Security Headers
Header always set X-Content-Type-Options nosniff
Header always set X-Frame-Options SAMEORIGIN
Header always set X-XSS-Protection "1; mode=block"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
# Disable directory browsing
Options -Indexes
# Protect sensitive files
Order allow,deny
Deny from all
# Cache static assets
ExpiresActive On
ExpiresByType text/css "access plus 1 year"
ExpiresByType application/javascript "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/svg+xml "access plus 1 year"
ExpiresByType font/woff "access plus 1 year"
ExpiresByType font/woff2 "access plus 1 year"
# Compress files
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/json