nginx: przepisz wszystkie oprócz jednej lokalizacji

11

Obecnie mój nginx przepisuje kilka domen na jedną domenę główną, której używamy. Oto jedna zasada z mojej konfiguracji:

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

Każde żądanie do ** exampleblog.org * jest przekierowywane na blog.example.org

Teraz chcę, aby www.exampleblog.org/+ i exampleblog.org/+ przekierowały użytkownika na naszą stronę Google Plus. Próbował różnych wersji:

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

Powyższe i inne wersje po prostu przekierowują na blog.example.org/+ - co robię źle?

lorem małpa
źródło

Odpowiedzi:

14

Dyrektywy w nginx niekoniecznie mają zastosowanie w kolejności, w jakiej występują w pliku konfiguracyjnym. Przepisywanie na poziomie serwera działa przed wybraniem lokalizacji i zawsze pasuje, więc przekieruje wszystko. Potrzebujesz drugiej lokalizacji, takiej jak:

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;
  }
}
kolbyjack
źródło