Nginx ignorando o pedido HTTP 1.0 do cliente e respondendo pelo HTTP 1.1

7

Estou testando usando nginx/php5-fpm , com o código

<?php

header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found"); 
// also tested: header("Status: 404 Not Found");

echo $_SERVER["SERVER_PROTOCOL"];

E force a usar HTTP 1.0 com o comando curl .

curl -0 -v 'http://www.example.com/test.php'


> GET /test.php HTTP/1.0

< HTTP/1.1 404 Not Found
< Server: nginx
< Date: Sat, 27 Oct 2012 08:51:27 GMT
< Content-Type: text/html
< Connection: close
< 
* Closing connection #0
HTTP/1.0

Como você pode ver, eu já estou solicitando o uso de HTTP 1.0 , mas o nginx me responde com HTTP 1.1

Recompensa

@MaximDounin, @MichaelHampton já forneceu uma resposta para a especificação, obrigado. Eu estou estendendo esta questão um pouco para o futuro leitor:

Q. Quais são as vantagens de responder HTTP 1.1 quando uma solicitação do cliente para o HTTP 1.0? A abordagem adotada pelo Google não deveria ser mais razoável, ou seja, quando o cliente solicita a resposta 1.0 com 1.0?

    
por Ryan 27.10.2012 / 17:16

2 respostas

20

Este é um comportamento normal e esperado, de acordo com a RFC 2616 :

Applications that are at least conditionally compliant with this specification SHOULD use an HTTP-Version of "HTTP/1.1" in their messages, and MUST do so for any message that is not compatible with HTTP/1.0. For more details on when to send specific HTTP-Version values, see RFC 2145.

RFC 2145 expande isso :

An HTTP server SHOULD send a response version equal to the highest version for which the server is at least conditionally compliant, and whose major version is less than or equal to the one received in the request. An HTTP server MUST NOT send a version for which it is not at least conditionally compliant. A server MAY send a 505 (HTTP Version Not Supported) response if cannot send a response using the major version used in the client's request.

An HTTP server MAY send a lower response version, if it is known or suspected that the client incorrectly implements the HTTP specification, but this should not be the default, and this SHOULD NOT be done if the request version is HTTP/1.1 or greater.

O que isso significa em inglês é: Se o cliente envia uma solicitação HTTP / 1.0, uma resposta HTTP / 1.0 ou HTTP / 1.1 é aceitável, mas o HTTP / 1.1 é o preferido.

A razão disso é que uma extremidade pode anunciar a versão mais alta do HTTP que ela pode suportar, para que a outra extremidade possa optar por atualizar seu suporte ao protocolo (se possível). Ambas as extremidades decidirão com qual versão de protocolo podem viver. Esse design também ajuda a lidar com implementações com bugs, como a RFC 2145 afirmou.

Também foi previsto no momento que pode haver outras versões do protocolo HTTP, versões menores e principais, e as regras foram criadas para ajudar a garantir a interoperabilidade. A abordagem ignorante do RFC do Google pode ser interrompida depois que o HTTP / 2.0 é finalizado. (Você sabe disso em seu rascunho como SPDY .)

    
por 27.10.2012 / 18:38
5

Q. What are the advantage of responding HTTP 1.1 when a client request for HTTP 1.0?

Está realmente enviando uma resposta compatível com HTTP / 1.0. Ele não usará nenhum recurso como keepalive que exija HTTP / 1.1.

A razão para fazer isso é porque é uma maneira barata para o servidor dizer:

"hey, I know you sent me a request using HTTP/1.0, but just to let you know I AM capable of HTTP/1.1. and here's the response to your original request: [..]"

(Nota: Se o servidor suportasse um HTTP / 1.8 fictício, ele responderia com isso.)

Isso economiza uma solicitação adicional em algumas situações. Se você precisar obter 3 URIs diferentes de um servidor, poderá enviar o primeiro como HTTP / 1.0 e, em seguida, mover para a versão mais alta que você e o servidor suportam para as solicitações subsequentes.

    
por 15.11.2012 / 12:08