Blocos de servidores Nginx: https, sub-domínio não-www e não-ssl

2

Este é o meu cenário:

Dois sites:

  1. https://example.com
  2. http://dev.example.com

O site 1 tem um certificado ssl.
O site 2 não.
(Em outras palavras, eu não tenho um certificado SSL de caractere curinga.)

Via Nginx Estou tentando estabelecer os redirecionamentos necessários de www e HTTP .

O objetivo do site 1 é direcionar

example.com , www.example.com e https://www.example.com

... para

https://example.com

Objetivo do site 2 é simplesmente deixar http://dev.example.com direcionar para si mesmo.

O que tentei para o objetivo 1

# SSL Redirect
server {
  listen 80;
  server_name example.com;
  return 301 https://filethemes.com$request.com;
}

# WWW Redirect
server {
  listen 80;
  listen 443 ssl;
  server_name www.example.com
  ssl_certificate <my-path-here>.crt;
  ssl_certificate_key <my-path-here>.key;
  return 301 https://example.com$request_uri
}

# Site's Primary Server Block
server {
  listen 443 ssl;
  root /var/www/example.com;
  index index.html;
  server_name example.com;
  ssl_certificate <my-path-here>.crt;
  ssl_certificate_key <my-path-here>.key;  
}

Com o código acima, example.com vai para o link ', mas é só isso. O redirecionamento www não está funcionando. alguma ideia do por que?

Além disso, com um simples bloqueio de servidor para o site 2 (o subdomínio dev.example.com ), ele redireciona para https://example.com . Parece que estou inadvertidamente redirecionando meu subdomínio para o domínio principal. Idéias?

Eu sei que já há uma série de perguntas e respostas sobre o Nginx, mas não encontrei nenhuma solução que me ajudasse a fazer as coisas funcionarem como desejado.

Para um objetivo aparentemente tão simples, é surpreendente como isso é desafiador.

Sou grato por qualquer insight que as pessoas possam oferecer.

PS: Sim, meu certificado SSL suporta www e não www.

UPDATE:
O problema do subdomínio (site 2 acima) não é mais um problema ... Não consegui vincular novamente o arquivo apropriado dos sites disponíveis para sites habilitados.

Ainda tendo os mesmos problemas com o site 1, não redirecionando de www - naked, com http e com https .

RESOLVIDO (!)
O problema? Nenhuma entrada de CNAME de DNS (palma da cara!). Muito obrigado ao @ BE77Y por me ajudar a encontrar o problema. Além disso, no caso de ajudar os outros, aqui está minha configuração nginx atual e totalmente funcional, que consiste em dois blocos de servidor, com um que cuida de todos os redirecionamentos para o não www e https (e usa as melhores práticas do NGINX escreve e não se declarações):

# MAIN SERVER BLOCK
server {
  listen 443 ssl;
  root /var/www/example.com;
  index index.html;
  server_name example.com;
  ssl_certificate <my-path-here>.crt;
  ssl_certificate_key <my-path-here>.key;  
}

# REDIRECTS (send everything to non-www https)
server {
  listen 80;
  listen 443;
  server_name www.example.com example.com;
  ssl_certificate <my-path-here>.crt;
  ssl_certificate_key <my-path-here>.key;
  return 301 https://example.com$request_uri;
}

Gotchas (para outras pessoas que normalmente não trabalham com servidores):

  • limpar o cache (ou abrir e fechar janelas anônimas) entre os testes
  • verifique se você tem uma entrada DNS CNAME (www exemplo.com.)!
por Isaac Gregson 03.12.2014 / 17:56

1 resposta

1

Você está quase lá do que eu vejo; Eu apenas configuraria as coisas de maneira um pouco diferente (com base nos seus requisitos descritos), apenas para simplificar um pouco as coisas. Uma coisa que eu gostaria de esclarecer é que você não parece ter incluído um segmento dev.example.com na sua configuração?

Independentemente disso, veja como eu melhoraria sua configuração atual:

# Primary block including SSL redirect
server {
  listen 80;
  listen 443 ssl;
  server_name example.com;

  root /var/www/example.com;
  index index.html;

  ssl_certificate <my-path-here>.crt;
  ssl_certificate_key <my-path-here>.key;

  if ( $scheme = http ){
            rewrite ^ https://$server_name$request_uri? permanent;
            }
 }

# WWW Redirect
server {
  listen 80;
  listen 443 ssl;
  server_name www.example.com
  ssl_certificate <my-path-here>.crt;
  ssl_certificate_key <my-path-here>.key;
  rewrite ^ https://example.com$request_uri? permanent;
}

Para esclarecer o que precede: esta é uma maneira "limpa" de fazer as coisas; se alguém solicitar seu site em http://example.com , eles serão redirecionados para https://example.com pela declaração if e, da mesma forma, serão veiculados corretamente no site se solicitá-lo via https (o que seria um problema com declarações separadas como você teve antes). Se eles tentarem acessar o site por meio de http://www.example.com , serão redirecionados ou, via https://www.example.com , negociarão corretamente o SSL, mas ainda serão redirecionados como acima.

Como eu notei, você não incluiu nenhum segmento relacionado ao dev.example.com em seu arquivo de configuração - presumo que isso seja porque você já está trabalhando, mas se não, por favor sinta-se à vontade para comentar sobre isso e eu Ficarei feliz em ajudá-lo a incluí-los nos itens acima.

Espero que ajude!

    
por 03.12.2014 / 18:33