nginx: reescribe todo excepto una ubicación

11

En este momento mi nginx está reescribiendo varios dominios en un dominio principal que estamos usando. Aquí hay una regla de mi configuración:

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

Cada solicitud a ** exampleblog.org * se redirige a blog.example.org

Ahora quiero que www.exampleblog.org/+ y exampleblog.org/+ redirijan al usuario a nuestra página de Google Plus. Probó diferentes versiones 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;
}

Las versiones anteriores y otras solo redirigen a blog.example.org/+ : ¿qué estoy haciendo mal?

mono lorem
fuente

Respuestas:

14

Las directivas en nginx no se aplican necesariamente en el orden en que aparecen en el archivo de configuración. La reescritura a nivel del servidor actúa antes de seleccionar una ubicación, y siempre coincide, por lo que redirigirá todo. Necesita una segunda ubicación así:

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
fuente