HTTP_HOST 标头无效。根据 RFC 1034/1035,提供的域名无效

HTTP_HOST 标头无效。根据 RFC 1034/1035,提供的域名无效

我的服务器上出现无效 HTTP_HOST 标头错误。我不明白为什么会发生这种情况以及如何修复它。每次发生这种情况时后端都会停止工作,我必须重新启动服务器。

任何帮助将不胜感激。

提前致谢!

仅供参考:服务器是 aws ec2;前端是 angular,后端是带有 gunicorn 的 django/drf。Angular 和 DRF 都部署在同一台服务器上。

错误 0。如果我不在 nginx.conf 中设置 Host 变量,我会多次收到以下错误。无效的 HTTP_HOST 标头:'/run/gunicorn.sock:'。根据 RFC 1034/1035,提供的域名无效。

如果我在 nginx.conf 中设置 Host 变量,我会收到以下错误。

错误1. proxy_set_header 主机$http_host;

HTTP_HOST 标头无效:“127.0.0.1:8000,127.0.0.1:8000”。根据 RFC 1034/1035,提供的域名无效。

错误2. proxy_set_header 主机$host;

无效的 HTTP_HOST 标头:“127.0.0.1:8000,127.0.0.1”。根据 RFC 1034/1035,提供的域名无效。

错误 3. proxy_set_header 主机 $server_name;

HTTP_HOST 标头无效:“13.234.187.18,13.234.187.18:8000”。根据 RFC 1034/1035,提供的域名无效。

nginx.conf如下。

server {
    listen 8000;
    server_name 13.234.187.18;

    location / {
        proxy_set_header Host $host;
        include proxy_params;

        proxy_pass http://unix:/run/gunicorn.sock;
    }
}

我在 nginx 网站上找到了下面的代码。它能解决这个问题吗? http://nginx.org/en/docs/http/request_processing.html

server {
    listen      80;
    server_name "";
    return      444;
}

答案1

问题在于您导致 Host 标头被包含了两次。

        proxy_set_header Host $host;
        include proxy_params;

查看proxy_params文件会发现它已经在那里设置了。再次设置它会导致两个值用逗号连接起来。

在该文件中,您将找到包含该文件时将使用的预设标头。您无需在自己的配置中重复任何这些行。

ubuntu@vmtest-ubuntu2004:~$ cat /etc/nginx/proxy_params
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

您可以proxy_set_header Host $host;从配置中删除您自己的附加内容。

答案2

我遇到了类似的问题,但是,我的 Nginx 配置文件中没有这个proxy_set_header,它只是include proxy_params;

根据 Django 文档,当您的站点位于代理服务器后面时,Django 会拒绝来自代理的请求,认为它们不安全,即使客户端和代理之间的连接可能是安全的。因此,解决方案是更新您的 Djangosettings.py文件并添加以下内容:

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

您可以在此处进一步了解此问题: https://docs.djangoproject.com/en/3.1/ref/settings/#secure-proxy-ssl-header

答案3

但是,我仍然遇到类似的问题,(1)我的 Nginx 配置文件中没有像原始问题中那样有 proxy_set_header,它只是包含 proxy_params;(2)我在 setting.py 中包含了 SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')。

相关内容