Rota de redirecionamento Nginx para subdomínio

1

Estou tentando redirecionar 15 rotas diferentes com o Nginx de pastas para subdomínios (já li alguns tópicos sobre isso).

Estou muito confuso porque este redirecionamento está funcionando:

rewrite ^/admin(.*) $scheme://admin.example.com/$1 301;

enquanto este não é (a URL não é alterada no meu navegador):

rewrite ^/app(.*) $scheme://apps.example.com/$1 301;

O que eu senti falta?

Na época, eu tenho apenas esses 2 redirecionamentos (eu preciso de mais 15 complicados depois).

EDITAR : mais explicações com minha configuração completa do nginx

server {
  listen 80 default_server;
  listen [::]:80 default_server;

  server_name example.com;
  passenger_enabled on;
  rails_env    production;
  root         /home/admin/rails/current/public;

  # redirect server error pages to the static page /50x.html
  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
    root   html;
  }


  # redirects
  # admin
  rewrite ^/admin(.*) $scheme://admin.example.com/$1 302;

  # apps    
  rewrite ^/app(.*) $scheme://apps.example.com/$1 302;

}

EDIT 2 : perguntado por Tom, o que eu quero fazer exatamente (eu prefiro manter o URL secreto):

GET http://example.com => http://apps.example.com
GET http://example.com/app => http://apps.example.com
GET http://example.com/app/iphone => http://apps.example.com/iphone
GET http://example.com/app/ipad => http://apps.example.com/ipad
GET http://example.com/support/iphone => http://apps.example.com/support/iphone
GET http://example.com/support/ipad => http://apps.example.com/support/ipad
GET http://example.com/legal/privacy?params=toto => http://apps.example.com/legal/privacy?params=toto
GET http://example.com/legal/terms?params=toto => http://apps.example.com/legal/terms?params=toto
GET http://example.com/legal/about => http://apps.example.com/legal/about

Eu também tenho alguns POST para redirecionar, mas eu acho que preciso de um proxy para isso, não é?

Obrigado antecipadamente.

EDIT 3 : aqui estão os meus redirecionamentos GET depois da resposta do Tom:

  # pages to redirect to admin.$host
  location /admin { return 301 $scheme://admin.$host; }

  # pages to redirect to apps.$host
  location /app { return 301 $scheme://apps.$host; }
  location /app/iphone { return 301 $scheme://apps.$host/iphone; }
  location /app/ipad { return 301 $scheme://apps.$host/ipad; }
  location /support/iphone { return 301 $scheme://apps.$host/support/iphone$is_args$args; }
  location /support/ipad { return 301 $scheme://apps.$host/support/ipad$is_args$args; }
  location /legal/privacy { return 301 $scheme://apps.$host/legal/privacy$is_args$args; }
  location /legal/terms { return 301 $scheme://apps.$host/legal/terms$is_args$args; }
  location /legal/about { return 301 $scheme://apps.$host/legal/about; }

Está funcionando muito bem!

Agora, vou abrir um novo segmento porque não consigo criar redirecionamento POST com meu proxy_pass. Consulte .

    
por alex.bour 07.01.2016 / 22:08

1 resposta

1

Use redirecionamentos 302 durante o teste, os 301s são armazenados em cache. Limpe o cache do seu navegador e reinicie-o. Mude os 302's para 301 quando estiver satisfeito com a sua configuração.

Tente isto - eu dei alguns exemplos postados e você pode trabalhar o resto. Você deve ler o pedido de avaliação dentro do nginx , mas para correspondências exatas não é importante - só se aplica a correspondências de expressões regulares.

Note que isso deve fazer o que você pediu, o que pode não ser o que você quer - note que você não incluiu uma barra no seu exemplo.

Parece também que você quer redirecionar tudo para o domínio do aplicativo, é esse o caso? Se assim for, é muito mais fácil. Mas aqui está o que você pediu, testado.

location /support/ipad {
  # change to 301 when you're 100% happy with all redirects
  return 302 http://example.com/support/ipad;
}

location /app/iphone {
  return 302 http://example.com/app/iphone;
}

location ~* ^/\Z {
  return 302 http://whatever;
}

Pode haver uma maneira mais eficiente de fazer isso com expressões regulares, mas fazê-las individualmente pode ser prudente se você não estiver redirecionando todo o domínio. Note que ~ * significa o que segue é uma expressão regular, que é avaliada depois daquelas que especificam um único URI preciso.

Com base no que você disse, é necessário que o redirecionamento raiz tenha uma expressão regular para garantir que ele apenas redirecione o domínio raiz, não por exemplo link . Se você quer tudo redirecionado, é mais fácil.

Além disso, você quis dizer isso? Observe as barras à direita

GET http://example.com/ => http://apps.example.com/

^ significa "início do URI", que é o URL sem o site. Isso significa que ele corresponderá apenas à raiz do site, não a qualquer pasta. / Z significa "fim do URI". Você pode gerar informações de depuração nos cabeçalhos do navegador para ajudar com isso

location whatever {
  add_header Z_LOCATION "(any text you want)";
  add_header URI $uri;
}
    
por 07.01.2016 / 22:16