WORDPRESS
#wordpress#security#headers#htaccess#nginx#hardening

WordPress: Security headers в .htaccess и Nginx

Добавление заголовков безопасности для WordPress: X-Frame-Options, X-Content-Type-Options, Referrer-Policy. Варианты для Apache (.htaccess) и Nginx.

Как использовать

  1. Apache: добавь блок Header set в .htaccess в корне WordPress (после RewriteBase).
  2. Nginx: добавь add_header в server или location / внутри блока server для сайта.
  3. Проверка: 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.