yan*_*gxg 10 python django https http nginx
最近,我将我的一个django站点从http升级到https.然而,在此之后,我Invalid HTTP_HOST header在收到此类电子邮件之前不断收到错误电子邮件.
以下是一些日志消息:
[Django] ERROR(外部IP):无效的HTTP_HOST标头:'123.56.221.107'.您可能需要将"123.56.221.107"添加到ALLOWED_HOSTS.
[Django] ERROR(外部IP):HTTP_HOST标头无效:'www.sgsrec.com'.您可能需要将"www.sgsrec.com"添加到ALLOWED_HOSTS.
[Django]错误(外部IP):HTTP_HOST标头无效:'sgsrec.com'.您可能需要将'sgsrec.com'添加到ALLOWED_HOSTS.
在/ apple-app-site-association上报告无效的HTTP_HOST标题:'sgsrec.com'.您可能需要将'sgsrec.com'添加到ALLOWED_HOSTS.
无效的HTTP_HOST标题:'www.pythonzh.cn'.您可能需要将"www.pythonzh.cn"添加到ALLOWED_HOSTS.
在/无效的HTTP_HOST标题报告:'www.pythonzh.cn'.您可能需要将"www.pythonzh.cn"添加到ALLOWED_HOSTS.
请求方法:GET请求URL:http://www.pythonzh.cn/Django版本:1.10.6
[Django] ERROR(EXTERNAL IP):无效的HTTP_HOST标题:'pythonzh.cn'.您可能需要将'pythonzh.cn'添加到ALLOWED_HOSTS.
奇怪的是,我只更改了我的博客网站www.zmrenwu.comnginx配置,但似乎我所有托管在123.56.221.107上的网站都受到影响.
当然,我正确设置了ALLOWED_HOSTS:
ALLOWED_HOSTS = ['.zmrenwu.com']
ALLOWED_HOSTS = ['.sgsrec.com']
ALLOWED_HOSTS = ['.pythonzh.cn']
Run Code Online (Sandbox Code Playgroud)
我博客网站的Nginx配置www.zmrenwu.com:
server {
charset utf-8;
server_name zmrenwu.com www.zmrenwu.com;
listen 80;
return 301 https://www.zmrenwu.com$request_uri;
}
server {
charset utf-8;
server_name zmrenwu.com;
listen 443;
ssl on;
ssl_certificate /etc/ssl/1_www.zmrenwu.com_bundle.crt;
ssl_certificate_key /etc/ssl/2_www.zmrenwu.com.key;
return 301 https://www.zmrenwu.com$request_uri;
}
server {
charset utf-8;
listen 443;
server_name www.zmrenwu.com;
ssl on;
ssl_certificate /etc/ssl/1_www.zmrenwu.com_bundle.crt;
ssl_certificate_key /etc/ssl/2_www.zmrenwu.com.key;
location /static {
alias /home/yangxg/sites/zmrenwu.com/blogproject/static;
}
location /media {
alias /home/yangxg/sites/zmrenwu.com/blogproject/media;
}
location / {
proxy_set_header Host $host;
proxy_pass http://unix:/tmp/zmrenwu.com.socket;
Run Code Online (Sandbox Code Playgroud)
为什么会这样?我怎么能解决这个问题呢?
小智 14
您需要添加一个块
location / {
}
Run Code Online (Sandbox Code Playgroud)
此条件(对于非您的域请求):
if ( $host !~* ^(yourdomain.com|www.yourdomain.com)$ ) {
return 444;
}
Run Code Online (Sandbox Code Playgroud)
和
sudo service nginx reload
Run Code Online (Sandbox Code Playgroud)
我DisallowedHost认为,按照其他答案中的建议禁用主机警告不是正确的解决方案。Django向您发出这些警告是有原因的-最好在这些请求到达Django之前将其阻止。
您在nginx配置中创建了一个新的服务器块。因为它是您定义的唯一HTTPS服务器,所以它成为该端口的默认服务器。从文档中:
该
default_server参数(如果存在)将使服务器成为指定address:port对的默认服务器。如果指令中都没有default_server参数,则该对中的第一台服务器address:port将是该对的默认服务器。
这解释了为什么您突然看到所有这些无效的主机错误。现在,任何尝试通过HTTPS连接到您的服务器的漫游器都将最终使用此默认服务器。由于许多漫游器将使用伪造的主机名或仅使用您的服务器IP(都不在中ALLOWED_HOSTS),因此会在Django中引起警告。
那么解决方案是什么?您可以创建一个单独的服务器块来处理所有此类无效请求:
server {
listen 443 ssl default_server;
server_name _;
return 444;
}
Run Code Online (Sandbox Code Playgroud)
444是nginx用于断开无效请求的特殊响应状态。
添加此块后,它将用于与您要响应的主机头不匹配的所有请求,并且尝试与无效主机连接的任何内容将无法连接。
同时,Django将停止查看对无效主机的请求。
| 归档时间: |
|
| 查看次数: |
1910 次 |
| 最近记录: |