À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 a mesma solicitação com o Postman, 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"
que é 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
...
}
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, habilitei o encaminhamento de http para https, juntamente 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, passaria primeiro 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, mashttps://<mydomain>/js/czjl.js
o acesso registrará um HTTP 404.A maneira como a chamada da web para
http://<mydomain>/js/czjl.js
é criada também determinará se apenas um HTTP 301 é registrado ou se um HTTP 301 é registrado imediatamente seguido por um HTTP 404. Por exemplo, usar estewget
comando aciona um HTTP 301 nos logs do meu servidor da web sem um HTTP 404 subsequente:Se eu deixar de fora a
--max-redirect=0
opção, os logs exibem o HTTP 301 seguido por um HTTP 404. No entanto, ao ignorar os redirecionamentos, a solicitação wget foi atendida após obter a resposta HTTP 301 do servidor web. Suspeito que esses usuários finais estejam usando uma opção semelhante "sem redirecionamentos" em suas chamadas da Web, o que resulta no HTTP 301 ocasional para um recurso inexistente. Caso contrário, nossos servidores web teriam registrado um HTTP 404 após o HTTP 301.