WordPress: Security headers в .htaccess и Nginx
Добавление заголовков безопасности для WordPress: X-Frame-Options, X-Content-Type-Options, Referrer-Policy. Варианты для Apache (.htaccess) и Nginx.
Как использовать
- Apache: добавь блок Header set в .htaccess в корне WordPress (после RewriteBase).
- Nginx: добавь add_header в server или location / внутри блока server для сайта.
- Проверка: curl -I https://example.com/ | grep -iE 'x-frame|x-content-type|referrer'.
WordPress по умолчанию не отдаёт заголовки безопасности; без них браузер уязвимее к clickjacking, MIME-sniffing и утечке Referer. Проблема: как выдать X-Frame-Options, X-Content-Type-Options и Referrer-Policy на сайте на WordPress. Ниже — готовые фрагменты для Apache (.htaccess) и Nginx.
Apache (.htaccess)
В корне WordPress, в .htaccess, после правил RewriteEngine/RewriteBase:
# Security headers
<IfModule mod_headers.c>
Header set X-Frame-Options "SAMEORIGIN"
Header set X-Content-Type-Options "nosniff"
Header set X-XSS-Protection "1; mode=block"
Header set Referrer-Policy "strict-origin-when-cross-origin"
</IfModule>
- X-Frame-Options “SAMEORIGIN” — разрешить фрейм только с того же домена (защита от clickjacking).
- X-Content-Type-Options “nosniff” — запрет MIME-sniffing.
- Referrer-Policy — уменьшить утечку referrer в внешние сайты.
Если нужен полный запрет фреймов: X-Frame-Options "DENY".
Nginx
В блоке server для этого сайта (или в location /):
server {
listen 443 ssl http2;
server_name example.com;
root /var/www/example.com;
# Security headers для WordPress
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
- always — отдавать заголовки и для ответов 4xx/5xx (в Nginx по умолчанию add_header не дублируется в дочерних location при ошибках).
Проверка
curl -sI https://example.com/ | grep -iE 'x-frame|x-content-type|referrer|x-xss'
Ожидаемо: строки с X-Frame-Options, X-Content-Type-Options, Referrer-Policy.
Типичные ошибки
- Apache: заголовки не применяются — включи mod_headers:
a2enmod headers(Debian/Ubuntu), перезапусти Apache. - Nginx: заголовки только на 200 — добавь
alwaysк каждомуadd_header. - Конфликт с плагином — часть плагинов безопасности тоже выставляет заголовки; проверь, что значения не дублируются и не конфликтуют.
Связанные сниппеты: Nginx: server_tokens и заголовки безопасности. Подробнее: WordPress и Core Web Vitals.