Je reçois continuellement le message d’erreur “Invalid HTTP_HOST header” après avoir mis à jour mon site django de http à https

Récemment, j’ai mis à jour l’un de mes sites Django de http à https. Cependant, après cela, je reçois continuellement un Invalid HTTP_HOST header mail d’erreur de l’en- Invalid HTTP_HOST header alors que je n’avais jamais reçu ce type d’e-mails.

Voici quelques messages de journal:

[Django] ERROR (IP EXTERNE): En-tête HTTP_HOST invalide: ‘123.56.221.107’. Vous devrez peut-être append «123.56.221.107» à ALLOWED_HOSTS.


[Django] ERROR (IP EXTERNE): En-tête HTTP_HOST invalide: ‘www.sgsrec.com’. Vous devrez peut-être append «www.sgsrec.com» à ALLOWED_HOSTS.


[Django] ERROR (IP EXTERNE): En-tête HTTP_HOST invalide: ‘sgsrec.com’. Vous devrez peut-être append «sgsrec.com» à ALLOWED_HOSTS.

Rapport à / apple-app-site-association En-tête HTTP_HOST invalide: ‘sgsrec.com’. Vous devrez peut-être append «sgsrec.com» à ALLOWED_HOSTS.


En-tête HTTP_HOST invalide: ‘www.pythonzh.cn’. Vous devrez peut-être append ‘www.pythonzh.cn’ à ALLOWED_HOSTS.

Signaler à / En-tête HTTP_HOST invalide: ‘www.pythonzh.cn’. Vous devrez peut-être append ‘www.pythonzh.cn’ à ALLOWED_HOSTS.

Méthode de requête: GET Request URL: http://www.pythonzh.cn/ Version Django: 1.10.6


[Django] ERREUR (IP EXTERNE): En-tête HTTP_HOST invalide: ‘pythonzh.cn’. Vous devrez peut-être append «pythonzh.cn» à ALLOWED_HOSTS.

Ce qui est étrange, c’est que je ne modifie que la configuration de mon site de blog www.zmrenwu.com , mais il semble que tous mes sites hébergés sur 123.56.221.107 soient exécutés.

De cause, je règle correctement ALLOWED_HOSTS:

 ALLOWED_HOSTS = ['.zmrenwu.com'] ALLOWED_HOSTS = ['.sgsrec.com'] ALLOWED_HOSTS = ['.pythonzh.cn'] 

Configuration Nginx de mon site de blog 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_certificatee /etc/ssl/1_www.zmrenwu.com_bundle.crt; ssl_certificatee_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_certificatee /etc/ssl/1_www.zmrenwu.com_bundle.crt; ssl_certificatee_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; 

Pourquoi c’est arrivé? Et comment pourrais-je résoudre ce problème?

Vous devez append un bloc

  location / { } 

cette condition (pour la requête non-yourdomain):

 if ( $host !~* ^(yourdomain.com|www.yourdomain.com)$ ) { return 444; } 

et

 sudo service nginx reload 

Désactiver les avertissements de l’hôte DisallowedHost comme suggéré dans l’autre réponse n’est pas la solution correcte à mon avis. Il y a une raison pour laquelle Django vous donne ces avertissements – et il est préférable que vous bloquiez ces requêtes avant qu’elles n’atteignent Django.

Vous avez créé un nouveau bloc de serveur dans votre configuration nginx. Comme il s’agit du seul serveur HTTPS que vous avez défini, il devient le serveur par défaut pour ce port. De la documentation :

Le paramètre default_server , s’il est présent, fera du serveur le serveur par défaut pour l’ address:port spécifiée address:port paire de address:port . Si aucune des directives n’a le paramètre default_server , le premier serveur avec la paire address:port sera le serveur par défaut pour cette paire.

Cela explique pourquoi vous voyez soudainement toutes ces erreurs d’hôtes non valides. Tout bot qui essaie maintenant de se connecter à votre serveur via HTTPS finira par utiliser ce serveur par défaut. Parce que de nombreux robots utiliseront de faux noms d’hôte ou simplement votre adresse IP de serveur (qui ne figure pas dans ALLOWED_HOSTS ), cela provoque les avertissements dans Django.

Alors, quelle est la solution? Vous pouvez créer un bloc de serveur distinct qui gère toutes ces requêtes non valides:

 server { listen 443 ssl default_server; server_name _; return 444; } 

444 est un statut de réponse spécial utilisé par nginx pour déconnecter les requêtes non valides .

Une fois ce bloc ajouté, il sera utilisé pour toutes les demandes qui ne correspondent pas aux en-têtes d’hôte auxquels vous souhaitez répondre, et tout ce qui tente de se connecter à un hôte non valide ne pourra pas se connecter.

Django, quant à lui, cessera de voir les demandes d’hôtes invalides.

Cela est probablement dû au fait que des scripts de bot peuvent être en cours d’exécution et ciblent votre serveur avec différents en-têtes HTTP_HOST (ce qui est courant). et dans django, vous avez des hôtes autorisés définis sur un hôte particulier. Donc, si un en-tête d’hôte différent de celui spécifié dans Hôtes autorisés, alors django donnerait une erreur 400. Par défaut, les enregistreurs django sont configurés pour envoyer des messages sur chaque erreur. Pour ne plus recevoir les mails, vous devez configurer les enregistreurs dans django et append le journal suivant 'django.security.DisallowedHost': { 'handlers': ['null'], 'propagate': False, },

Référer https://www.calazan.com/how-to-disable-the-invalid-http_host-header-emails-in-django/