Fix Missing Security Headers on Apache
Last updated: April 2026
Add security headers using Apache's Header directive in .htaccess or your virtual host config.
Enable mod_headers
a2enmod headers systemctl restart apache2
.htaccess โ all security headers
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"
Header always set Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; frame-ancestors 'none'; object-src 'none'"
</IfModule>
Virtual host config
<VirtualHost *:443>
ServerName yoursite.com
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
</IfModule>
</VirtualHost>
Test and reload
apachectl configtest systemctl reload apache2 curl -sI https://yoursite.com | grep -iE "strict|x-frame|x-content|referrer|content-security"