nginx loop infinito com try_files e índice

3

usando a seguinte configuração para o Nginx, estou percebendo que recebo um loop infinito de processamento de localização. Com base no meu entendimento dos documentos, esperaria que uma solicitação para http://localhost:8080 simplesmente retornasse meu arquivo index.html com base na minha diretiva index . Em vez disso, a solicitação é mapeada para location / em um loop, anexando a / a cada vez, com base no que eu vejo no meu cabeçalho X-debug. A saída da minha mensagem de depuração é:

X-debug-one:location / /////////// /var/www/content

Como você pode ver, o $ uri continua crescendo por algumas iterações. Qual é o objetivo da diretiva de indexação se não for respeitada? Eu esperaria que o índice fosse testado em algum momento do processo?

Aqui está minha configuração. Eu devo estar perdendo algo óbvio aqui. Apenas uma nota, isso está sendo executado de dentro de um contêiner do Docker, com o mapeamento de porta para 8080.

server {
  server_name _;
  listen 80 default_server;

  root /var/www/content;
  index index.html;

  access_log /dev/stdout;
  error_log /dev/stdout info;

  add_header X-debug-base "base $uri $document_root" always;

  location / {
    add_header X-debug-one "location / $uri $document_root" always;
    try_files $uri $uri/;
  }
}

Editar:

Aqui está a resposta do curl (curl -sSL -D - "localhost: 8080" -o / dev / null) tanto do Docker externo (localhost: 8080) quanto dentro do docker (localhost: 80)

HTTP/1.1 500 Internal Server Error
Server: nginx/1.10.3
Date: Sat, 06 Jan 2018 22:55:35 GMT
Content-Type: text/html
Content-Length: 193
Connection: close
X-debug-one: location / /////////// /var/www/content

Aqui estão os registros, capturando minha onda e acho que há uma solicitação do Chrome também.

unyozi_1    | 2018-01-06 22:57:23,869 DEBG 'nginx' stdout output:
unyozi_1    | 127.0.0.1 - - [06/Jan/2018:22:57:23 +0000] "GET / HTTP/1.1" 500 193 "-" "curl/7.52.1"
unyozi_1    | 
unyozi_1    | 2018-01-06 22:57:37,722 DEBG 'nginx' stdout output:
unyozi_1    | 2018/01/06 22:57:37 [error] 11#0: *13 rewrite or internal redirection cycle while internally redirecting to "////////////", client: 127.0.0.1, server: _, request: "GET / HTTP/1.1", host: "localhost"
unyozi_1    | 
unyozi_1    | 2018-01-06 22:57:37,722 DEBG 'nginx' stdout output:
unyozi_1    | 127.0.0.1 - - [06/Jan/2018:22:57:37 +0000] "GET / HTTP/1.1" 500 193 "-" "curl/7.52.1"
unyozi_1    | 
unyozi_1    | 2018-01-06 22:58:43,546 DEBG 'nginx' stdout output:
unyozi_1    | 2018/01/06 22:58:43 [error] 11#0: *14 rewrite or internal redirection cycle while internally redirecting to "/sockjs-node/info///////////", client: 172.19.0.1, server: _, request: "GET /sockjs-node/info?t=1515279507454 HTTP/1.1", host: "localhost:8080", referrer: "http://localhost:8080/"
unyozi_1    | 
unyozi_1    | 2018-01-06 22:58:43,547 DEBG 'nginx' stdout output:
unyozi_1    | 172.19.0.1 - - [06/Jan/2018:22:58:43 +0000] "GET /sockjs-node/info?t=1515279507454 HTTP/1.1" 500 595 "http://localhost:8080/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"
unyozi_1    | 

Editar 2: /var/www/content/index.html é um arquivo que existe.

    
por gdbj 06.01.2018 / 22:15

1 resposta

2

O problema está aqui:

    try_files $uri $uri/;

Adicionar / ao final de um argumento em try_files faz com que ele tente essa URL com os caminhos especificados na diretiva index , no seu caso index.html .

Quando você carrega / , try_files tenta primeiro $uri , que não corresponde, então chega a $uri/ e tenta /index.html , que entra novamente no mesmo bloco location . Como index.html não existe, ele chega a $uri/ novamente, volta para tentar /index.html novamente, entra novamente no bloco location e fornece o erro rewrite or internal redirection cycle .

Para corrigir isso, especifique um padrão razoável para quando um arquivo estático não for encontrado no seu try_files . Se você tiver um site somente estático, isso pode ser =404 . Se você for executar um aplicativo da Web, ele poderá ser um local para esse aplicativo. Por exemplo:

    try_files $uri $uri/ =404;        # Static site
    try_files $uri $uri/ /index.php;  # PHP front controller
    try_files $uri $uri/ @uwsgi;      # pass to a named location
    
por 07.01.2018 / 00:32

Tags