我的服务器出现无效主机头错误,我不确定如何解决它。
错误请求 URL 为https://127.0.0.1:8000显而易见的建议是将 localhost 添加到我的(使用 django)允许的主机中。但是,我读到过,在生产环境中将 localhost 保留在允许的主机中是一种不好的做法,并且可能存在安全漏洞。目前,我在生产环境中允许的主机仅限于我注册的域。
我做了一些调查,发现这些请求似乎来自 IP 端口扫描器。在电子邮件报告中,我有时可以在 HTTP_USER_AGENT 中看到指向此类扫描器存储库的 GitHub 链接。HTTP_X_FORWARDED_FOR 几乎总是某个 VPN 提供商,或者位于莫斯科或北京。
这是我当前的 nginx 配置。我实施了其他帖子中的一些建议,例如自定义 if 正则表达式过滤,但似乎没有效果。
除了这个问题之外,其他一切似乎都按预期运行。任何帮助都将不胜感激。第一次设置这样的功能,所以请指出任何明显的错误。
# File: /etc/nginx/sites-available/app
server_tokens off;
access_log /var/log/nginx/app.access.log;
error_log /var/log/nginx/app.error.log;
server {
listen 80 default_server;
return 444;
}
server {
server_name app.example.com;
listen 80;
return 301 https://$host$request_uri;
}
server {
# Custom regex if statement to 444 any unexpected host header
if ( $host !~* ^(app.example.com|example.com)$ ) {
return 444;
}
location /static {
autoindex on;
alias /path/to/django/staticfiles;
}
# Pass on requests to guinicorn listening on http://localhost:8000
location / {
proxy_pass http://localhost:8000;
include /etc/nginx/proxy_params;
proxy_redirect off;
}
listen 443 ssl;
server_name app.example.com;
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers CIPHER;
}
答案1
您缺少default_server
HTTPS 块。因此,通过 HTTPS 对任何主机的所有请求都会传递到您的app.example.com
server
块中(我将其更改为示例域)。
对于默认服务器,您的配置应如下所示:
server {
listen 80 default_server;
listen 443 default_server ssl;
ssl_certificate /path/to/certificate.crt;
ssl_certificate_key /path/to/certificate.key;
return 444;
}
我在此块中使用系统的自签名证书/密钥。例如,在基于 Debian 的系统中,有/etc/ssl/private/ssl-cert-snakeoil.key
和/etc/ssl/certs/ssl-cert-snakeoil.pem
。
然后你需要删除if
你app.example.com
块中的块。