Question

Je vois que la documentation sur HttpRewriteModule de Nginx contient un exemple permettant de réécrire un domaine avec le préfixe www en un autre. domaine www-préfixé:

if ($host ~* www\.(.*)) {
  set $host_without_www $1;
  rewrite ^(.*)$ http://$host_without_www$1 permanent; # $1 contains '/foo', not 'www.mydomain.com/foo'
}

Comment puis-je faire l'inverse - réécrire un domaine sans préfixe www en un domaine avec préfixe www? Je pensais que je pourrais peut-être faire quelque chose comme ce qui suit, mais Nginx n'aime pas l'instruction if imbriquée.

if ($host !~* ^www\.) {                       # check if host doesn't start with www.
    if ($host ~* ([a-z0-9]+\.[a-z0-9]+)) {    # check host is of the form xxx.xxx (i.e. no subdomain)
        set $host_with_www www.$1;
        rewrite ^(.*)$ http://$host_with_www$1 permanent;
    }
}

Je souhaitais également que cela fonctionne pour tout nom de domaine sans indiquer explicitement à Nginx de réécrire domain1.com - > www.domain1.com, domain2.com - > www.domain2.com, etc., car j’ai un grand nombre de domaines à réécrire.

Était-ce utile?

La solution 3

Eh bien, je suppose que je n’ai pas vraiment besoin de l’extérieur "si". déclaration puisque je ne vérifie que les domaines de la forme xxx.xxx de toute façon. Ce qui suit fonctionne pour moi, même s’il n’est pas robuste. Faites-moi savoir s'il existe une meilleure solution.

    if ($host ~* ^([a-z0-9\-]+\.(com|net|org))$) {
        set $host_with_www www.$1;
        rewrite ^(.*)$ http://$host_with_www$1 permanent;
    }

Édition: ajout d'un trait d'union à l'expression régulière puisqu'il s'agit d'un caractère valide dans un nom d'hôte.

Autres conseils

Comme indiqué dans la documentation Nginx, vous devez éviter d'utiliser le < directive code> if dans Nginx dans la mesure du possible , car dès que vous avez un if dans votre configuration, votre serveur doit évaluer chaque requête pour déterminer si elle doit correspondre à cette <. code> si ou non.

Une meilleure solution serait plusieurs directives de serveur.

server {
        listen 80;
        server_name website.com;
        return 301 $scheme://www.website.com$request_uri;
}

server {
        listen 80;
        server_name www.website.com;
        ... 
}

Si vous essayez de servir un site compatible SSL (HTTPS), vous avez plus ou moins trois options différentes.

  1. Configurez plusieurs adresses IP en laissant chaque directive du serveur écouter sur leur propre adresse IP (ou différents ports, selon votre choix). Cette option nécessite des certificats SSL pour website.com et www.website.com . Vous disposez donc d'un certificat générique, d'un certificat UNI (à plusieurs domaines) ou tout simplement. deux certificats différents.
  2. Faites la réécriture dans l'application.
  3. Utilisez la directive si redoutée .

Il existe également une option permettant d'utiliser SNI, mais je ne suis pas sûr que cela est entièrement pris en charge à partir de maintenant .

if ($host !~* ^www\.) {
    rewrite ^(.*)$ http://www.$host$1 permanent;
}
if ($host ~* ^[^.]+\.[^.]+$) {
    rewrite ^(.*)$ http://www.$host$1 permanent;
}

Il est uniquement possible d'obtenir des noms d'hôte valides, car la requête ne parviendra jamais sur votre serveur. Autrement, vous n'avez pas besoin de créer votre propre logique de validation.

La documentation de nginx met en garde contre l'utilisation de if pour la réécriture. Veuillez consulter le lien ici: http://wiki.nginx.org/Pitfalls#Server_Name

HTTP & amp; HTTPS sans si conditions:

server {
    listen          80;
    listen          443;
    server_name     website.com;

    return 301 $scheme://www.website.com$request_uri;
}
server {
    listen          80;
    listen          443 default_server ssl;
    server_name     www.website.com;

    # Your config goes here #
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top