40 votes

Nginx réécrit le domaine sans préfixe www sur le domaine préfixé www

Je vois la Nginx HttpRewriteModule documentation est un exemple de réécriture d'une www précédé d'un domaine vers un non-www-le préfixe de domaine:

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éécriture d'un non-www précédé d'un domaine vers un www préfixe de nom de domaine? J'ai pensé que je pourrais peut-être faire quelque chose comme ce qui suit, mais Nginx n'aime pas imbriquée si l'instruction.

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;
    }
}

Aussi je voulais que cela fonctionne pour n'importe quel nom de domaine sans le dire explicitement Nginx réécrire domain1.com -> www.domain1.com, domain2.com -> www.domain2.com, etc. depuis que j'ai un grand nombre de domaines à réécrire.

62voto

Lars Points 401

Si possible, vous ne devez jamais utiliser le si la directive dans Nginx, car dès que vous avez un si dans votre configuration de votre serveur a besoin pour évaluer chaque demande de décider de match que si ou pas.

Lire sur http://docs.ngx.cc/en/latest/topics/tutorials/config_pitfalls.html

Une meilleure solution serait de multiples directives du 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 êtes en essayant de servir SSL (https), a permis de site, vous avez plus ou moins de trois options différentes.

  1. Configurer plusieurs adresses IP de chaque serveur de la directive à l'écoute sur leur propre IP (ou des ports différents, si c'est une option pour vous). Cette options besoins des certificats SSL pour les deux website.com et www.website.com, donc soit vous avez une wild-card, certificat, un UNI certificat (plusieurs domaines) ou simplement deux certificats différents.
  2. Faire de la réécriture de l'application.
  3. L'utilisation de la redoutable SI la directive.

Il y a aussi une option pour utiliser la SNI, mais je ne suis pas sûr que ce soit entièrement pris en charge comme de maintenant, il ya un peu plus d'informations ici: http://nginx.org/en/docs/http/configuring_https_servers.html#sni

15voto

ss. Points 366
if ($host !~* ^www\.) {
    rewrite ^(.*)$ http://www.$host$1 permanent;
}

14voto

saltycrane Points 1943

Eh bien, je suppose que je n'ai pas vraiment besoin de la déclaration externe "if" 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;
    }
 

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

6voto

Anthony DiSanti Points 162
 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. Il n'est donc pas nécessaire de créer votre propre logique de validation.

4voto

Robert Brown Points 61

La documentation de nginx met en garde contre l'utilisation de si pour la réécriture. S'il vous plaît voir le lien ici: http://wiki.nginx.org/Pitfalls#Server_Name

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X