# Redirect www to non-www
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [L,R=301]
# Custom error pages
ErrorDocument 403 /403.php
ErrorDocument 404 /404.php
ErrorDocument 500 /500.php
# Protect sensitive files
Require all denied
# Protect handlers (POST only)
Require all denied
Require all denied
# Security headers
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "geolocation=(), microphone=(), camera=(), payment=(), usb=()"
Header set Cache-Control "no-store, no-cache, must-revalidate, max-age=0"
Header set Pragma "no-cache"
# Compression
AddOutputFilterByType DEFLATE text/html text/plain text/css text/javascript application/javascript application/json image/svg+xml font/woff font/woff2
# Caching
ExpiresActive On
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType image/webp "access plus 1 year"
ExpiresByType image/svg+xml "access plus 1 year"
ExpiresByType image/x-icon "access plus 1 year"
ExpiresByType font/woff "access plus 1 year"
ExpiresByType font/woff2 "access plus 1 year"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType application/json "access plus 0 seconds"
ExpiresDefault "access plus 1 week"
Header set Cache-Control "max-age=31536000, public, immutable"
Header set Cache-Control "max-age=2592000, public"
Header set Connection keep-alive
FileETag None
Header unset ETag
Options -Indexes
ServerSignature Off
RewriteEngine On
# Block requests for non-existent PHP files (webshell scanners)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule \.php$ - [F,L]
# Redirect old pages to homepage
RewriteRule ^services(/.*)?$ / [R=301,L]
RewriteRule ^locations(/.*)?$ / [R=301,L]
RewriteRule ^tools(/.*)?$ / [R=301,L]
RewriteRule ^project-types/?$ / [R=301,L]
RewriteRule ^web-scraping-services(/.*)?$ / [R=301,L]
RewriteRule ^data-scraping-services(/.*)?$ / [R=301,L]
RewriteRule ^price-monitoring-services(/.*)?$ / [R=301,L]
RewriteRule ^data-analytics-services(/.*)?$ / [R=301,L]
RewriteRule ^data-analytics-consultancy-london(/.*)?$ / [R=301,L]
RewriteRule ^data-analytics-services-london(/.*)?$ / [R=301,L]
RewriteRule ^data-services-london(/.*)?$ / [R=301,L]
# Clean URL rewriting - remove .php extension
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+?)/?$ $1.php [END]
# Block access to sensitive directories
RewriteRule ^(logs|database|docker)(/.*)?$ - [F,L]
RewriteRule ^\.git(/.*)?$ - [F,L]