nginx error_page 404 Заголовок HSTS отсутствует

У меня есть сайт Laravel, на котором запущен nginx 1.15.0. В конфигурации сайта указаны заголовки HSTS (HTTP Strict Transport Security) на уровне server. Это отлично работает для всех действительных URL-адресов.

Однако при запросе ресурса, который приводит к ошибке 404, заголовок HSTS не возвращается с ответом. Это также верно для других заголовков, установленных add_header в блоке server.

Я пытаюсь включить заголовок HSTS даже во все ответы, даже в случае ошибки. Честно говоря, это просто для того, чтобы сканеры безопасности отметили его как уязвимость среднего уровня. Может, это театр безопасности, но мне все равно хотелось бы понять, что здесь происходит.

За исключением одного явно определенного исключения для URL-адресов .json, нет других add_header директив, которые мешали бы директивам на уровне сервера.

Вот содержимое моей конфигурации nginx для этого сайта. Включаемые before/* и after/*, похоже, не выдают никаких add_header директив, поэтому я не буду их здесь расширять.

# FORGE CONFIG (DOT NOT REMOVE!)
include forge-conf/example.com/before/*;

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name .example.com;
    root /home/forge/example.com/current/public;

    client_max_body_size 100M;

    # FORGE SSL (DO NOT REMOVE!)
    ssl_certificate /etc/nginx/ssl/example.com/302491/server.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com/302491/server.key;

    ssl_protocols TLSv1.2;
    # Updated cipher suite per Mozilla recommendation for Modern compatibility
    # https://wiki.mozilla.org/Security/Server_Side_TLS#Modern_compatibility
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
    ssl_prefer_server_ciphers on;
    ssl_dhparam /etc/nginx/dhparams.pem;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block" always;
    add_header X-Content-Type-Options "nosniff";
    add_header Vary "Origin";

    add_header Access-Control-Allow-Origin "*";
    add_header Access-Control-Allow-Credentials 'true';
    add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
    add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
    add_header Referrer-Policy "strict-origin-when-cross-origin";
    add_header Public-Key-Pins 'pin-sha256="hpkppinhash="; pin-sha256="anotherpinhash="; pin-sha256="yetanotherpinhash="; pin-sha256="anotherpinhash="; pin-sha256="lastpinhash="; max-age=86400';


    index index.html index.htm index.php;

    charset utf-8;

    # FORGE CONFIG (DOT NOT REMOVE!)
    include forge-conf/example.com/server/*;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    access_log off; 
    error_log  /var/log/nginx/example.com-error.log error;

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }

    location ~* \.json {
    add_header Cache-Control "no-store,no-cache";
        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
        add_header Referrer-Policy "strict-origin-when-cross-origin";
    }
}

# FORGE CONFIG (DOT NOT REMOVE!)
include forge-conf/example.com/after/*;


person Anaxamaxan    schedule 07.05.2019    source источник


Ответы (1)


Вам необходимо добавить always параметр , как указано в документации:

Добавляет указанное поле в заголовок ответа при условии, что код ответа равен 200, 201 (1.3.10), 204, 206, 301, 302, 303, 304, 307 (1.1.16, 1.0.13) или 308 (1.13. .0). Значение может содержать переменные.

...

Если указан параметр always (1.7.5), поле заголовка будет добавлено независимо от кода ответа.

Так что измените свою конфигурацию на это:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
person Barry Pollard    schedule 07.05.2019
comment
Потрясающий. Я не понял параметр always. Спасибо за это! - person Anaxamaxan; 07.05.2019