Nginx: reescrevendo https: // para http: //

4

Estou tentando fazer com que o Nginx reescreva as solicitações recebidas para um site meu servidor prefixado com https:// to http:// (isso é porque um CMS usado neste site força URIs em vez de caminhos relativos - essencialmente quebrando o todo site, tornando imagens, scripts e folhas de estilo indisponíveis).

Atualmente, estou tentando atualizar uma diretiva existente implementada por um predecessor, mas me sinto limitado pelo meu conhecimento da sintaxe de configuração do Nginx. Aqui está o código:

if ($ssl_protocol = "") {
    rewrite ^   https://$http_host$request_uri? permanent;
}

A minha atual comentou este código para evitar reescritas forçadas de http:// to https:// , mas não posso reverter o processo sem interromper o site. Aqui está o que eu tentei até agora:

if ($ssl_protocol = "https") {
    rewrite ^   http://$http_host$request_uri? permanent;
}

e

# also tried ($ssl_protocol != "")
if (!($ssl_protocol = "")) {
    rewrite ^   http://$http_host$request_uri? permanent;
}

O primeiro não parece ter efeito. O HTML enviado para o cliente ainda faz solicitações HTTPS que não estão sendo reescritas.

O segundo trecho não parece ter qualquer efeito também - se eu entendi corretamente (embora eu ainda esteja um pouco surpreso), o Nginx não suporta negação booleana.

Qual seria a melhor maneira (ou uma maneira de trabalhar) para fazer isso?

EDIT: Eu tentei adicionar o código da resposta do @ NathanC; no entanto, essa reconfiguração incondicional causa um loop de redirecionamento. A ajuda ainda é apreciada.

    
por user3620306 09.05.2014 / 14:45

2 respostas

6

O caminho mais limpo seria:

if ( $scheme = "https" ) {
    return 301 http://example.com$request_uri

ou em algum lugar entre isso e Nathans answer, onde o seu bloco ssl padrão contém simplesmente o return 301 (qualquer que seja o bloco SSL, você terá que dar uma olhada no seu para ver como ele é implementado e adaptar) Nenhum ponto em fazer regex para um simples redirecionamento

return - link

edit: notei que há uma variável $https que pode ser usada na instrução if. Retorna " " se não for https :

if ( $https = "on" ) {
    ...

Lembre-se de que, durante as alterações de teste, você deve usar um 302 de redirecionamento temporário em vez de 301 permanente, para não prender o cabelo quando descobre que o consertou uma hora antes, mas as alterações não refletir no seu navegador:)

    
por 09.05.2014 / 15:45
0

Você nem precisa disso, pois pode forçar todo o tráfego de https a ser http da seguinte forma:

server {
        listen 443;
        ssl on;
        server_name example.com;
        rewrite ^(.*) http://example.com$1 permanent;
 }

Referência: link

    
por 09.05.2014 / 14:49

Tags