1 votes

Le site web NginX renvoie la page par défaut avec HTTP (HTTPS fonctionne correctement)

Cela doit être un duplicata, mais j'ai cherché longtemps et je n'ai rien trouvé.

Quand je saisis l'adresse de mon site web en utilisant http, j'obtiens la page par défaut de NginX (https fonctionne bien):

http://svija.love

Le fichier de configuration NginX contient, à la fin:

server {
    if ($host = svija.love) {
        return 301 https://$host$request_uri;
    } # géré par Certbot

    server_name svija.love;
    listen 80;
    return 404; # géré par Certbot
}

Ceci a été ajouté automatiquement par Certbot.

Je m'attendrais à ce que la déclaration if ($host = svija.love) capture la requête http et redirige vers HTTPS.

Mais cela ne fonctionne pas de cette manière.

Ne étant pas expert, il me semble que la deuxième partie, commençant par server_name svija.love, est en contradiction directe avec la première partie:

  • le premier bloc redirige si l'hôte est svija.love
  • le deuxième bloc renvoie 404 si l'hôte est svija.love

Le nom de serveur réel configuré est live.svija.love, si cela fait une différence.

Toute clarification serait grandement appréciée.

[MISE À JOUR] J'ai supprimé le fichier de configuration par défaut de NginX et maintenant HTTP redirige vers HTTPS comme prévu.

Cependant, si quelqu'un peut expliquer les deux blocs de configuration ci-dessus, j'aimerais mieux comprendre ce qu'ils font.

[MISE À JOUR] Ce n'était pas une bonne solution (voir ci-dessous).

[MISE À JOUR] Voici la configuration donnée par nginx -T:

# fichier de configuration /etc/nginx/nginx.conf:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
    worker_connections 768;
    # multi_accept on;
}

