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

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

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

Atualmente, estou tentando modernizar uma diretiva existente implementada por um antecessor, mas estou 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;
}

Atualmente comentei este código para evitar reescritas forçadas de http://to https://, mas não posso reverter o processo sem quebrar o site. Aqui está o que 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 parece não surtir efeito. O HTML enviado ao cliente ainda faz solicitações HTTPS que não estão sendo reescritas.

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

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

EDITAR:Tentei adicionar o código da resposta de @NathanC; entretanto, essa reescrita incondicional causa um loop de redirecionamento. A ajuda ainda é apreciada.

Responder1

A maneira mais limpa seria:

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

ou em algum lugar entre isso e a resposta de Nathan, onde seu bloco de servidor SSL padrão contém simplesmente oreturn 301 (seja qual for o bloco SSL, você terá que dar uma olhada no seu para ver como ele é implementado e se adapta)Não adianta fazer regex para um redirecionamento simples

return-http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#return

editar: acabei de notar que há uma variável $httpsque pode ser usada na instrução if.Retorna " "se não for https:

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

Lembre-se de que, ao testar as alterações, você deve usar um 302redirecionamento temporário em vez de 301permanente, para evitar complicações quando descobrir que corrigiu o problema uma hora antes, mas as alterações não foram refletidas no seu navegador :)

Responder2

Você nem precisa disso, pois pode simplesmente forçar todo o tráfego https a se tornar http assim:

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

Referência:https://stackoverflow.com/questions/3470290/nginx-redirect-https-to-http

informação relacionada