web-dev-qa-db-fra.com

nginx.conf redirige plusieurs conditions

Je souhaite rediriger des demandes sur deux conditions à l'aide de nginx. 

Cela ne marche pas:

  if ($Host = 'domain.com' || $Host = 'domain2.com'){
    rewrite ^/(.*)$ http://www.domain.com/$1 permanent;
  }   

Quelle est la bonne façon de faire cela?

44
mark

J'ai eu ce même problème avant. Nginx ne pouvant pas créer de conditions complexes ni d’instructions if imbriquées, vous devez évaluer plus de 2 expressions différentes.

définissez une variable sur une valeur binaire, puis activez-la si l'une des conditions est vraie dans 2 déclarations if différentes:

set $my_var 0;
if ($Host = 'domain.com') {
  set $my_var 1;
}
if ($Host = 'domain2.com') {
  set $my_var 1;
}
if ($my_var = 1) {
  rewrite ^/(.*)$ http://www.domain.com/$1 permanent;
}   
80
Chris Barretto

La bonne façon serait d'utiliser un serveur dédié pour la redirection:

server {
  server_name domain.com domain2.com;
  rewrite ^ http://www.domain.com$request_uri? permanent;
}
21
kolbyjack

une autre possibilité serait

server_name domain.com domain2.com;
set $wanted_domain_name domain.com;
if ($http_Host != $wanted_domain_name) {
    rewrite  ^(.*)$  https://$wanted_domain_name$1;
}

de sorte qu'il va tout rediriger vers un spécifique, mais il est basé sur le cas d'utilisation je suppose

5
shadowdroid

Voici une approche déclarative:

server {
    listen       80;
    server_name  domain.com domain2.com;
    return 301 $scheme://www.domain.com$uri;    
}

server {
    listen       80  default_server;
    server_name  _;
    #....
}
4
Cole Tierney

Réécrire plusieurs domaines dans un seul domaine et éviter une condition de boucle dans le navigateur.

server {
    listen       80;
    server_name  www.wanted_domain.com wanted_domain.com www.un_wanted_domain.com un_wanted_domain.com;
    if ($Host = 'un_wanted_domain.com'){
       return 301 $scheme://www.wanted_domain.com$request_uri;
    }
    if ($Host = 'www.un_wanted_domain.com'){
       return 301 $scheme://www.wanted_domain.com$request_uri;
    }
3
David

Je pense que la façon la plus simple de le faire est d'utiliser simplement l'expression régulière:

if ($Host ~ "domain.com|domain2.com") {
    rewrite ^/(.*)$ http://www.example.com/$1 permanent;
}

Mais ce n’est bien que lorsque vous n’avez que des chaînes; pour la logique complexe, bien sûr, ce n'est pas correct.

1
Nikita_kharkov_ua