web-dev-qa-db-fra.com

Le numéro de port est-il requis dans le paramètre d'en-tête HTTP "Host"?

Supposons que je fasse une requête HTTP à: foosite.com mais que le port auquel j'ai envoyé la demande est 6103 et que je NE Mets PAS ce port dans l'en-tête Host, par exemple:

GET /barpage HTTP/1.1
Host: foosite.com
Method: GET

Le serveur http doit-il alors reconnaître que j'essaie de lui parler sur le port 6103? Ou, puisqu'il a été omis dans l'en-tête de la demande, est-ce que je parie si le serveur le reconnaît réellement?

Je pose cette question pour dire ceci: j'ai constaté que les navigateurs, au moins firefox + chrome, mettaient le port dans l'en-tête Host. Mais l'application Java que j'utilise ne fonctionne pas. Et lorsque le port n'est pas passé dans la Host, le serveur répond en pensant que je suis sur le port 80. Alors, de qui ai-je besoin pour blaireau? L'opérateur de serveur, ou le programmeur Java?

44
Jon Mabe

Voir la section 14.23 de la spécification HTTP qui spécifie que le numéro de port doit être inclus s'il ne s'agit pas du port 80 par défaut.

50
superfell

MIS À JOUR pour les navigateurs modernes:

Les navigateurs (et curl) n’ajouteront le port que s’il ne s’agit pas du port standard, comme requis par le HTTP spec et notés dans @ superfell's answer .

Les navigateurs d’aujourd’hui (2013) jetteront en fait strip le port de l’en-tête de l’hôte lorsque le port est standard (http port 80, port https 443). Certains clients, qui utilisent leur propre méthode, telle que Baidu Spider, incluent le numéro de port même lorsque le port est 80 .

Que ce soit approprié ou non, je ne sais pas. La spécification n'indique pas s'il est correct ou non d'inclure le numéro de port lorsque le port utilise IS la valeur par défaut.

Pour répondre à votre commentaire , les serveurs feront tout ce qui est nécessaire pour se conformer à la spécification, et la spécification ne suggère que les cas où cela est nécessaire. C'est pourquoi j'estime que ce n'est pas vraiment une question de gestion du serveur, mais bien de la manière dont le client envoie la demande: inclut ou non le numéro de port dans l'en-tête de l'hôte.

6
Gaia

Exemples d'en-têtes d'une demande réelle adressée à un serveur, espérons-le, inexistant ' http://myhost.com:3003/content/page.htm '

Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: en-US;q=0.9,en;q=0.8,nb;q=0.7,de;q=0.6
Connection: keep-alive
Host: myhost.com:3244
Referer: http://myhost.com:3244/content/page.htm

La RFC https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html nécessite une formation en lecture.

Section 14:24 pas si facile de traduire tous les éléments à la simple réalité:

Host = "Host" ":" Host [ ":" port ] ;
0
flodis

Le RFC2616 indique que

Un "hôte" sans aucune information de port de fin implique la valeur par défaut port pour le service demandé (par exemple, "80" pour une URL HTTP). Pour Par exemple, une demande sur le serveur d'origine pour http://www.w3.org/pub/WWW/ inclurait correctement:

GET /pub/WWW/ HTTP/1.1
Host: www.w3.org

Cela signifie que https://example.com n'aurait pas besoin d'un port de fin également, car le port par défaut est connu pour https. J'ai vérifié les demandes HTTP de Firefox, Chrome et Edge et j'ai constaté qu'aucune d'entre elles n'avait ajouté le numéro de port de l'en-tête Host lorsque le protocole de domaine était https. Bien sûr, le numéro de port est ajouté lorsque le numéro de port a également été ajouté à l'URL. Les captures d'écran ci-dessous proviennent de Google Chrome

 Host header for a HTTP 1.1 request using https procotole  Host header for a HTTP 1.1 resquest using a https with a port number in the URL

0
Nicolas Guérinet