首页 > 解决方案 > 配置 nginx 以丢弃没有 HTTP HOST 标头的 HTTPS 请求

问题描述

文档建议以下服务器块将丢弃所有没有 HTTP HOST 标头的请求:

server {
    listen      80;
    server_name "";
    return      444;
}

这似乎确实有效:

curl -I http://example.com/ -H "Host:" -v --http1.0 --insecure

curl:(52)来自服务器的空回复

我如何将此块应用于HTTPS请求?例如,以下内容触发了来自 Django 的警报,因此它似乎正在通过 nginx:

curl -I https://example.com/ -H "Host:" -v --http1.0 --insecure

无效的 HTTP_HOST 标头:'/run/gunicorn.sock:'。根据 RFC 1034/1035,提供的域名无效。

我试图实现这个解决方案,但仍然得到相同的结果:

if ($host !~* ^(example.com)$ ) {
        return 444;
    }

我想知道这是否与 Certbot 自动创建的额外服务器块有关。停止来自 Django 的电子邮件不是我想要的解决方案,我宁愿 nginx 在这些请求到达应用程序之前丢弃它们。nginx 配置文件被正确读取,因为我可以将 a 添加return 444;到主服务器块,它会阻止所有内容。这是整个/etc/nginx/sites-available/<name>配置:

server {
    listen 80;
    server_name "";
    return 444;
}

server {
    server_name example.com;
    
    if ($host !~* ^(example.com)$ ) {
        return 444;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn.sock;
    }

    listen 443 ssl; # managed by Certbot
    ssl certificate /path/to/cert
    ssl_certificate_key /path_to_key
    include /etc/letsencrypt/options-ssl-nginx.conf
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem
}

server {
    if ($host = example.com) {
        return 331 https://$host$request_uri;
    } # managed by Certbot
    
    server_name example.com;
    listen 80;
    return 404; # managed by Certbot
}

感谢您的任何建议。

标签: djangonginx

解决方案


推荐阅读