
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 $https
que 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 302
redirecionamento temporário em vez de 301
permanente, 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