Estou executando um aplicativo Sinatra por trás do passageiro / nginx. Estou tentando fazer com que ele responda às chamadas http e https. O problema é que, quando ambos são definidos no bloco do servidor, as chamadas https são respondidas normalmente, mas o http produz um erro 400 "A solicitação HTTP simples foi enviada para a porta HTTPS". Isso é para uma página estática, então estou supondo que Sinatra não tem nada a ver com isso. Alguma ideia de como consertar isso?
Este é o bloco do servidor:
server {
listen 80;
listen 443 ssl;
server_name localhost;
root /home/myhome/app/public;
passenger_enabled on;
ssl on;
ssl_certificate /opt/nginx/ssl_keys/ssl.crt;
ssl_certificate_key /opt/nginx/ssl_keys/ssl.key;
ssl_protocols SSLv3 TLSv1;
ssl_ciphers HIGH:!aNULL:!MD5;
location /static {
root /home/myhome/app/public;
index index.html index.htm index.php;
}
error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
error_page 500 /500.html;
access_log /home/myhome/app/logs/access.log;
error_log /home/myhome/app/logs/error.log;
}
my.example.com:443
não funcionou. Mudar isso em vez dehttps://my.example.com
funcionar. Estranho, nunca tive esse problema com o apache.ssl on;
diz ao NGINX para servir QUALQUER conteúdo por meio de SSL. Use a sinalização "ssl" no final do seu,listen 443;
por exemplo,listen 443 ssl;
se o seu servidor entregar tráfego http e https, e remova assl on;
diretiva.Respostas:
Eu encontrei um problema semelhante. Ele funciona em um servidor e não em outro servidor com a mesma configuração Nginx. Encontrou a solução respondida por Igor aqui http://forum.nginx.org/read.php?2,1612,1627#msg-1627
Sim. Ou você pode combinar servidores SSL / não SSL em um servidor:
fonte
ssl off;
ssl on;
(não há necessidade de adicionar SSL off). Além disso, como não me lembro qual versão do Nginx, não há mais necessidade de usardefault
on-listen 443
line. Então a configuração do OP estava OK, só precisa removerssl on
e deve funcionar.ssl on
. A resposta de @MichaelJ.Evans abaixo é uma solução muito melhor.As respostas acima estão incorretas no sentido de que a maioria substitui o teste 'esta conexão é HTTPS' para permitir a exibição das páginas por http, independentemente da segurança da conexão.
A resposta segura usando uma página de erro em um código de erro http 4xx específico do NGINX para redirecionar o cliente para tentar novamente a mesma solicitação para https. (conforme descrito aqui /server/338700/redirect-http-mydomain-com12345-to-https-mydomain-com12345-in-nginx )
O OP deve usar:
fonte
nginx['custom_gitlab_server_config'] = "error_page 497 https://$host:$server_port$request_uri;"
fez o truqueO erro diz tudo na verdade. Sua configuração diz ao Nginx para escutar na porta 80 (HTTP) e usar SSL. Quando você aponta seu navegador para
http://localhost
, ele tenta se conectar via HTTP. Como o Nginx espera SSL, ele reclama do erro.A solução alternativa é muito simples. Você precisa de duas
server
seções:fonte
Eu tive exatamente o mesmo problema, tenho meio que a mesma configuração do seu exemplo e o fiz funcionar removendo a linha:
ssl on;
Para citar o documento:
fonte
De acordo com o artigo da Wikipedia sobre códigos de status . O Nginx tem um código de erro personalizado quando o tráfego http é enviado para a porta https (código de erro 497)
E de acordo com a documentação do nginx em error_page , você pode definir um URI que será mostrado para um erro específico.
Assim, podemos criar um uri para o qual os clientes serão enviados quando o código de erro 497 for gerado.
nginx.conf
No entanto, se um cliente fizer uma solicitação por meio de qualquer outro método, exceto GET, essa solicitação será transformada em GET. Assim, para preservar o método de solicitação por meio do qual o cliente entrou; usamos redirecionamentos de processamento de erro, conforme mostrado em documentação do nginx em error_page
E é por isso que usamos o
301 =307
redirecionamento.Usando o arquivo nginx.conf mostrado aqui, podemos fazer com que http e https escutem na mesma porta
fonte
Aqui está um exemplo para configurar HTTP e HTTPS no mesmo bloco de configuração com suporte a ipv6 . A configuração é testada no Ubuntu Server e NGINX / 1.4.6, mas deve funcionar com todos os servidores.
Não inclua, o
ssl on
que pode causar400
erro. A configuração acima deve funcionar paraEspero que isto ajude!
fonte
se usar phpmyadmin add: fastcgi_param HTTPS on;
fonte
Na verdade, você pode fazer isso com:
Isso resolveu meu problema de usar nginxvhosts; agora posso usar SSL e HTTP simples. Funciona mesmo com portas combinadas.
fonte