Nginx ignoriert die HTTP 1.0-Anforderung des Clients und antwortet mit HTTP 1.1

8

Ich teste nginx/php5-fpmmit dem Code

<?php

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

echo $_SERVER["SERVER_PROTOCOL"];

Und erzwingen Sie die Verwendung von HTTP 1.0 mit dem curlBefehl.

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

Wie Sie sehen HTTP 1.0, fordere ich bereits die Verwendung von an , aber nginx antwortet mir mitHTTP 1.1

Kopfgeld

@MaximDounin, @MichaelHampton hat bereits eine Antwort auf die Spezifikation gegeben, danke. Ich erweitere diese Frage ein wenig für den zukünftigen Leser:

Frage: Was ist der Vorteil einer Antwort auf HTTP 1.1, wenn ein Client HTTP 1.0 anfordert? Sollte der Ansatz von Google nicht vernünftiger sein, dh wenn der Client 1.0 anfordert, mit 1.0 antworten?

Ryan
quelle

Antworten:

20

Dies ist normales und erwartetes Verhalten gemäß RFC 2616 :

Anwendungen, die dieser Spezifikation zumindest bedingt entsprechen, MÜSSEN in ihren Nachrichten eine HTTP-Version von "HTTP / 1.1" verwenden und MÜSSEN dies für alle Nachrichten tun, die nicht mit HTTP / 1.0 kompatibel sind. Weitere Informationen zum Senden bestimmter HTTP-Versionswerte finden Sie in RFC 2145.

RFC 2145 erweitert dies :

Ein HTTP-Server SOLLTE eine Antwortversion senden, die der höchsten Version entspricht, für die der Server mindestens bedingt kompatibel ist und deren Hauptversion kleiner oder gleich der in der Anforderung empfangenen Version ist. Ein HTTP-Server darf KEINE Version senden, für die er nicht mindestens bedingt kompatibel ist. Ein Server kann eine 505-Antwort (HTTP-Version nicht unterstützt) senden, wenn keine Antwort mit der in der Clientanforderung verwendeten Hauptversion gesendet werden kann.

Ein HTTP-Server kann eine niedrigere Antwortversion senden, wenn bekannt ist oder vermutet wird, dass der Client die HTTP-Spezifikation falsch implementiert. Dies sollte jedoch nicht die Standardeinstellung sein. Dies sollte NICHT erfolgen, wenn die Anforderungsversion HTTP / 1.1 oder höher ist.

Auf Englisch bedeutet dies: Wenn der Client eine HTTP / 1.0-Anforderung sendet, ist entweder eine HTTP / 1.0-Antwort oder HTTP / 1.1 akzeptabel, HTTP / 1.1 wird jedoch bevorzugt.

Der Grund dafür ist, dass ein Ende möglicherweise die höchste HTTP-Version ankündigt, die es unterstützen kann, sodass das andere Ende möglicherweise die Protokollunterstützung aktualisiert (falls möglich). Beide Enden entscheiden dann, mit welcher Protokollversion sie beide leben können. Dieses Design hilft auch bei fehlerhaften Implementierungen, wie RFC 2145 feststellte.

Zu dieser Zeit war auch vorgesehen, dass es weitere Versionen des HTTP-Protokolls geben könnte, sowohl kleinere als auch größere Versionen, und die Regeln sollten dazu beitragen, die Interoperabilität sicherzustellen. Der RFC-ignorante Ansatz von Google kann nach Abschluss von HTTP / 2.0 unterbrochen werden. (Sie kennen es in seiner Entwurfsform als SPDY .)

Michael Hampton
quelle
Sie können versuchen , diese: curl -0 -v 'http://www.google.com/foo', curl -v 'http://www.google.com/foo', sie response 1.0 oder 1.1 - Version von 404 korrekt , aber nicht in meinem Fall.
Ryan
Google betreibt einen benutzerdefinierten Webserver und macht, was immer sie wollen. Na und?
Michael Hampton
5
Nein, nginx wird die Antwortversion niemals auf 1.0 herabstufen. Auf der anderen Seite werden keine Protokollfunktionen verwendet, die in HTTP / 1.0 nicht verfügbar sind. Zum Beispiel wird nicht versucht, die Verbindung aufrechtzuerhalten, und es wird keine Chunked-Transfer-Codierung verwendet.
Maxim Dounin
1
@MaximDounin, meinst du, wenn der nginx know client 1.1 nicht unterstützt, sendet er weiterhin eine Antwort als 1.1, jedoch ohne die eigentliche 1.1-Funktion? Wäre es nicht verwirrend?
Ryan
5
Es entspricht RFC 2145 und ermöglicht es Clients, die von einem Server unterstützte HTTP-Version ohne zusätzliche Anforderungen herauszufinden. Möglicherweise möchten Sie RFC 2145 erneut lesen, wenn Sie es dennoch verwirrend finden.
Maxim Dounin
6

Frage: Was ist der Vorteil einer Antwort auf HTTP 1.1, wenn ein Client HTTP 1.0 anfordert?

Es sendet Ihnen tatsächlich eine HTTP / 1.0-kompatible Antwort. Es werden keine Funktionen wie Keepalive verwendet, für die HTTP / 1.1 erforderlich ist.

Der Grund dafür ist, dass der Server auf billige Weise sagen kann:

„Hey, ich weiß , du mich gesandt hat eine Anforderung HTTP / 1.0, aber nur, damit Sie wissen , ich bin der Lage , HTTP / 1.1 und hier ist die Antwort auf Ihre ursprüngliche Anfrage. [..]

(Hinweis: Wenn der Server ein fiktives HTTP / 1.8 unterstützt, würde er damit antworten.)

Dies erspart Ihnen in einigen Situationen eine zusätzliche Anfrage. Wenn Sie 3 verschiedene URIs von einem Server abrufen müssen, können Sie den ersten als HTTP / 1.0 senden und dann auf die höchste Version wechseln, die sowohl Sie als auch der Server für die nachfolgenden Anforderungen unterstützen.

mh.
quelle