目前我有一个 Django 服务器,如果你去www.notmyactualwebsite.com。但是,我得到一堆直接访问 IP 地址的机器人,即 12.34.56.78:443,Django 将抛出异常并提醒我可能需要将 12.34.56.78:443 添加到 ALLOWED_HOSTS 设置中。
这让我很疑惑:我真的应该允许通过直接 IP 访问我的网站吗?我无法想象很多人会真的这么做,所以就这样放任不管就好了吗?
答案1
根据我的问题的评论和这里的答案https://stackoverflow.com/questions/47846521/i-continuously-receive-invalid-http-host-header-error-email-after-i-upgrade-my我了解到:
显然大多数网站不允许直接 IP 连接,因此您也不需要适应这种情况。
我的 nginx 设置应该是阻止此类访问的层,它可以使用这些默认块捕获所有不被接受的服务器名称:
server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
server_name _;
return 444;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 444;
}
现在,这实际上不起作用。我不完全了解 SSL 证书,所以我很想有人评论一下为什么会这样,但即使正常访问网站(即未正确使用 IP 地址),此服务器配置也会导致 ERR_CONNECTION_CLOSED 或 ERR_CONNECTION_RESET 错误。我找到了答案,那就是您需要添加 SSL 证书,因为这是一个 HTTPS 端点:https://stackoverflow.com/questions/35677044/nginx-ssl-certificate-directive-doesnt-work-within-server-block-browser-shows
因此我从常规 django 服务器块复制了 SSL 证书,现在 SSL 块如下所示:
server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
server_name _;
return 444;
ssl_certificate /etc/letsencrypt/live/notmyactualwebsite.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/notmyactualwebsite.com/privkey.pem; # managed by Certbot
}
除此之外,显然最好不要为 IP 提供基于域的 SSL 证书。因此,您可以根据此处的答案生成自己的证书阻止通过 HTTPS 直接访问 Web 服务器 IP:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout privateKey.key -out certificate.crt -subj '/CN=<SERVER-IP>'
然后你的最终结果如下所示:
server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
server_name _;
return 444;
# This will actually trigger a browser SSL error because they won't trust
# your self-signed certificate but it's probably to a bot anyway
ssl_certificate /path/to/certificate.crt;
ssl_certificate_key /path/to/privateKey.key;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 444;
}