nginx: reescreva todos, exceto um local

9

Neste momento, meu nginx está reescrevendo vários domínios em um domínio principal que estamos usando. Aqui está uma regra da minha configuração:

server {
  listen X.X.X.X:80;
  server_name .exampleblog.org;
  rewrite ^(.*) http://blog.example.org$1 permanent;
}

Toda solicitação para ** exampleblog.org * é redirecionada para blog.example.org

Agora eu quero www.exampleblog.org / + e exampleblog.org / + redirecionar o usuário para nossa página do Google Plus. Ele tentou versões diferentes de:

server {
  listen X.X.X.X:80;
  server_name .exampleblog.org;
  location /+ {
    rewrite ^ https://plus.google.com/12345678901234567890/ permanent;
  }
  rewrite ^(.*) http://blog.example.org$1 permanent;
}

Acima e outras versões apenas redirecionam para blog.example.org / + - o que estou fazendo errado?

    
por lorem monkey 16.11.2011 / 17:01

1 resposta

12

As diretivas no nginx não se aplicam necessariamente na ordem em que aparecem no arquivo de configuração. A reescrita no nível do servidor atua antes que um local seja selecionado e sempre corresponde, portanto, ele redirecionará tudo. Você precisa de um segundo local assim:

server {
  listen x.x.x.x:80;
  server_name .exampleblog.org;

  # Match /+ requests exactly    
  location = /+ {
    # I prefer return 301 instead of rewrite ^ <target> permanent,
    # but you can use either
    return 301 http://plus.google.com/1234567890/;
  }

  # Match everything else
  location / {
    return 301 http://blog.example.org$request_uri;
  }
}
    
por 16.11.2011 / 17:15