django - 配置 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
}
感谢您的任何建议。
解决方案
推荐阅读
- reactjs - 在 Section 列表中仅显示数组的前两项
- android - 搜索栏仍然没有更新
- python - 使用 scapy 欺骗 dns 中的循环请求
- angular - 更改 Angular 项目中的配置文件后字体未加载
- url - 通过 URL 而不是 HTML 提交 Paypal 打开新标签
- sql - 输出子句 VS 触发器
- laravel-5.4 - 从 url laravel 5.4 中删除公共
- javascript - Botkit - 异步拉取用户数据
- graphql - graphql 查询或突变能否返回标量值
- ios - 密码字段的键盘仅在 iOS 12 上从 azerty 切换到 qwerty(有时)