2010-07-13 20 views
36

Per quanto ne so, è consentito dalle specifiche HTTP di impostare più di un'intestazione HTTP con lo stesso nome. C'è qualche caso d'uso per farlo (da client a server e viceversa)?Impostare più di un'intestazione HTTP con lo stesso nome?

HTTP 1.1 Section 4.2:

più campi di messaggio-header con stesso campo-nome può essere presente in un messaggio se e solo se l'intero campo-valore per quel campo di intestazione è definito come un elenco separato da virgola [ie, # (valori)]. Esso deve essere possibile combinare le molteplici campi di intestazione in un "field-name: field-value" coppia, senza modificare la semantica del messaggio, aggiungendo ogni successivo campo valore al primo, ciascuna separata da una virgola. L'ordine in cui vengono ricevuti i campi di intestazione con lo stesso campo-nome è quindi significativo per l'interpretazione del il valore del campo combinato, e quindi un proxy NON DEVE cambiare l'ordine di questi valori di campo quando un messaggio è inoltrato.

Se non sbaglio, non è necessario specificare più intestazioni con lo stesso nome.

+3

"Se non sbaglio, non ci sono casi in cui occorrono più intestazioni con lo stesso nome." - Hai ragione, e non è qualcosa su cui mi piacerebbe essere supportato correttamente a seconda di quali tecnologie si trovano tra te e gli header raw. – heisenberg

+5

L'unica volta che ho visto le intestazioni duplicate è per 'Set-Cookie:'. – TRiG

+0

Domanda correlata: [Sono accettabili le intestazioni di risposta HTTP duplicate?] (Http://stackoverflow.com/questions/4371328/are-duplicate-http-response-headers-acceptable). Le intestazioni WebDAV sono [altro esempio] (https://github.com/joyent/node/issues/2750) dei duplicati del nome dell'intestazione. – chrisjleu

risposta

17

Poiché le intestazioni duplicate possono causare problemi con vari server Web e API (indipendentemente da ciò che dice la specifica), dubito che ci sia un caso d'uso generale in cui questa è la migliore pratica. Questo non vuol dire che qualcuno da qualche parte non lo faccia, naturalmente.

+0

Il formato del messaggio e le API hanno requisiti diversi ... –

+0

La politica di sicurezza del contenuto è pensata per gestire più intestazioni. Vedere https://twitter.com/mikewest/status/841892857736765443 dove ciò causa un problema. – oreoshake

4

È consentito solo per le intestazioni che utilizzano un formato molto specifico, vedere RFC 2616, Section 4.2.

+0

Ha affermato chiaramente nella domanda che si rende conto che è permesso, non è quello che sta chiedendo. – heisenberg

+6

Questo collegamento è molto utile. In particolare la parte che le intestazioni appaiono più di una volta, deve anche poter essere rappresentata come una singola intestazione con valori separati da virgole. – nategood

30

È comunemente utilizzato per Set-Cookie:. Molti server impostano più di un cookie.

Ovviamente, è sempre possibile impostarli tutti in un'unica intestazione.

In realtà, penso che non sia possibile impostare più cookie in un'unica intestazione. Quindi questo è un caso d'uso necessario.

Il Cookie spec fa affermazione che è possibile combinare più cookie in un'intestazione stesso modo altre intestazioni possono essere combinati (separati da virgole), ma si osserva inoltre che la sintassi non conformi (come il parametro Expires, che ha , s nel suo valore) sono ancora comuni e devono essere gestiti dalle implementazioni.

Quindi, se si utilizzano i parametri Expires nelle intestazioni Set-Cookie e non si desidera che tutti i cookie scadano contemporaneamente, è probabile che sia necessario utilizzare più intestazioni.

+0

Puoi facilmente impostarli in un'unica intestazione: Set-Cookie: hello = world; concezione = proofed – BronzeByte

+3

Ah, ma puoi impostare i cookie con scadenze diverse nella stessa intestazione? Di ', puoi convertirlo in una sola intestazione? Set-Cookie: nome1 = valore1; Scade = Mer, 22 Feb 2012 17:45:00 GMT Set-Cookie: name2 = value2; Scade = Mer, 09 Jun 2021 10:18:14 GMT – sligocki

+0

Questo salverebbe un cookie nel browser chiamato Scadenza e verrà cancellato dal secondo ..., nel frattempo ho costruito un back-end di sessione lato server, 100% sicuro, super facile e possibile il salvataggio di oggetti Java – BronzeByte

0

Vecchio thread, ma stavo esaminando lo stesso problema. In ogni caso, le intestazioni Accept e Accept-Encoding sono esempi tipici che utilizzano valori multipli, separati da virgola. Anche se si tratta di un'intestazione specifica richiesta, le specifiche non distinguono tra richiesta e risposta a questo livello. Controlla quello da questa pagina. Quello che la specifica dice è che se si hanno virgole come carattere nel valore dell'intestazione, non è possibile utilizzare più intestazioni con lo stesso nome, a meno che non si disambiguano l'uso della virgola.

1

Come stai cercando casi d'uso, forse Accept sarebbe valido.

  • Accept: application/json
  • Accept: application/xml
-1

A mio modesto parere, solo quelle intestazioni, il cui valore può essere espresso (definito) con separati da virgola, può essere scritto in più intestazioni con valori singoli o multipli.

Supponiamo di avere un'intestazione il cui valore può essere scritto in una lista separata da virgole.

Entries-In-Order: Jane,John,Charlie 

Tale valore intestazione è valida dalla sua definizione e il server o il client lo sa. E poi possiamo separarlo come

Entries-In-Order: Jane,John 
Entries-In-Order: Charlie 

Ma qualsiasi intestazione non capisce il valore separato da virgole non può essere scritto in più.

Who-Are-Responsible: John, Jane or maybe Charlie? 

Se, per definizione, il server o il client potrebbe gestire l'intera stringa (John,Jane,maybe Charlie?) come un singolo valore, la scrittura come un più intestazioni non funziona come previsto.

My-Dummy-Header: John 
My-Dummy-header: Jane or maybe Charlie? 
+2

Questa non è la tua opinione, è la ripetizione di informazioni già presenti nella domanda. – hobbs

Problemi correlati