AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 781576
Accepted
xpt
xpt
Asked: 2024-08-08 12:52:55 +0800 CST2024-08-08 12:52:55 +0800 CST 2024-08-08 12:52:55 +0800 CST

Redirecionado muitas vezes após adicionar certificado SSL ao nginx

  • 772

Antes de adicionar ssl_certificate, nginx.confé muito simples:

server {
    listen 80 default_server;

    index index.php index.html index.htm;

    location ~ [^/]\.php(/|$) {
        fastcgi_split_path_info  ^(.+\.php)(/.+)$;
        fastcgi_index            index.php;
        fastcgi_pass             php:9000;
        include                  fastcgi_params;
        fastcgi_read_timeout     1200s;
        fastcgi_param   PATH_INFO       $fastcgi_path_info;
        fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

Então segui aqui para configurar o letsencrypt com Nginx (substituindo [domain-name]por completo), e agora nginx.confparece:

server {
    listen 80 default_server;

    server_name [domain-name] www.[domain-name];
    server_tokens off;

    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }

    location / {
        return 301 https://[domain-name]$request_uri;
    }
}

server {
    listen 443 default_server ssl http2;
    listen [::]:443 ssl http2;

    server_name [domain-name];

    ssl_certificate /etc/nginx/ssl/live/[domain-name]/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/live/[domain-name]/privkey.pem;
    
    location / {
        proxy_pass http://[domain-name];
    }

    index index.php index.html index.htm;

    location ~ [^/]\.php(/|$) {
        fastcgi_split_path_info  ^(.+\.php)(/.+)$;
        fastcgi_index            index.php;
        fastcgi_pass             php:9000;
        include                  fastcgi_params;
        fastcgi_read_timeout     1200s;
        fastcgi_param   PATH_INFO       $fastcgi_path_info;
        fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

Veja as mudanças aqui – https://www.diffchecker.com/bAfVjewE/ ,

insira a descrição da imagem aqui

o que considero muito simples, direto e razoável.

No entanto, meu site php está completamente quebrado - meu navegador Chrome diz que entra em redirecionamento infinito ( "redirecionou você muitas vezes" ), consulte as Notas 2.

Qual pode ser a causa e correção?

Notas,

  1. A adição de ssl_certificate é adequada, mas o redirecionamento infinito existe mesmo quando testei com um site vazio.
  2. Quando ocorre um redirecionamento interminável, os logs do nginx continuaram imprimindo nada além de ...[08/Aug/2024:15:xx:yy +0000] "GET / HTTP/1.1" 301 162 "-" "Mozilla/5.0 (X11; Linux x86_64)..., mesmo tendo visto que o protocolo no meu navegador mudou de httppara https.

Se eu visitá-lo com curl, estou recebendo:

$ curl -i https://my.site.name:443/
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Thu, 08 Aug 2024 15:42:45 GMT
Content-Type: text/html
Content-Length: 162
Connection: keep-alive
Location: https://my.site.name/

<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>

e o log do servidor é:

[08/Aug/2024:15:42:45 +0000] "GET / HTTP/1.1" 301 162 "-" "curl/8.5.0" "my.ip"
[08/Aug/2024:15:42:45 +0000] "GET / HTTP/1.1" 301 162 "-" "curl/8.5.0" "-"

E o log de erros está vazio, pois é assim que meu log ngix está configurado:

cd /var/log/nginx/

root@5b6a9033cb31:/var/log/nginx# ls -l
total 0
lrwxrwxrwx 1 root root 11 Jul 23 07:14 access.log -> /dev/stdout
lrwxrwxrwx 1 root root 11 Jul 23 07:14 error.log -> /dev/stderr
nginx
  • 1 1 respostas
  • 50 Views

1 respostas

  • Voted
  1. Best Answer
    Stina Andersson
    2024-08-09T11:03:28+08:002024-08-09T11:03:28+08:00

    O problema é que o primeiro bloco do servidor escuta na porta 80 (HTTP) e redireciona todo o tráfego para HTTPS (https://[nome-do-domínio]$request_uri).

    O segundo bloco de servidor escuta na porta 443 (HTTPS) e faz proxy do tráfego de volta para o mesmo domínio (proxy_pass http://[nome-do-domínio];).

    Isso cria um loop de redirecionamento.

    Solicitações do usuário http://my.site.name

    O servidor redireciona para https://my.site.name

    O servidor HTTPS faz proxy da solicitação de volta para http://my.site.name

    O servidor HTTP redireciona para https://my.site.name

    E o ciclo continua....

    Para corrigir isso , você deve certificar-se de que o servidor HTTPS não esteja fazendo proxy de volta para o servidor HTTP. Em vez disso, deve servir o conteúdo diretamente.

    Assim:

    server {
        listen 80 default_server;
        server_name [domain-name] www.[domain-name];
        server_tokens off;
    
        location /.well-known/acme-challenge/ {
            root /var/www/certbot;
        }
    
        location / {
            return 301 https://$host$request_uri;
        }
    }
    
    server {
        listen 443 default_server ssl http2;
        listen [::]:443 ssl http2;
        server_name [domain-name];
    
        ssl_certificate /etc/nginx/ssl/live/[domain-name]/fullchain.pem;
        ssl_certificate_key /etc/nginx/ssl/live/[domain-name]/privkey.pem;
    
        root /var/www/html;  # Adjust this path to your web root if needed
    
        index index.php index.html index.htm;
    
        location / {
            try_files $uri $uri/ /index.php?$query_string;
        }
    
        location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass php:9000;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
    }
    

    Então, try_files $uri $uri/ /index.php?$query_string; no bloco HTTPS garante que as solicitações sejam atendidas corretamente sem a necessidade de proxy de volta para HTTP.

    O bloco location ~ .php$ { ... } é definido para manipular arquivos PHP diretamente no servidor HTTPS.

    O retorno 301 https://$host$request_uri; no bloco HTTP garante que todas as solicitações HTTP sejam redirecionadas para HTTPS.

    Corrija o código, execute nginx -s reloade deve funcionar.

    ############### EDITADO ################

    Você não precisa remover o proxy reverso Nginx para corrigir o problema. Você ainda pode se beneficiar do proxy reverso garantindo que o proxy ocorra dentro do mesmo protocolo (ou seja, HTTPS).

    Uma abordagem é ajustar a diretiva proxy_pass no bloco do servidor HTTPS para usar https:// em vez de http://. Isso garante que, uma vez redirecionado o tráfego para HTTPS, ele permaneça dentro do contexto HTTPS, evitando o loop:

    location / {
        proxy_pass https://[domain-name];
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
    

    Dessa forma, você ainda pode aproveitar os benefícios do proxy reverso do Nginx enquanto resolve o problema do loop de redirecionamento. Se precisar de mais ajuda com esta configuração, sinta-se à vontade para entrar em contato!

    • 2

relate perguntas

  • nginx falha na instalação no Debian estável

  • Nginx gzip_types - uma diretiva redundante em alguns casos?

  • Configuração php-fpm independente da versão Nginx

  • Localização do Nginx ~ /\.ht

  • Hospedando vários aplicativos no Nginx Ubuntu 14.04

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve