Por que o NGINX retorna 301 para recursos não existentes?

1

Às vezes, esse tipo de linha aparece no meu access.log :

149.28.156.181 - - [13/Sep/2018:20:35:09 +0100] "GET /js/czjl.js HTTP/1.1" 301 184 "-" "Mozilla/5.0 ..."

O recurso /js/czjl.js não existe no meu servidor. No entanto, o NGINX respondeu com 301 em vez de 404. Se eu tentar o mesmo pedido com o Postman eu recebo

192.168.1.67 - - [13/Sep/2018:21:09:34 +0100] "GET /js/czjl.js HTTP/1.1" 404 1140 "-" "PostmanRuntime/7.3.0"

qual é o comportamento esperado.

Por que o NGINX está retornando 301 em vez de 404 se esses recursos não estiverem no meu servidor?

Aqui está minha configuração

server {
    listen 80;

    server_name example.com www.example.com;

    location ~ /.well-known {
        allow all;
    }

    location / {
        limit_except GET {
            deny all;     
        }
        return 301 https://www.example.com$request_uri;
    }

    location ~ /\. { deny all;}

}

server{
    #FOR INTERNAL REQUESTS

    listen 8080;

    server_name 192.168.1.75;
    error_page 401 403 404 /404.html;
    location = /404.html {
            root /var/www/html/error/;
            internal;
    }

    location / {
        limit_except GET {
            deny all;     
        }
    }

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

server {
    listen 443 ssl;

    server_name example.com www.example.com;

    location / {
        limit_except GET {
            deny all;     
        }
    }

    root /var/www/html;
    index index.html;
    error_page 401 403 404 /404.html;
    location = /404.html {
            root /var/www/html/error/;
            internal;
    }

    #SSL Config
    ...
}
    
por Arthur Attout 13.09.2018 / 22:14

1 resposta

2

Eu tive a mesma mensagem de log no meu servidor web Apache. Há dois lados para isso: por que o redirecionamento HTTP 301 está ocorrendo e por que não há uma solicitação HTTP subsequente registrada após o redirecionamento HTTP 301.

No meu servidor web, tenho o encaminhamento habilitado de http para https, junto com o encaminhamento de subdomínio de qualquer subdomínio para o subdomínio correto. Isso significa que qualquer solicitação http ou qualquer solicitação no subdomínio errado, seja para um recurso válido ou inválido, primeiro passará por um redirecionamento HTTP 301. Por exemplo, quando eu acesso http://<mydomain>/js/czjl.js , o Apache registra um HTTP 301 devido ao encaminhamento da solicitação http para https primeiro, mas acessar https://<mydomain>/js/czjl.js registrará um HTTP 404.

A maneira como a chamada da Web para http://<mydomain>/js/czjl.js é criada também determina se apenas um HTTP 301 é registrado ou se um HTTP 301 é registrado imediatamente seguido por um HTTP 404. Por exemplo, usar este comando wget aciona um HTTP 301 no meu servidor da web registra sem um HTTP 404 subseqüente:

wget --max-redirect=0 http://<mydomain>/js/czjl.js

Se eu deixar de fora a opção --max-redirect=0 , os logs exibirão o HTTP 301 seguido por um HTTP 404. No entanto, ao ignorar redirecionamentos, a solicitação do wget foi atendida após obter a resposta HTTP 301 do servidor da web. Eu suspeito que esses usuários finais estão usando uma opção similar "sem redirecionamentos" em suas chamadas pela web, o que resulta no ocasional HTTP 301 para um recurso inexistente. Caso contrário, nossos servidores da web teriam registrado um HTTP 404 após o HTTP 301.

    
por 14.09.2018 / 04:25

Tags