http {

    ##
    # Paramètres de base
    ##

    sendfile off;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # server_tokens off;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # Paramètres SSL
    ##

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Suppression de SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;

    ##
    # Paramètres de journalisation
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Paramètres de Gzip
    ##

    gzip on;

    # gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    ##
    # Configurations d'hôte virtuel
    ##

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

# fichier de configuration /etc/nginx/modules-enabled/50-mod-http-image-filter.conf:
load_module modules/ngx_http_image_filter_module.so;

# fichier de configuration /etc/nginx/modules-enabled/50-mod-http-xslt-filter.conf:
load_module modules/ngx_http_xslt_filter_module.so;

# fichier de configuration /etc/nginx/modules-enabled/50-mod-mail.conf:
load_module modules/ngx_mail_module.so;

# fichier de configuration /etc/nginx/modules-enabled/50-mod-stream.conf:
load_module modules/ngx_stream_module.so;

# fichier de configuration /etc/nginx/mime.types:

server {

    # doit correspondre au nom de domaine ou à l'adresse IP
    # sinon la page par défaut de Nginx sera affichée
    server_name antretoise.svija.site;

    # répertoire des éléments statiques du site
    location /static/ {
        root /home/antretoise;
    }

    access_log /opt/logs/access.antretoise;
    error_log /opt/logs/error.antretoise error;

    # transmettre toutes les requêtes supplémentaires à notre application
    location / {

        # paramètres de /etc/nginx/uwsgi_params
        include uwsgi_params;

        # transmettre le trafic au socket
        # que le serveur uWSGI met en place
        # LES SOCKETS DOIVENT CORRESPONDRE DANS:
        # /etc/uwsgi/sites/antretoise.ini
        uwsgi_pass unix:/run/uwsgi/antretoise.sock;
    }

    listen 443 ssl; # géré par Certbot
    ssl_certificate /etc/letsencrypt/live/antretoise.svija.site/fullchain.pem; # géré par Certbot
    ssl_certificate_key /etc/letsencrypt/live/antretoise.svija.site/privkey.pem; # géré par Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # géré par Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # géré par Certbot
}

server {
    if ($host = antretoise.svija.site) {
        return 301 https://$host$request_uri;
    } # géré par Certbot

    listen 80;
    server_name antretoise.svija.site;
    return 404; # géré par Certbot
}

# fichier de configuration /etc/nginx/uwsgi_params:

uwsgi_param  QUERY_STRING       $query_string;
uwsgi_param  REQUEST_METHOD     $request_method;
uwsgi_param  CONTENT_TYPE       $content_type;
uwsgi_param  CONTENT_LENGTH     $content_length;

uwsgi_param  REQUEST_URI        $request_uri;
uwsgi_param  PATH_INFO          $document_uri;
uwsgi_param  DOCUMENT_ROOT      $document_root;
uwsgi_param  SERVER_PROTOCOL    $server_protocol;
uwsgi_param  REQUEST_SCHEME     $scheme;
uwsgi_param  HTTPS              $https if_not_empty;

uwsgi_param  REMOTE_ADDR        $remote_addr;
uwsgi_param  REMOTE_PORT        $remote_port;
uwsgi_param  SERVER_PORT        $server_port;
uwsgi_param  SERVER_NAME        $server_name;

ssl_session_cache shared:le_nginx_SSL:10m;
ssl_session_timeout 1440m;
ssl_session_tickets off;

ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;

ssl_ciphers "EC-AES128-SHA";

#———————————————————————————————————————— par défaut

server {
    listen 80 server par défaut;
    listen [::]:80 server par défaut;

    root /var/www/html;

    # Ajouter index.php à la liste si vous utilisez PHP
    index index.html index.htm index.nginx-debian.html;

    server_name _;

    location / {
        # Première tentative de servir la requête en tant que fichier, puis
        # en tant que répertoire, puis recourir à l'affichage d'une erreur 404.
        try_files $uri $uri/ =404;
    }

}

#———————————————————————————————————————— svija.love

server {

    server_name svija.love;

    # répertoire des éléments statiques du site
    location /static/ {
        root /home/svijalove;
    }

    access_log /opt/logs/access.svijalove;
    error_log /opt/logs/error.svijalove error;

    # transmettre toutes les requêtes supplémentaires à notre application
    location / {

        # paramètres de /etc/nginx/uwsgi_params
        include uwsgi_params;

        # transmettre le trafic au socket
        # que le serveur uWSGI met en place
        # LES SOCKETS DOIVENT CORRESPONDRE DANS:
        # /etc/uwsgi/sites/svijalove.ini
        uwsgi_pass unix:/run/uwsgi/svijalove.sock;
    }

    listen 443 ssl; # géré par Certbot
    ssl_certificate /etc/letsencrypt/live/svija.love/fullchain.pem; # géré par Certbot
    ssl_certificate_key /etc/letsencrypt/live/svija.love/privkey.pem; # géré par Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # géré par Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # géré par Certbot
}

server {
    if ($host = svija.love) {
        return 301 https://$host$request_uri;
    } # géré par Certbot

    server_name svija.love;
    listen 80;
    return 404; # géré par Certbot
}

# 6 autres sites à la fin, tous configurés de la même manière
# sauf que dans les deux dernières lignes,
# listen 80; est parfois listé AVANT return 404;

2voto

Tero Kilkanen Points 32968

Si aucun hôte virtuel correspondant à l'en-tête Host de la requête n'est trouvé, nginx servira le contenu de l'hôte virtuel par défaut.

Dans votre cas, votre hôte virtuel correspond au champ Host avec svija.love. Cependant, il semble que vous faisiez des tests avec live.svija.love.

Étant donné que nginx ne peut pas trouver l'hôte virtuel correspondant, il utilise l'hôte virtuel par défaut.

Après avoir supprimé la configuration de l'hôte virtuel par défaut, nginx utilise votre hôte virtuel comme hôte virtuel par défaut. Ce n'est pas une bonne pratique. N'importe qui pourrait configurer un enregistrement DNS pour un domaine qui pointe vers votre site web. Le résultat final serait que http://example.com afficherait le contenu de http://live.svija.love.

Cela pourrait entraîner des pénalités de Google pour contenu dupliqué.

Pour éviter cela, vous devriez restaurer l'hôte virtuel par défaut et ajuster votre configuration actuelle pour le server_name correct.

0voto

DarthNoodles Points 283

J'ai résolu le problème sans vraiment le comprendre.

Il y a sept sites web sur mon serveur, et six fonctionnent correctement (le http redirige vers le https comme prévu).

Les sept sites contiennent un bloc à la fin de leurs fichiers de configuration NginX ressemblant à ceci:

server {

# redirige le trafic de http vers https pour chaque domaine pertinent

    if ($host = svija.love) {
        return 301 https://$host$request_uri;
    } # géré par Certbot

# garantit que les demandes capturées ne sont pas redirigées par inadvertance

    listen 80;
    server_name svija.love;
    return 404; # géré par Certbot
}

Le serveur réel est live.svija.love, mais le site web qui posait problème est simplement svija.love (il n'y a pas de site configuré pour live.svija.love).

Il est devenu évident que le problème était causé par la ligne suivante qui n'était pas évaluée correctement:

if ($host = svija.love) {

En parenthèse, il n'y avait pas de configuration IPv6 pour le serveur (live.svija.love), et il y avait une configuration IPv6 pour le site web (svija.love), ce qui ne devrait pas exister.

J'ai ajouté l'enregistrement IPv6 pour le serveur, et je l'ai supprimé pour le site web.
Cela n'a pas résolu le problème.

Ensuite, j'ai pensé que peut-être la variable $host était définie sur live.svija.love (qui sait pourquoi), alors j'ai essayé un test où j'ai changé

if ($host = svija.love) {

par

if ($host = live.svija.love) {

Comme prévu, la page par défaut de NginX a été remplacée par une erreur 404 (voir le bloc de configuration ci-dessus).

Donc, j'ai remis

if ($host = live.svija.love) {

et désormais tout fonctionne correctement. Les requêtes HTTP vers svija.love sont redirigées vers https://svija.love et mon problème est résolu.

Je suppose qu'il y avait une sorte de mécanisme de mise en cache DNS dans NginX qui ne fonctionnait pas, peut-être parce que j'avais changé le nom du serveur à un moment donné dans le passé.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X