配置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配置文件被正确读取,因为我可以在主服务器块中添加一个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
}

谢谢你的建议。

感谢@Richard Smith-将$host更改为$http_host:

server {
server_name example.com;

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

最新更新