Como não redirecionar se solicitar apenas o server_name

1

A maioria das pessoas digita na barra do navegador: mysite.com e não https://mysite.com .

Muitos desenvolvedores, inclusive eu, têm algo parecido com isso no arquivo de configuração do Nginx, o que significa que essa solicitação mysite.com causa um redirect para o https:// site:

server {
    listen 80;
    server_name mysite.com;
    return 301 https://$server_name$request_uri;

}

A equipe do Google pagespeed disse recentemente [ref] esses redirecionamentos são péssimos para o desempenho, principalmente no celular, porque o redirect causa o pedido para voltar pela rede da operadora de celular.

Minha pergunta é se existe alguma outra maneira de escrever o nginx.conf de tal forma que as pessoas que digitarem o server_name não experimentem essa http:// para https:// de penalidade de redirecionamento?

    
por tim peterson 22.07.2013 / 17:48

2 respostas

4

Não, isso exigiria que você alterasse o comportamento do navegador. É tudo baseado em resposta de solicitação. O usuário digita example.com em sua barra do navegador e o navegador adiciona automaticamente http:// na frente disso. Portanto, seu servidor sempre obterá a primeira solicitação em http://example.com e você só poderá responder com um redirecionamento para seu endereço SSL ativado se não houver nada sem SSL.

Negar o pedido, como proposto por Nathan, não é uma opção. Porque o navegador irá exibir uma página de erro que este site não está acessível e pode até não existir.

Mas há outra coisa que você pode fazer: Segurança de Transporte Restrita HTTP (HSTS)

O HSTS informa ao navegador que seu site só pode ser acessado via SSL e que as solicitações subsequentes devem sempre ser preenchidas automaticamente com https:// em vez de http:// . Você pode conseguir isso no nginx com as seguintes linhas no seu bloco de servidor SSL:

add_header Strict-Transport-Security "max-age=262974383";
http {
  # One server listening on port 80 and sending the redirect to HTTPS
  server {
    server_name example.com;
    return 301 https://$server_name$request_uri;
  }

  # Our actual server handling incoming requests.
  server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate      /etc/ssl/my_site.pem;
    ssl_certificate_key  /etc/ssl/my_site.key;
    # Tell the browser that he should always visit us with SSL.
    add_header Strict-Transport-Security "max-age=262974383";
  }
}
    
por 22.07.2013 / 20:20
1

Ou não escute na porta 80 (que lançará um erro) ou negue a solicitação:

server {
    listen 80;
    server_name mysite.com;
   location / {
  deny    all;
}
}

Depois é só ter o bloco normal de 443.

    
por 22.07.2013 / 18:00