4 votes

Nginx redirige tous les domaines vers le sous-domaine www

J'ai une configuration nginx qui fonctionne comme prévu pour l'un de mes domaines, mais il y a un comportement de redirection bizarre lorsque je fais pointer un autre domaine vers mon serveur.

Question :
Je veux rediriger toutes les requêtes faites sur un site non-www vers la version www de mon site.

Eg :
http://example.com devrait être redirigé vers https://www.example.com
http://m.example.com devrait être redirigé vers https://www.example.com

Ma configuration fonctionne comme prévu pour example.com mais lorsque je donne un nom de domaine, disons cdn.test.com, à l'adresse IP de mon serveur avec un fichier de configuration distinct. Il redirige vers www.cdn.test.com

Voici ma configuration pour example.com :

    server{
        #redirect non-www to www
        listen 80;
        listen 443 ssl;
        server_name example.com;

        ssl_certificate .../cert.pem;
        ssl_certificate_key .../key.pem;   
        return 301 https://www.$host$request_uri;
    }

    server{
        #redirect request to the mobile site to the main site
        listen 80;
        server_name m.example.com;
        return 301 https://www.example.com$request_uri;
    }
    server{
        #redirect unsecure www to secure wwww
        listen 80;
        server_name www.example.com;
        return 301 https://$host$request_uri;
    }
    upstream backend {
        server 127.0.0.1:23042;
        server 127.0.0.1:23043 backup;   
     }
    server {
        listen 443 ssl;
        server_name www.example.com;

        access_log off;
        error_log off;

        ssl_certificate .../cert.pem;
        ssl_certificate_key .../key.pem;   

        location / {
            proxy_pass http://backend;
            proxy_redirect off;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header CF-IPCountry $http_cf_ipcountry;
        }

        location /static {
            alias .../app/static;
            expires 30d;
        }
    }

et voici la configuration pour cdn.test.com :

    server {
      listen 80;
      server_name cdn.test.com;
       root /home/.../files;
    }

0 votes

Utilice nginx -T (majuscules T ) pour visualiser l'ensemble de la configuration et s'assurer que l'option server_name cdn.test.com; Le bloc serveur est inclus. Il se comporte comme si ce dernier server est ignoré.

5voto

snowdude Points 2790

Dans votre configuration, commencez par server est le bloc default_server qui sera utilisé pour toutes les demandes qui ne correspondent pas à un serveur plus spécifique.

Plutôt que de return 301 https://www.$host$request_uri; dans le default_server, n'utilisez pas l'en-tête Host de la requête comme paramètre pour générer la redirection, car cela peut devenir toutes sortes de choses incorrectes, utilisez plutôt return 301 https://www.example.com$request_uri; pour toujours rediriger vers www.example.com

1 votes

Je ferais return 302 https://www.$server_name$request_uri; .

1 votes

@uav : Utilisation ou non de la redirection permanente avec une HTTP 301 réponse ou une autre des possibles Réponses de redirection HTTP tel que ` 302 | 303 | 307` dépend un peu de votre cas d'utilisation

0 votes

Oui, j'aime travailler avec les 302, car les redirections ne sont pas mises en cache par le navigateur. Je ne me soucie pas d'être moins bien classé dans Google. Pouvez-vous expliquer 303 et 307 ? S'agit-il de HTTP 2 binaire ?

0voto

Irfy Points 866

Vous pourriez le mettre en place comme moi

 server {
#redirect all naked domains to https and www
        if ($host = aihello.com) {
            return 301 https://www.aihello.com$request_uri;
        } 

#redirect all unsecure www to secure www
        if ($host = www.aihello.com) {
            return 301 https://www.aihello.com$request_uri;
        } 

    server_name aihello.com www.aihello.com default_server;

        listen [::]:80 ipv6only=on;
        listen 80 ;
        return 404; 

    }

0 votes

Il est plus performant d'utiliser des blocs séparés pour chaque domaine. Essayez toujours de éviter d'utiliser les instructions if si possible.

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